hitstop是局部时间缩放机制,仅减缓受击角色的逻辑与动画帧率,不影响输入、网络、其他实体;通过独立维护hitstoptimer并缩放其deltatime实现,需同步修正动画、输入暂存与碰撞响应。

Hitstop 是什么,为什么不能直接 sleep()
Hitstop 不是让整个游戏线程暂停,sleep() 会卡死输入、动画、网络同步,甚至触发系统无响应提示。它本质是「局部时间缩放」:只让角色自身(及关联效果)的逻辑和动画帧率临时变慢,其他系统照常运行。关键判断点:你改的是角色的 deltaTime,不是全局时钟。
如何在更新循环中安全注入 Hitstop 时间膨胀
核心是在角色状态机里维护一个 hitstopTimer,并在每帧用它修正本地时间步长:
- 受击瞬间设
hitstopTimer = 0.15f(即 150ms 顿挫),同时标记isHitstopping = true - 每帧更新时,若
isHitstopping为真,则把原本传入动画/位移/攻击判定的deltaTime替换为deltaTime * 0.0f(完全冻结)或deltaTime * 0.2f(慢动作) - 当
hitstopTimer > 0,每帧减去deltaTime;归零后恢复isHitstopping = false
注意:这个修正必须发生在角色自己的 update() 内部,不能影响其他实体——否则敌人也会跟着停顿,破坏打击反馈的聚焦感。
Hitstop 期间怎么处理输入与碰撞
输入要「暂存但不丢弃」,碰撞则需「冻结判定但不冻结位置」:
- 按下攻击键时,即使在 hitstop 中,也应记录
pendingInput.push_back(INPUT_ATTACK),等 hitstop 结束立刻消费 - 物理位置保持不变(因为位移用的是被缩放后的
deltaTime),但碰撞检测仍要执行——否则角色可能穿墙;只是碰撞响应(如弹开、减速)要延迟到 hitstop 结束后才应用 - 避免在 hitstop 中调用
applyKnockback()或修改velocity,否则会导致顿挫结束时位置突变
多对象 Hitstop 同步与性能隐患
单角色 hitstop 很简单,但多人对战或连携技需要小心:
- 服务端绝不模拟 hitstop——它只负责判定命中和发送
HIT_EVENT;所有视觉/节奏效果由客户端自行驱动 - 如果多个角色同时 hitstop(比如双人 combo),不要共用一个计时器;每个角色必须独立维护
hitstopTimer,否则 A 的顿挫会错误拖慢 B 的动作节奏 - 频繁创建/销毁 hitstop 状态易引发内存抖动,建议用对象池管理
HitstopState实例,而非每次 new/delete
最容易被忽略的是动画层叠加:hitstop 期间如果还继续播放受伤动画的帧,而逻辑时间已停,就会出现「嘴型在动、身体不动」的撕裂感——动画播放速率也得用同一套 hitstopTimer 去缩放。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











