如何在pygame中制作动画

时间:2019-01-13 06:36:45

标签: python animation pygame

我正在尝试制作动画,说明玩家何时被射中,以使其看起来好像跌倒了。

我尝试了下面的代码,但这似乎不起作用。它会减慢帧的播放速度,只显示动画的最后一张图像,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)

是否具有制作图像序列或类似图像的功能?

1 个答案:

答案 0 :(得分:1)

好的,因此对于动画,您需要一堆图像和一个计时器。

我要介绍一些基于pygame精灵的代码段。也许这并不完全适合这个问题,但是与手动绘制/涂抹图像相比,这似乎是一个更好的解决方案。

所以首先,代码以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() )

因此,想法是Alien Sprite具有“正常”图像,但是随后当其“扭曲”(传送)时播放动画。该方法的实现是获取动画图像列表。动画开始时,子画面的imagebase_image变为warp_images[]的第一个。随着时间的流逝,子画面图像会先更改为下一帧,然后再转换为下一帧,最后再返回到基本图像。通过将所有这些内容嵌入到sprite update()函数中,sprite的常规更新机制可以处理外来sprite,normal或“ warp”的当前“状态”。一旦触发了“扭曲”状态,它将在pygame主循环没有任何额外参与的情况下运行。

def update(self):
    # Get the current time in milliseconds (normally I keep this in a global)
    NOW_MS = int(time.time() * 1000.0)
    # Did the alien warp? (and at what time)
    if (self.warp_at_time > 0):
        # 3 Frames of warp animation, show each for 200m
        ms_since_warp_start = NOW_MS - self.warp_at_time
        if ( ms_since_warp > 600 ):
            # Warp complete
            self.warp_at_time = 0
            self.image = self.base_image  # return to original bitmap
            # Move to random location
            self.rect.center = ( random.randrange( 0, WINDOW_WIDTH ), random.randrange( 0,  WINDOW_HEIGHT ) )
        else:
            image_number = ms_since_warp // 200  # select the frame for this 200ms period
            self.image = self.warp_images[image_number] # show that image

def startWarp(self):
    # Get the current time in milliseconds (normally I keep this in a global)
    NOW_MS = int(time.time() * 1000.0)
    # if not warping already ...
    if (self.warp_at_time == 0):
        self.warp_at_time = NOW_MS

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

在精灵中,我们有3帧动画,每帧之间有200毫秒。要启动Sprite动画,只需调用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

很明显,所有这些帧定时和什么都不应该是sprite类的成员变量,但是我没有这样做,只是为了使示例简单。