代码之家  ›  专栏  ›  技术社区  ›  Cameron Walker

AttributeError:“pygame。Rect对象没有“up”和“down”属性

  •  0
  • Cameron Walker  · 技术社区  · 6 年前

    我遇到了一个问题,我似乎无法上下移动屏幕上的角色。

    当我运行代码并按下向下键时,出现以下错误:

    AttributeError: 'pygame.Rect' object has no attribute 'down'
    

    当我运行代码并按向上键时,出现以下错误:

    AttributeError: 'pygame.Rect' object has no attribute 'up'
    

    代码:

    import pygame
    
    class Character():
    
        def __init__(self, ai_settings, screen):    
            self.screen = screen
            self.ai_settings = ai_settings   
            self.image = pygame.image.load("character.jpg")
            self.rect = self.image.get_rect()
            self.screen_rect = screen.ge_rect()
            self.rect.centerx = self.screen_rect.centerx
            self.rect.centery = self.screen_rect.centery
            self.center = float(self.rect.centerx)
            self.center1 = float(self.rect.centery)
            self.moving_right = False
            self.moving_left = False
            self.moving_up = False
            self.moving_down = False
    
        def update(self):
            if self.moving_right and self.rect.right < self.screen_rect.right:
                self.center += self.ai_settings.char_speed_factor
            if self.moving_left and self.rect.left > 0:
                self.center -= self.ai_settings.char_speed_factor
            if self.moving_up and self.rect.up < self.screen_rect.up:
                self.center1 += self.ai_settings.char_speed_factor
            if self.moving_down and self.rect.down > 0:
                self.center1 -= self.ai_settings.char_speed_factor
            self.rect.centerx = self.center
            self.rect.centery = self.center1
    
        def blitme(self):
            self.screen.blit(self.image, self.rect)
    

    这只是字符类python文件,而不是主文件。有一个游戏功能文件,它检查键盘输入,然后设置self。将变量移动到True。然后在主文件中调用gamefunctions文件中的定义。我很困惑为什么会发生这种情况,因为我不难让角色左右移动。

    1 回复  |  直到 6 年前
        1
  •  2
  •   Jerrybibo    6 年前

    您的问题存在于代码的这四行中,您在这四行中检查移动和相应的边界冲突:

    class Character():
        # Other methods...
    
        def update(self):
            # Other if clauses...
            if self.moving_up and self.rect.up < self.screen_rect.up:
                self.center1 += self.ai_settings.char_speed_factor
            if self.moving_down and self.rect.down > 0:
                self.center1 -= self.ai_settings.char_speed_factor
            # ...
    

    请注意,您正在比较 up down 的属性 Rect 实际上不存在的对象。也许你是说 top bottom ?

    此外,代码的逻辑不正确。您正在检查 self.rect.bottom 当它向下移动时大于零,但是,为了正确实现边界碰撞机制,您应该检查它是否小于屏幕的高度(我假定为 self.screen_rect.bottom )当它向下移动时。反之亦然 self.rect.top –您应该检查它是否大于零。

    已更正 if 声明:

    # Replaced .up with .top and .down with .bottom
    # Corrected .top and .bottom comparison
    if self.moving_up and self.rect.top > 0:
        self.center1 -= self.ai_settings.char_speed_factor
    if self.moving_down and self.rect.bottom < self.screen_rect.bottom:
        self.center1 += self.ai_settings.char_speed_factor