如何让Pygame中玩家死亡动画停留在最后一帧?
解决死亡动画无法停留在最后一帧的问题
问题根源
- 原代码使用
pg.time.get_ticks() % (3 * death_duration)做时间计算,会让时间在0~1200ms之间循环,导致frame_index反复回到0,动画无限循环。 - 你尝试的
last_image是函数局部变量,每次调用函数都会被重置为False,根本无法触发最后一帧的逻辑。
解决方案
通过给Player类添加实例级状态变量,持久化动画完成状态,并改用「死亡开始时间的相对时长」计算帧索引,避免时间循环。
第一步:修改Player类初始化
在__init__中添加两个状态变量:
class Player(pg.sprite.Sprite): def __init__(self...): self.last_moved = '' self.death_animation_completed = False # 标记动画是否已完成 self.death_start_time = None # 记录死亡动画启动的时间点
第二步:重写死亡动画函数
def draw_player_death_animation(self): self.is_player_image = False self.movement_speed = 0 # 动画已完成,直接固定显示最后一帧 if self.death_animation_completed: self.last_moved = self.player_image_death_final return # 首次调用时,记录死亡动画启动时间 if self.death_start_time is None: self.death_start_time = pg.time.get_ticks() death_duration = 400 # 计算从死亡动画启动到现在的时长 elapsed_time = pg.time.get_ticks() - self.death_start_time frame_index = elapsed_time // death_duration if frame_index == 0: self.last_moved = self.player_image_death_1 elif frame_index == 1: self.last_moved = self.player_image_death_2 elif frame_index >= 2: # 到达最后一帧,标记动画完成 self.last_moved = self.player_image_death_final self.death_animation_completed = True
核心逻辑说明
- 用
death_animation_completed实例变量保存状态,不会随函数调用重置,一旦标记为True,后续直接显示最后一帧。 - 用
death_start_time记录动画启动时刻,计算相对时长elapsed_time,避免了取模导致的时间循环问题。 - 当
frame_index >=2时,直接触发最后一帧并锁定状态,动画不再循环。
内容的提问来源于stack exchange,提问作者Petras Anskaitis
相关产品推荐
相关产品推荐

