每次出现在 pygame 中时,动画的持续时间都会加倍

Posted

技术标签:

【中文标题】每次出现在 pygame 中时,动画的持续时间都会加倍【英文标题】:Animation doubles duration every time it appears in pygame 【发布时间】:2021-07-24 09:45:39 【问题描述】:

我对编码还很陌生,我正在使用 pygame 开发一个小游戏。我有一个用于爆炸动画的精灵,第一次出现时它对整个游戏都很好,但是一旦你玩第二或第三场游戏,即使每次游戏重新开始时我都清空精灵组,每次爆炸都会持续更多,我认为问题可能是爆炸更新功能对一个以上的游戏效果不佳,但我真的不知道如何修复它。提前感谢您的帮助!

class Explosion(pygame.sprite.Sprite):
    
    expl_img = []
    def __init__(self, center):
        pygame.sprite.Sprite.__init__(self)
        self.image = self.cargaImagenes()
        self.rect = self.image.get_rect()
        self.rect.center = center
        self.frame = 0
        self.last_update = pygame.time.get_ticks()
        self.frame_rate = 50
        
    def update(self):
        now = pygame.time.get_ticks()
                
        if now -self.last_update > self.frame_rate:
            self.last_update = now
            self.frame +=1
            if self.frame == len(self.expl_img):
                self.kill()
                
            else:
                center = self.rect.center
                self.image = self.expl_img[self.frame] 
                self.rect = self.image.get_rect()
                self.rect.center = center
    
    
    def cargaImagenes(self):
        for i in range(9):
            filename = 'regularExplosion0.png'.format(i)
            img = pygame.image.load(path.join(img_dir, filename)).convert()
            img.set_colorkey(BLACK)
            img_def = pygame.transform.scale(img, (75, 75))
            self.expl_img.append(img_def)
        return self.expl_img[0]

这里是爆炸出现的地方:

            if self.player.estado == self.player.Estado.volando:
                anticolision = False
                colisiones = pygame.sprite.spritecollide(self.player, self.asteroides, True, pygame.sprite.collide_circle)
                
                for colision in colisiones:
                    
                    start_ticks = pygame.time.get_ticks()                  
                    if colision and not anticolision:
                        anticolision = True 
                        print("anticolision true")                        
                        expl = Explosion(colision.rect.center)
                        self.explosionSound.play()
                        self.all_sprites.add(expl)                  
                        self.vidas -= 1
                        segundos = (pygame.time.get_ticks()-start_ticks)/1000
                        if segundos > 3:
                            anticolision = False
                            print("anticolision false")
                    elif colision and anticolision:
                        pass

                    if self.vidas == 0:     
                        self.gameOver()
                        running= False

【问题讨论】:

如何开始爆炸?您是否创建了Explosion 的新实例?如果不是,你必须在爆炸开始时设置self.last_update = pygame.time.get_ticks() 每次发生碰撞时我都会创建一个新的爆炸实例,我会编辑问题给你看 【参考方案1】:

每次创建Explosion 的新实例时都会调用self.cargaImagenes()。因此类变量expl_img 中的元素数量不断增长。仅当列表为空时才向列表中添加新项目:

class Explosion(pygame.sprite.Sprite):
    
    expl_img = []

    # [...]

    def cargaImagenes(self):
  
        if not expl_img:                   # <---
            for i in range(9):
                filename = 'regularExplosion0.png'.format(i)
                img = pygame.image.load(path.join(img_dir, filename)).convert()
                img.set_colorkey(BLACK)
                img_def = pygame.transform.scale(img, (75, 75))
                self.expl_img.append(img_def)

        return self.expl_img[0]

【讨论】:

以上是关于每次出现在 pygame 中时,动画的持续时间都会加倍的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI动画视图出现在ZStack中时出现奇怪的过渡

为啥 PyGame 动画闪烁

当视图出现在 SwiftUI 中时禁用动画

每次在 jquery 中调用此函数时,如何添加自定义动画持续时间

ListView 动画未正确缩放

用python的pygame,但每次程序一运行,pygame window窗口能出现,但是下图这种状态。