队列系统 · 0.5可视化
让游戏流程清晰到如同水洗过一样!
最近在折腾自己的游戏框架,最初我想把项目流程做成一张流程图——用节点加连线,搞点可视化展示。
实践下来却发现:
- 项目太简单时,画图纯属多余;
- 项目一复杂,连线多到吓死人,根本理不清。
后来试着用了队列,瞬间觉得“真香”!于是干脆在队列上做文章,把整个流程串起来。
举个实际例子:回合制战斗
假设角色 A 攻击怪物 B。
1. 最简流程
A 攻击 B → 造成伤害 → 死亡判定
若 B 没死,继续循环回合。
2. 加一点复杂度:B 有反伤能力
A 攻击 B → 伤害计算 → 死亡判定 → 反伤计算 → 再判定 A 是否被反伤击杀。
3. 再加一点:A 有吸血能力
A 攻击 B → 伤害计算 → 吸血计算 + 反伤计算
问题来了:吸血和反伤谁先算?
如果反伤先算,A 被反到血量归零,还能靠吸血起死回生吗?
4. 再再复杂一点:多段攻击 + 概率吸血
- A 的一次攻击可能是多段的;
- 吸血效果可能是概率触发的。
那么:
- 前几段就击杀敌人时,后续攻击还继续吗?
- 前几段就被反伤弹死时,后续攻击触发的回血能把自己拉回来吗?
老练的开发者会仔细推敲这些细节,但现实往往是——“先这样试试”,几天后让你改机制。
队列机制如何优雅解决?
队列的核心思想很简单:将任务封装、入队、依次执行。
因为任务都在队列里,所以可以方便地插队——这是最强大的功能。
示例队列 ①(吸血无法起死回生)
攻击任务 → 伤害计算 → 反伤计算 → 敌人死亡判定 → 玩家死亡判定 → 吸血计算
吸血在死亡判定之后,所以无法起死回生。
示例队列 ②(吸血先于反伤)
攻击任务 → 伤害计算 → 吸血计算 → 反伤计算 → 敌人死亡判定 → 玩家死亡判定
吸血在反伤之前,先吸血再计算反伤。
示例队列 ③(多轮攻击,允许鞭尸和弹后复活)
攻击任务 → 攻击轮次计数 → 伤害计算 → 反伤计算 → 吸血计算 → 轮次切换任务
(轮次未满时,插入 伤害计算、反伤计算;满了就跳过)→ 死亡判断任务
死亡判断在多轮攻击之后,所以多轮攻击不会中断,允许鞭尸,也可能被弹死后靠后续回血起死回生。
更进一步:任务嵌套与子任务
为了更好地处理插队和清除,我将任务队列本身也设计成任务类,允许一个任务拥有子任务。
这样结构更清晰,也便于批量移除某一条子队列。
举个实际结构:
battle_task
└─ player_turn_task
├─ player_attack
│ ├─ 单段攻击任务
│ │ ├─ damage_task
│ │ │ ├─ (vampire_task 可插入此处)
│ │ │ └─ (反伤 task 可插入此处)
│ │ └─ check_dead_task
│ │ └─ 若敌人死亡 → battle_task 清空
│ │ (非单一敌人时,增加 check_win_task)
│ └─ 段数切换任务
│ └─ 递增段数,未满则再插入一轮单段攻击
└─ turn_switch_task
└─ 切换阵营,插入 player_turn_task 或 enemy_turn_task + turn_switch_task
根据角色是否吸血/敌人是否反伤,
player_attack中会动态插入vampire_task或反伤判定任务。
也可以固定插入,然后在任务内部根据条件跳过。
更复杂的场景也能 Hold 住
在实际工作中,我还遇到过:
- 反击:敌人被攻击后可能触发反击,反击带有攻击附带的各类效果判定,比单纯反伤复杂得多;
- 援击:你攻击时,队友有概率触发援击,帮你补一发。
这些机制在任务队列系统下,都能清晰地拆分和插入。
你只需要考虑 任务拆到什么粒度,以及 在哪个位置插入 即可。
0.5 可视化的含义
任务执行时,每一步的任务树结构都可以通过命令逐步打印出来,运行流程一目了然。
相比传统的流程图,你无法一眼看到完整的全貌,但你可以逐步看到当前正在执行和准备执行的任务——这就是我所说的 “0.5 可视化”。
适用场景
这种方法特别适合:
流程复杂
需要频繁修改机制
希望快速调整执行顺序和插入新逻辑
如果你也在纠结复杂的游戏流程,不妨试试队列思路,或许会让你豁然开朗 
实际工作中,很容易出现这类设计上不明确的问题。虽然这主要是策划的工作,不过往往会因为策划设计时无法预先考虑好具体情况,导致中途要改。 甚至有时候,预先考虑好的机制大家都觉得是对的,但是实际游玩的时候,这种机制玩家不喜欢。