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状态。

动动手

  1. 在客户端Gaming状态时,每帧打印I am in gaming。

答案:(TODO)

  1. 在客户端每个主状态切换时,打印当前状态。

答案:(TODO)

Last updated