Generator 适合作为前端游戏精灵动画的“状态步进控制器”,通过 yield 封装帧状态、rAF 驱动 next() 实现精准节奏控制,支持暂停恢复、变速、中断重置及与状态机协同管理复杂行为。

Generator 在前端游戏开发中适合做精灵动画的“状态步进控制器”,它让动画帧切换逻辑更清晰、可暂停、可恢复,且避免深层回调嵌套。
用 Generator 管理动画帧序列
把每一帧的渲染动作(如更新 position、textureIndex、触发 DOM 更新)封装为 yield 语句,让 Generator 每次调用 next() 推进一帧。这样动画不再是靠 setInterval 或 requestAnimationFrame 的粗粒度驱动,而是由逻辑主动控制节奏。
- 定义一个生成器函数,按顺序 yield 每帧的状态对象(如
{ x: 10, y: 20, frame: 0 }) - 在游戏主循环中调用
animGen.next(),拿到当前帧数据后更新精灵 DOM 或 Canvas 绘图 - 遇到条件分支(如跳跃中不播放行走帧),可用
if+yield动态跳过或插入帧
配合 requestAnimationFrame 实现平滑步进
Generator 本身不处理时间,需结合 rAF 控制实际执行时机。每次 rAF 回调里调用一次 next(),就能保证每帧严格按屏幕刷新节奏推进,避免丢帧或超速。
- 不要在 Generator 内部写
await delay()—— 那会阻塞主线程;应由外部调度器决定何时 next - 可封装一个
stepAnimator(gen)函数,在 rAF 中安全调用并监听done状态结束动画 - 若需变速(如加速奔跑),只需调整 rAF 调用频率,Generator 内部逻辑完全不变
支持中断、重置与状态复用
Generator 对象保留执行上下文,天然支持暂停/恢复。比如角色被击中时暂停行走动画,播放受击帧后再从原位置继续。
立即学习“Java免费学习笔记(深入)”;
- 保存当前 Generator 实例引用,随时调用
gen.next()恢复;调用gen.return()可提前退出并清理资源 - 多个精灵共用同一组动画 Generator(如通用 idle 动画),传入不同参数(speed、loop)生成独立实例
- 用
gen.throw(error)注入异常,例如加载纹理失败时跳转到 error 帧,增强健壮性
与状态机协同管理复杂行为
单个 Generator 适合线性动画(如攻击挥剑三帧),但完整角色行为需状态机(idle/walk/jump/attack)。这时让每个状态返回自己的 Generator,状态切换时销毁旧生成器、启动新生成器。
- 状态机的每个
enter()方法返回一个 Generator,代表该状态下的动画流程 - 主循环只负责调用当前状态的 Generator.next(),不关心内部实现
- 例如 jump 状态可 yield 上升帧 → 滞空帧 → 下落帧 → 着地帧,着地后自动触发状态切换回 idle



















