0

我正在使用 Livewires 和 pygame,我在游戏中给你额外生命的一个物体被误认为是小行星物体,当额外生命物体与玩家碰撞时,它返回“额外生命物体没有属性 handle_caught”错误消息,所以我可以请一些帮助。

class Extralives(games.Sprite):
global lives

image = games.load_image('lives.png', transparent = True)
speed = 2

def __init__(self,x,y = 10):
    """ Initialize a asteroid object. """
    super(Extralives, self).__init__(image = Extralives.image,
                                x = x, y = y,
                                dy = Extralives.speed)
def update(self):
    """ Check if bottom edge has reached screen bottom. """
    if self.bottom>games.screen.height:
        self.destroy()

    self.add_extralives

def add_extralives(self):
    lives+=1

小行星类:

class Asteroid(games.Sprite):
global lives
global score
"""
A asteroid which falls through space.
"""

image = games.load_image("asteroid_med.bmp")
speed = 1.7

def __init__(self, x,image, y = 10):
    """ Initialize a asteroid object. """
    super(Asteroid, self).__init__(image = image,
                                x = x, y = y,
                                dy = Asteroid.speed)


def update(self):
    """ Check if bottom edge has reached screen bottom. """
    if self.bottom>games.screen.height:
        self.destroy()
        score.value+=10

def handle_caught(self):
    if lives.value>0:
        lives.value-=1
        self.destroy_asteroid()

    if lives.value <= 0:
        self.destroy_asteroid()
        self.end_game()


def destroy_asteroid(self):
    self.destroy()

处理碰撞的播放器类的一部分:

def update(self):
    """ uses A and D keys to move the ship """
    if games.keyboard.is_pressed(games.K_a):
        self.x-=4
    if games.keyboard.is_pressed(games.K_d):
        self.x+=4

    if self.left < 0:
        self.left = 0

    if self.right > games.screen.width:
        self.right = games.screen.width

    self.check_collison()

def ship_destroy(self):
    self.destroy()

def check_collison(self):
    """ Check if catch pizzas. """
    global lives
    for asteroid in self.overlapping_sprites:
        asteroid.handle_caught()
        if lives.value <=0:
            self.ship_destroy()

    for extralives in self.overlapping_sprites:
        extralives.add_extralives()
4

1 回答 1

0

这是你的问题:

for asteroid in self.overlapping_sprites:
    asteroid.handle_caught()
    if lives.value <=0:
        self.ship_destroy()

调用循环变量这一事实asteroid并不意味着它神奇地只会成为一颗小行星。如果你有其他类型的物体可以碰撞,那就不行了!overlapping_sprites都是重叠的精灵,而不仅仅是小行星。在某些时候asteroid是一个ExtraLives对象。当您尝试调用handle_caught()它时,这显然会失败,因为ExtraLives没有handle_caught()方法。

这里最简单的解决方案是在你的类上重命名add_extralives为。毕竟,您正在做同样的事情:处理与对象发生碰撞(或“捕获”)的情况,它只是一种不同类型的对象,因此结果需要不同,您可以通过提供不同的代码来指定。能够通过调用相同的方法(称为“多态性”)来实现完全不同类型的行为是面向对象编程的重点。handle_caughtExtraLives

下面的循环有一个类似的问题,因为您调用add_extralives()的对象可能不是 type ExtraLives。幸运的是,您可以删除此代码,因为您已经通过重命名add_extralives来处理这种情况handle_caught

for extralives in self.overlapping_sprites:
    extralives.add_extralives()
于 2013-10-09T17:35:45.407 回答