【问题标题】:Play animation upon collision with enemy与敌人碰撞时播放动画
【发布时间】:2020-05-22 22:01:53
【问题描述】:

所以我已将图像加载到 pygame 中:

Explosion = [pygame.image.load('Explosion1.png'), pygame.image.load('Explosion2.png'), pygame.image.load('Explosion3.png'), pygame.image.load('Explosion4.png'), pygame.image.load('Explosion5.png'), pygame.image.load('Explosion6.png'), pygame.image.load('Explosion7.png'), pygame.image.load('Explosion8.png'), pygame.image.load('Explosion9.png'), pygame.image.load('Explosion10.png')]

我想,当子弹是一个单独的类,与导弹发生​​碰撞时,它会在子弹和敌人碰撞的位置播放这个动画,我不知道我怎么走这样做?

碰撞脚本(在主循环中):

hits = pygame.sprite.groupcollide(enemies, bullets, True, True)

子弹类:

class Bullet (pygame.sprite.Sprite):
    def __init__ (self, x, y):
        super (Bullet, self).__init__()
        self.surf = pygame.image.load("Bullet.png").convert()
        self.surf.set_colorkey((255,255,255), RLEACCEL)
        self.rect = self.surf.get_rect()
        self.rect.bottom = y
        self.rect.centerx = x
        self.speedx = bullet_speed
    def update(self):
        self.rect.x += self.speedx

        if self.rect.left > SCREEN_WIDTH:
            self.kill()

敌人等级:

class Enemy(pygame.sprite.Sprite):
    def __init__(self):
        super(Enemy, self).__init__()
        self.surf = pygame.image.load("Missiles.png").convert()
        self.surf.set_colorkey((255,255,255), RLEACCEL)
        self.rect = self.surf.get_rect(
            center=(
                random.randint(SCREEN_WIDTH + 20, SCREEN_WIDTH + 100),
                random.randint(0, SCREEN_HEIGHT),
            )
        )
        self.speed = random.randint(Enemy_SPEED_Min, Enemy_SPEED_Max)



    def update(self):
        self.rect.move_ip(-self.speed, 0)
        if self.rect.right < 0:
            self.kill()

如果您需要,所有代码都在这里https://pastebin.com/CG2C6Bkc

提前谢谢你!

【问题讨论】:

    标签: python pygame


    【解决方案1】:

    当它与子弹相撞时,不要摧毁敌人。遍历hits中返回的敌人并开始爆炸动画而不是杀死敌人:

    hits = pygame.sprite.groupcollide(enemies, bullets, True, True)

    hits = pygame.sprite.groupcollide(enemies, bullets, False, True)
    for enemy in hits:
        enemy.start_animation()
    

    将属性animation_countanimation_framesanimation 添加到类Enemy。当爆炸动画开始时,animation 被设置为Trueanimation_frames 控制动画的速度。如果动画开始,则敌人停止移动,并显示Explosion 图像而不是敌人。在动画的最后一张图片显示后,敌人被杀死:

    class Enemy(pygame.sprite.Sprite):
        def __init__(self):
            super(Enemy, self).__init__()
            self.surf = pygame.image.load("Missiles.png").convert()
            self.surf.set_colorkey((255,255,255), RLEACCEL)
            self.rect = self.surf.get_rect(
                center=(
                    random.randint(SCREEN_WIDTH + 20, SCREEN_WIDTH + 100),
                    random.randint(0, SCREEN_HEIGHT),
                )
            )
            self.speed = random.randint(Enemy_SPEED_Min, Enemy_SPEED_Max)
    
            self.animation_count = 0
            self.animation_frames = 10
            self.animation = False
    
        def start_animation(self):
            self.animation = True
    
        def update(self):
    
            if self.animation:
                image_index = self.animation_count // self.animation_frames
                self.animation_count += 1
    
                if image_index < len(Explosion):
                    self.surf = Explosion[image_index]
                    self.rect = self.surf.get_rect(center = self.rect.center)
    
                else:
                    self.kill()
    
            self.rect.move_ip(-self.speed, 0)
            if self.rect.right < 0:
                self.kill()
    

    【讨论】:

    • 它工作了,但它说“TypeError: 'Enemy' object is not callable”。
    • elif event.type == ADDENEMY: new_enemy = Enemy()enemy.add(new_enemy) all_sprites.add(new_enemy)
    • 我把它改成了for enemy, in hits:,上面写着“TypeError: start_animation() missing 1 required positional argument: 'self'”
    • @WilliamWolseley-Charles 当然也必须是enemy.start_animation() 而不是Enemy.start_animation()。注意enemy 不是Enemy 类,它是该类的实例对象。 enemy 它只是一个变量名。您可以使用任何名称(例如hugofoo):for hugo in hits:hugo.start_animation()
    • 成功了!看起来很棒,你最终可能会以这种速度编写整个游戏!
    【解决方案2】:

    好吧,我不想为你做,但我会说一种你可以做到的方法,然后你可以去尝试去做,如果你遇到问题/错误,你可以更新问题并我们可以帮助您。

    我会创建另一个名为 Explosion 的类并给它图像,当你绘制它时,绘制第一张图像,然后更改为第二张,然后绘制那个,然后更改...

    然后在完成后,销毁对象。

    所以,创建类,创建一个 spritegroup,当子弹碰撞时,创建一个新的类实例,给它碰撞的 x 和 y 坐标,每帧更新它,它会绘制所有图像然后毁灭自己

    另外,获取所有图像而不是全部输入的更简单方法是

    Explosion_imgs = [pygame.image.load("explosion" + str(x) + ".png") for x in range(1,11,1)]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-28
      • 2022-01-11
      • 2023-03-23
      • 2021-03-24
      • 2023-03-21
      • 1970-01-01
      相关资源
      最近更新 更多