0

在我的程序中,我的“missilepack”对象被误认为是小行星对象并返回错误“Missilepack 对象没有属性“handle_caught”,我不明白为什么,修复此错误的任何帮助都会很棒。编辑:如果这有助于有人帮助我,这枚导弹似乎被误认为是小行星。

class MissilePack(games.Sprite):
speed = 1.7
image = games.load_image('MissilePack.bmp')
global inventory

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


def update(self):
    """ Check if bottom edge has reached screen bottom. """
    if self.bottom>games.screen.height:
        self.destroy()

def handle_caughtpack(self):
    inventory.append('missile')
    self.destroy.()

发生错误的部分在“asteroid.handlecaught() 位”中

   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()

def check_pack(self):
    for missilepack in self.overlapping_sprites:
        missilepack.handle_caughtpack()

这是我的 Asteroid 类中的 handle_caught() 方法:

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 check_drop(self):
    """ Decrease countdown or drop asteroid and reset countdown. """
    if self.time_til_drop > 0:
        self.time_til_drop -= 0.7
    else:
        asteroid_size = random.choice(images)
        new_asteroid = Asteroid(x = self.x,image = asteroid_size)
        games.screen.add(new_asteroid)

        # makes it so the asteroid spawns slightly below the spawner   
        self.time_til_drop = int(new_asteroid.height * 1.3 / Asteroid.speed) + 1

def drop_missile(self):
    """Randomely drops a missile pack for the player to use"""
    dropmissile = random.randrange(0, 100)
    if dropmissile == 5:
        missilepack = MissilePack(x = self.x)
        games.screen.add(missilepack)
4

1 回答 1

0

It would really be useful to see the code where you put sprites in a group, but I found a problem: When a missile checks for collisions in that way, it will also return that it is colliding with itself. It will try to call the handle_caught method on itself. It is easy to fix this, all you need to do is this:

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

this just makes it ignore collisions with itself.

于 2013-11-23T02:53:24.403 回答