所以我已经将图像加载到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!
先谢谢您!
答案 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_count
,animation_frames
和animation
添加到类Enemy
中。当爆炸动画开始时,将animation
设置为True
。 animation_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)]