如何用pygam制作动画

2024-04-27 00:55:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试制作一个动画,当我的球员被击中时,让它看起来像是在倒地。在

我尝试了下面的代码,但似乎不起作用。它减慢了帧的速度,只显示我动画的最后一个图像在pygame中有没有更简单的动画方式?在

    if player2_hit_sequence == True:
        stage1 = True
        if stage1 == True:
            game_display.blit(dying1_p2, (player2X, player2Y))
            time.sleep(0.2)
            stage1 = False
            stage2 = True
        if stage2 == True:
            game_display.blit(dying2_p2, (player2X, player2Y))
            time.sleep(0.2)
            stage2 = False
            stage3 = True
        if stage3 == True:
            game_display.blit(dying3_p2, (player2X, player2Y))
            time.sleep(0.2)

有没有一个函数可以生成一系列图像或类似的东西?在


Tags: 图像gamefalsetrueiftimedisplay动画
1条回答
网友
1楼 · 发布于 2024-04-27 00:55:47

对于动画,你需要一堆图像和一个计时器。在

我将展示一些基于pygame精灵的代码片段。也许这并不完全符合这个问题,但它似乎是一个比手动绘制/blitting图像更好的解决方案。在

首先,代码从一个sprite类开始:

class AlienSprite(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.base_image = pygame.image.load('alien.png').convert_alpha()
        self.image = self.base_image
        self.rect = self.image.get_rect()
        self.rect.center = ( WINDOW_WIDTH//2, WINDOW_HEIGHT//2 )
        # Load warp animation
        self.warp_at_time = 0
        self.warp_images = []
        for filename in [ "warp1.png", "warp2.png", "warp3.png" ]:
            self.warp_images.append( pygame.image.load(filename).convert_alpha() )

所以我们的想法是外星精灵有一个“正常”的图像,但是当它“扭曲”(传送)时,就会播放动画。实现的方法是有一个动画图像列表。动画开始时,精灵的image将从base_image更改为warp_images[]中的第一个。随着时间的推移,精灵图像会更改为下一帧,然后是下一帧,最后恢复为基础图像。通过将所有这些嵌入到sprite update()函数中,sprite的正常更新机制处理外来精灵的当前“状态”,normal或“warp”。一旦“warp”状态被触发,它将运行而不需要任何额外的pygame主循环的参与。在

^{pr2}$

所以首先要注意的是,update()使用时钟来知道动画开始后经过的毫秒数。为了跟踪时间,我通常在游戏循环中设置一个全局NOW_MS。在

在精灵中,我们有3帧动画,每帧之间有200毫秒。要启动精灵动画,只需调用startWarp(),这显然只是启动计时器。在

SPRITES = pygame.sprite.Group()
alien_sprite = AlienSprite()
SPRITES.add(alien_sprite)

...

# Game Loop
done = False
while not done:
    SPRITES.update()

    # redraw window
    screen.fill(BLACK)
    SPRITES.draw(screen)
    pygame.display.update()
    pygame.display.flip()

    if (<some condition>):
        alien_sprite.startWarp()  # do it

显然,所有那些帧计时&what not应该是sprite类的成员变量,但是我没有这样做以保持示例的简单性。在

相关问题 更多 >