如何在Pygame中为Player类添加多套动画并通过不同按键触发切换?
实现方案
核心思路是给Player类新增动画状态标记和分动作存储的动画帧列表,按键触发时切换对应状态,update方法根据当前状态选择对应动画帧播放。
前置准备
提前准备好对应动作的序列帧素材,比如待机动画Idle1.png~Idle4.png、跳跃动画Jump1.png~Jump3.png,放到原跑步帧的同目录下。
代码修改步骤
- 修改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()
- 重写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
- 修改主循环的按键触发逻辑,绑定跳跃按键切换状态
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
相关产品推荐
相关产品推荐

