You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Pygame中为Player类添加多套动画并通过不同按键触发切换?

实现方案

核心思路是给Player类新增动画状态标记和分动作存储的动画帧列表,按键触发时切换对应状态,update方法根据当前状态选择对应动画帧播放。

前置准备

提前准备好对应动作的序列帧素材,比如待机动画Idle1.png~Idle4.png、跳跃动画Jump1.png~Jump3.png,放到原跑步帧的同目录下。

代码修改步骤

  1. 修改Player类的__init__方法,拆分不同动作的动画帧存储,新增状态相关变量
class Player(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.movex = 0
        self.movey = 0
        self.frame = 0
        self.ani = 4 # 动画每帧停留计数
        # 不同动作的帧列表
        self.run_frames = []
        self.idle_frames = []
        self.jump_frames = []
        # 加载跑步动画
        for i in range(1, 5):
            img = pygame.image.load(os.path.join('/home/pi/Desktop/Work/Python work/Game/Resources/Sprites/santasprites/png', f'Run{i}.png')).convert()
            img.convert_alpha()
            img = pygame.transform.scale(img, (400, 500))
            img.set_colorkey(BLACK)
            self.run_frames.append(img)
        # 加载待机动画
        for i in range(1, 5):
            img = pygame.image.load(os.path.join('/home/pi/Desktop/Work/Python work/Game/Resources/Sprites/santasprites/png', f'Idle{i}.png')).convert()
            img.convert_alpha()
            img = pygame.transform.scale(img, (400, 500))
            img.set_colorkey(BLACK)
            self.idle_frames.append(img)
        # 加载跳跃动画,根据你的素材帧数调整range范围
        for i in range(1, 4):
            img = pygame.image.load(os.path.join('/home/pi/Desktop/Work/Python work/Game/Resources/Sprites/santasprites/png', f'Jump{i}.png')).convert()
            img.convert_alpha()
            img = pygame.transform.scale(img, (400, 500))
            img.set_colorkey(BLACK)
            self.jump_frames.append(img)
        # 状态与跳跃相关参数
        self.current_state = 'idle'
        self.is_jumping = False
        self.jump_speed = 15
        self.gravity = 0.8
        self.image = self.idle_frames[0]
        self.rect = self.image.get_rect()
  1. 重写update方法,根据当前状态匹配对应动画
def update(self):
    # 水平移动边界判断
    self.rect.x += self.movex
    if self.rect.right > worldx:
        self.rect.right = worldx
    if self.rect.left < 0:
        self.rect.left = 0
    # 跳跃物理逻辑
    if self.is_jumping:
        self.movey += self.gravity
        self.rect.y += self.movey
        # 落地判断,可根据你的背景地面高度调整数值
        if self.rect.y >= 10:
            self.rect.y = 10
            self.is_jumping = False
            self.movey = 0
            # 落地后切换状态
            self.current_state = 'run' if self.movex !=0 else 'idle'
    # 非跳跃状态自动切换跑步/待机
    if not self.is_jumping:
        self.current_state = 'run' if self.movex !=0 else 'idle'
    # 动画帧更新逻辑
    self.frame += 1
    if self.current_state == 'run':
        max_frame = len(self.run_frames) * self.ani -1
        if self.frame > max_frame:
            self.frame = 0
        current_img = self.run_frames[self.frame//self.ani]
    elif self.current_state == 'idle':
        max_frame = len(self.idle_frames) * self.ani -1
        if self.frame > max_frame:
            self.frame = 0
        current_img = self.idle_frames[self.frame//self.ani]
    elif self.current_state == 'jump':
        max_frame = len(self.jump_frames) * self.ani -1
        if self.frame > max_frame:
            self.frame = max_frame # 跳跃动画播完停在最后一帧直到落地
        current_img = self.jump_frames[self.frame//self.ani]
    # 处理左右朝向翻转
    self.image = pygame.transform.flip(current_img, True, False) if self.movex <0 else current_img
  1. 修改主循环的按键触发逻辑,绑定跳跃按键切换状态
if event.key == pygame.K_UP or event.key == ord('w'):
    if not player.is_jumping: # 去掉该行可实现空中二段跳
        player.is_jumping = True
        player.movey = -player.jump_speed
        player.current_state = 'jump'
        player.frame = 0 # 重置帧计数,让跳跃动画从第一帧开始播放

扩展说明

如果要新增攻击、下蹲等其他动作,按照相同逻辑新增对应动作的帧列表、状态枚举,新增按键触发切换状态即可。

内容的提问来源于stack exchange,提问作者Felzeee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 19:12:01