Pygame 如何使用行走动画

5 投票
3 回答
10892 浏览
提问于 2025-04-18 11:05

当我向上、向下、向左或向右走的时候,我希望有3张图片能随着我走的方向一起播放。

player = pygame.image.load('data/down1.png')

playerX = 610
playerY = 350

while 1:
    clock.tick(30)

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            return
        if event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE:
            return
        if event.type == pygame.KEYDOWN and event.key == pygame.K_DOWN:
                player = pygame.image.load('data/down1.png')
                player = pygame.image.load('data/down2.png')
                player = pygame.image.load('data/down3.png')
                playerY = playerY + 5

        screen.fill((0, 0, 0))
        screen.blit(player, (playerX, playerY))

        pygame.display.flip()

(顺便说一下,这段代码是我代码的一部分)所以有没有办法让我在向下走的时候播放一组走路向下的动画图片呢?

3 个回答

1

这比你想的要复杂。

你需要把图片放在一个列表里(而不是放在一个变量 player 里面)。
你需要一个变量 walking = True。 如果 walking == True,那么就从列表中显示下一张图片,并且把 playerY 的值加1(也就是 playerY = playerY + 1)。
在下一次循环中,重复这个过程,直到角色移动到预期的位置。然后把 walking = False

我可以检查这个,但它看起来会更像这样:

player_images = []
player_images.append( pygame.image.load('data/down1.png') )
player_images.append( pygame.image.load('data/down2.png') )
player_images.append( pygame.image.load('data/down3.png') )
player_current = 0
player = player_images[ player_current ]

playerX = 610
playerY = 350

walking = False
walking_steps = 0

while True:

    # --- FPS ---

    clock.tick(30)

    # --- events ---

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            return
        if event.type == pygame.KEYDOWN:
           if event.key == pygame.K_ESCAPE:
               return
           elif event.key == pygame.K_DOWN:
               walking = True
               walking_steps = 5

    # --- moves ---    

    if walking == True:
        # here you need to check some counter 
        # if it is time for next step to walk slower
        # but don't use `time.sleep()`
        if walking_steps > 0:
            player_current = (player_current + 1) % len(player_images)
            player = player_images[ player_current ]
            playerY = playerY + 1
            walking_steps -= 1
        else:
            walking = False

    # --- draws ---

    screen.fill((0, 0, 0))
    screen.blit(player, (playerX, playerY))

    pygame.display.flip()
3

简而言之:你得自己做动画

你在那段代码里做的只是加载了3张图片,第三张图片被显示出来是因为它最后覆盖了player这个变量。你需要设置一个动画循环,这个过程比较复杂,不太适合在StackExchange上简单回答。

不过,下面是大致的思路,希望你能找到更完整的教程:

  1. 为每个移动方向创建一组精灵。这一步应该在主循环之外完成。
  2. 你的事件处理程序只需要处理精灵的位置和状态(比如“向上移动”或“向下移动”)。
  3. 在你的主循环里,但在事件处理程序的if语句之外,检查玩家的移动状态。这决定了你将使用哪一精灵。
  4. 最后,确定应该显示的“下一个”精灵并展示它。注意:要考虑你的帧率,计算每个精灵应该显示多少帧。在你的情况下,每帧是1/30秒,所以每个精灵可能显示5到10帧?

这只是一个非常简单的概述,所以准备好在过程中学习更多。这可能也是一种效率很低的方法,但在你需要优化之前(比如游戏卡顿的时候)不必太担心。祝你好运!

10

你可以用这些名字来创建一个循环缓冲区。

images = ['data/down1.png','data/down2.png','data/down3.png']

然后再改变一个计数器。

...

if event.type == pygame.KEYDOWN and event.key == pygame.K_DOWN:
    player = pygame.image.load(images[counter])
    counter = (counter + 1) % len(images)
    playerY = playerY + 5
...

当按钮被按下的时候,它会改变图像。

撰写回答