您如何解决:“ AttributeError:“边界”对象没有属性“ rect””?

时间:2019-08-09 22:10:36

标签: pygame python-3.7.4

我正在制作一个平台游戏,在游戏的开始阶段有一个边界,所以玩家不能无缘无故地一直向左走。我决定创建一个名为boundary的类,并将其添加到规则无法通过的列表中。但是,我不断收到此错误: “ AttributeError:“边界”对象没有属性“ rect””。谁能解决这个问题?同样,一种更好的方法也将被接受。谢谢!

class Boundary(pygame.sprite.Sprite):

    def __init__(self):
        super().__init__()
        self.boundary = pygame.Surface([15,600])  
        self.boundary.fill(WHITE)
        self.boundary.set_colorkey(WHITE)
        self.boundary_rect = 
        self.boundary.get_rect()
        self.boundary_rect.x = -50
        self.boundary_rect.y = 0


class Level01(Level):

    def __init__(self, player):
        Level.__init__(self, player)

    level_boundary = [Boundary()]

    for _ in level_boundary:
        boundary = Boundary()
        boundary.player = self.player  
        self.platform_boundary_list.add
                                    (boundary)


class Player(pygame.sprite.Sprite):
    def__init__(self):
        super().init()

        self.rect.x += self.change_x
        block_hit_list = pygame.sprite.spritecollide(self, 
                 self.level.platform_boundary_list, False)
        for block in block_hit_list:
            if self.change_x > 0:
                self.rect.right = block.rect.left
            elif self.change_x < 0:
                self.rect.left = block.rect.right


        self.rect.y += self.change_y
        block_hit_list = pygame.sprite.spritecollide(self, 
                 self.level.platform_boundary_list, False)
        for block in block_hit_list:
            if self.change_y > 0:
                self.rect.bottom = block.rect.top
            elif self.change_y < 0:
                self.rect.top = block.rect.bottom

            self.change_y = 0

1 个答案:

答案 0 :(得分:1)

还没有运行代码,但是错误消息似乎是合理的。您的Boundary类具有属性boundary_rect而不是rect(似乎不是pygame的Sprite类直接暴露的属性)。将block.rect替换为block.boundary_rect应该可以解决此问题。

更新: 查看您的代码,我发现了几个问题,PlayerBoundary类都引用了不直接属于其父rect的{​​{1}}属性。根据您的评论,我决定将代码重写为演示冲突测试,以不仅修复错误,还提供一些想法,供您考虑如何组织代码。

演示非常简单;一个玩家和一堆随机块被绘制到屏幕上。播放器块在屏幕边缘附近反弹,并且碰撞的块以不同的颜色重新绘制。结果如下:

enter image description here

这是上面演示的代码。我添加了一堆注释来阐明代码的作用。如果有任何不清楚的地方,请通知我:

pygame.sprite.Sprite