游戏流程与生命周期文档
目录
GameInstance 状态机
GameInstance.LifecycleState 定义了游戏实例的全生命周期:
状态方法速查:
| 状态 | isActive() | supportsGameplay() |
|---|---|---|
| INITIALIZING | true | false |
| PREPARED | true | true |
| START_PENDING | true | true |
| RUNNING | true | true |
| STOPPING | false | false |
| ENDED | false | false |
完整游戏流程
单人游戏启动时序
主游戏循环
game() 方法每 tick(约 50ms)由 BukkitTask 调用:
判定流水线(单个 NoteObject)
结束流程
正常结束时序
强制结束(forceEnd)
restart() 重启流程
- 仅单人局允许
restart();存在rival的对战局会直接拒绝重开并向玩家发送提示,避免本地状态与联机对局状态机脱节。
联机对战流程
- 对战局仍然会完整经历结果结算与
end_game清理,但不会允许中途重开,也不会允许通过对战选歌 GUI 开启自动播放。
并发控制机制
GameInstance 使用 版本号(lifecycleVersion)+ volatile 状态 解决异步初始化与生命周期竞争问题:
关键并发原语:
| 机制 | 用途 |
|---|---|
synchronized beginLifecycle() | 原子性地递增版本号 |
synchronized invalidateLifecycle() | 使当前版本失效(+1后旧任务自动中止) |
volatile lifecycleState | 状态跨线程可见性 |
volatile lifecycleVersion | 版本号跨线程可见性 |
volatile gameplayCompleted | 游戏完成标志跨线程可见性 |
CloudRivalPlayer.volatile online/latestGameData | 网络线程写入,游戏线程读取 |