爆炸动画的问题

Trouble with explosion animation

这是我的爆炸 class:我觉得我以适当的方式循环浏览列表,但索引永远不会超过 0,除非我最初将其设置为 self.index 的不同内容。在我的游戏循环中,我设置了鼠标检测,当我单击掉落的气球时,图像仅更改为第一张爆炸图片,而不是循环遍历列表中的所有三个 self.red

class Explosion(pygame.sprite.Sprite):
    def __init__(self, x, y):
        pygame.sprite.Sprite.__init__(self)
        self.red = [pygame.image.load('redImg1.png'),pygame.image.load('redImg2.png'),pygame.image.load('redImg3.png')]

        self.index = 0
        self.image = self.red[self.index]
        self.rect = self.image.get_rect()
        self.rect.center = [x, y]
        self.counter = 0

    def update(self):
        self.counter += 1
        explosion_speed = 4
        #update explosion animation
        
        
        if self.counter >= explosion_speed and self.index < len(self.red) - 1:
            self.image = self.red[self.index]
            self.index += 1

        #if the animation is complete, reset animation index
            if self.index >= len(self.red) - 1 and self.counter >= explosion_speed:
                self.kill()

我为我的爆炸​​制作了一个精灵组 class 这是它在主游戏循环中的实现。

explosion_group=pygame.sprite.Group()
screen.blit(pygame.image.load("background.jpg"),(0,0))
def start():
    
    balloongroup.empty()
    allsprites.empty()
   
    while True:
        for event in pygame.event.get():
            if event.type==QUIT:
                return
            if event.type==pygame.MOUSEBUTTONDOWN:
                pos = pygame.mouse.get_pos()
                explosion = Explosion(pos[0], pos[1])
                
                allsprites.add(explosion)
                explosion_group.update()

您必须将精灵添加到 explosion_group。爆炸在连续帧中进行动画处理。因此必须在应用程序循环中调用​explosion_group.update()

run = True
while run:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False
        if event.type == pygame.MOUSEBUTTONDOWN:
            explosion = Explosion(event.pos[0], event.pos[1])
            explosion_group.add(explosion)
            allsprites.add(explosion)
            
    explosion_group.update() 

    # [...]

kill 永远不会被调用。 update 需要重新设计:

class Explosion(pygame.sprite.Sprite):
    # [...]

    def update(self):
        self.counter += 1
        explosion_speed = 4
        if self.counter >= explosion_speed:
            self.index += 1
            self.counter = 0

        if self.index < len(self.red):
            self.image = self.red[self.index]
        else:
            self.kill()

我建议限制每秒的帧数。使用 pygame.time.Clock 控制每秒帧数,从而控制游戏速度。

方法tick() of a pygame.time.Clock object, delays the game in that way, that every iteration of the loop consumes the same period of time. See pygame.time.Clock.tick():

This method should be called once per frame.

例如:

clock = pygame.time.Clock()
while True:
    clock.tick(60)

最小示例:

import pygame

class Explosion(pygame.sprite.Sprite):
    def __init__(self, x, y):
        pygame.sprite.Sprite.__init__(self)
        #self.red = [pygame.image.load('redImg1.png'),pygame.image.load('redImg2.png'),pygame.image.load('redImg3.png')]
        self.red = img_list
        self.index = 0
        self.image = self.red[self.index]
        self.rect = self.image.get_rect()
        self.rect.center = [x, y]
        self.counter = 0

    def update(self):
        self.counter += 1
        explosion_speed = 2
        if self.counter >= explosion_speed:
            self.index += 1
            self.counter = 0

        if self.index < len(self.red):
            self.image = self.red[self.index]
        else:
            self.kill()

pygame.init()
window = pygame.display.set_mode((400, 400))
clock = pygame.time.Clock()

img_list = []
for i in range(0, 250, 10):
    img_list.append(pygame.Surface((80, 80), pygame.SRCALPHA))
    pygame.draw.circle(img_list[-1], (255, 255-i, 0), (40, 40), round(1 + 39 * (250-i) / 250))
explosion_group = pygame.sprite.Group()

run = True
while run:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False
        if event.type == pygame.MOUSEBUTTONDOWN:
            explosion = Explosion(event.pos[0], event.pos[1])
            explosion_group.add(explosion)
            #allsprites.add(explosion)
            
    explosion_group.update() 
            
    window.fill(0)
    explosion_group.draw(window)
    pygame.display.flip()
    clock.tick(100)

pygame.quit()
exit()