1.5 游戏主生命周期和主状态机
在上个章节中,我们了解到游戏主要分为客户端线程和服务端线程,并共同执行相同的代码。本章节将主要介绍客户端和服务端两个线程的生命周期以及状态机。
服务端
在单人模式中,服务端为一个内置线程。在玩家点击进入世界后,服务端线程被创建,并在玩家整个游戏过程中一直存在。当发生玩家选择退出世界或者连接中断(单人游戏也可能会有谜之原因导致内网掉线),服务端线程将会退出。服务端线程没有状态机的概念,或者说只有一个GAMING
状态。
客户端
对于客户端线程,生命周期则完全横跨整个游戏。在游戏程序加载资源时,客户端线程被创建。在游戏程序退出时,客户端线程被销毁。
客户端状态
客户端线程运行主状态机,你可以通过ClientState.current
得到当前客户端线程的运行状态。总共有着如下状态:
LoadingResource
:客户端正在导入游戏资源,导入完成后,切换到InMenu
状态。InMenu
:客户端正在菜单界面,包括菜单主界面、选角、创角、选世界、创世界等界面。进入界面或者加入服务器后,切换到Joining
状态;点击退出游戏按钮或者关闭游戏窗口后,切换到Exiting
状态。Exiting
:客户端正在退出游戏,也就是整个app退出时,退出完成后客户端线程将被销毁。Joining
:客户端正在与服务端建立连接(注意单人模式也有服务端哦),此时已经构建服务端并处理初步连接事宜,连接成功后进入LoadingWorld
状态,失败则进入LosingConnection
状态。LoadingWorld
:客户端与服务成功连接,并且正在接收并加载服务端传过来的世界数据。加载完成后进入Gaming
状态,断线会进入losingConnection
状态。Gaming
:客户端正在进行游戏。安全退出世界或者单人模式是突发断线,进入SavingWorld
状态;多人联机发生的断线,进入LosingConnection
状态。SavingWorld
:客户端退出了世界,单人模式时正在等待服务端保存世界数据并结束服务端线程的状态。服务端退出后,客户端回到InMenu
状态。LosingConnection
:断线状态,给予掉线提示并回到InMenu
状态。
动动手
在客户端Gaming状态时,每帧打印I am in gaming。
答案:(TODO)
在客户端每个主状态切换时,打印当前状态。
答案:(TODO)
Last updated
Was this helpful?