与敌人碰撞时播放动画

时间:2020-05-22 22:01:53

标签: python pygame

所以我已经将图像加载到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

先谢谢您!

2 个答案:

答案 0 :(得分: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()

答案 1 :(得分:0)

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

我将创建另一个名为Explosion的类,并为其提供图像,当您绘制图像时,先绘制第一个图像,然后更改为第二个图像,然后再绘制一个图像,然后更改...

然后在完成后销毁对象。

因此,创建类,创建一个精灵组,当子弹碰撞时,创建该类的新实例,为其指定碰撞的x和y坐标,每帧更新一次,它将绘制所有图像然后自我毁灭

还有一种更简单的方法来获取所有图像,而不是全部输入图像

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