0

我正在按照实体组件风格的设计模式编写游戏,并且遇到了我能够解决的问题,但不确定这是否是最佳实践(或者是否存在这样的事情)。

我有一个处理游戏主要状态(菜单、关卡、暂停、背景)的状态机,以及一个处理更多零碎游戏状态的游戏组件中的内部状态机(新关卡、关卡、下一个水平,游戏结束和总结)。我想让外部状态机知道游戏已经从内部组件结束,但它没有引用主控制器类。通常,我会使用协议将信息委托给链上,但在我有限的 ECS 经验中,这似乎打破了范式。我正在做的是查询窗口的根视图控制器的应用程序委托,并根据内部状态调用便利方法......这将是一种可怕的 MVC 方式,但在 ECS 中似乎很好。

任何人都可以确认这并不像我想象的那么可怕,或者如果是的话,推荐一个新的范例?这将不胜感激。

基本上它是这样工作的(我认为整个发布的代码太多了):

MainMenuViewController 有一个 ApplicationEntity,它有一个包含状态机的 ApplicationLifecycleComponent。在按下“开始游戏”按钮时,状态机进入 ApplicationGameState。

ApplicationGameState 使用对 MainMenu VC(即 root)的弱引用来呈现加载 SpriteKit 场景的 GameViewController。游戏逻辑通过一堆最终报告“游戏结束”的内部组件和状态机发生在这里。

游戏结束时,ApplicationLifecycle 的状态机应该退出 ApplicationGameState 并进入 MainMenuState(或任何其他状态,必要时),但由于我无法从场景中获取根 VC,我向 AppDelegate 询问根 vc,将其转换作为 MainMenuViewController,获取其实体并告诉其生命周期组件更改状态,如下所示:

if let applicationController = UIApplication.sharedApplication().keyWindow?.rootViewController as? MainMenuViewController {
    applicationController.applicationEntity.applicationLifecycleComponent.enterMenuState()
} 

重新表述这个问题,我应该将根视图控制器的弱引用从应用程序启动到这个状态吗?是否有通知更高级别实体发生某事的最佳实践?

作为参考,这是我第一次涉足 ECS。

4

0 回答 0