我想使用涉及以下状态的状态机设计模式来模拟游戏(出于练习原因):
但是,在阅读了状态机模式之后,在我看来它只适用于状态都暴露了一个公共接口(例如本文中的handleInput
- 方法:http://gameprogrammingpatterns.com/state.html )。
我打算让游戏在初始状态下使用publish
方法,这会将其引导到Published
状态,然后它会有join
方法,一旦有足够的玩家加入,它将引导它Ready
,等等。
目标是在这里分开关注点,我不希望一个巨大的Game
课程必须处理收集所有玩家以及处理实际的游戏逻辑。
这可以通过状态机完成吗?或者我可以使用其他任何设计模式吗?
答案 0 :(得分:1)
states
公开了一个通用界面,但这与您的实际游戏无关。
最低要求是将transitions
从state
设置为下一个state
,并根据之前的state
创建结果transition
的机制state
。通用界面只涉及这方面。
对于您的初始GameConfig
,主机会在GameLobby
对象上设置一些值。按“发布”按钮即可转换到下一个状态。在转换处理程序上,您需要创建一个GameLobby
对象。
GameLobby
是根据游戏的名称和预期的玩家数量创建的,并且严格按照添加玩家和其他大厅相关功能(例如玩家聊天,也应该在他们自己的班级中实施)进行交易。
这里,每次玩家加入大厅时都会调用转换处理程序。只有当达到玩家总数时,才会转换到下一个状态“Game Ready”。 (如果玩家的数量还不等于要求,那么如果你想保持不变的话,可以用一个额外的玩家转换到新的GameConfig
对象。)
与Player
对象一起,此新状态包含GameLogic
个对象的列表。
从此状态开始,当主机单击“Ready”时,在转换处理程序中,您最终会根据GameConfig
对象和Player
对象列表创建Init
对象。
赢得游戏后,您将转换到“已完成”状态,其中包含游戏的统计信息以及最终转换为“结束程序”。
这些主要状态中的每一个都可以包含自己的状态机。
因此,与状态机相关的接口不会限制有效负载的接口。
我还建议您将与在屏幕上显示项目相关的部分与确定要显示的“内容”的部分分开。因此,每个状态对象都有类似sprites
方法的东西,它们生成需要显示的{{1}}列表(并附加转换所需的任何事件处理程序)。然后,一个单独的对象将获取该列表并在屏幕上显示它并在用户输入上调用偶数处理程序。