【发布时间】:2014-05-19 16:59:31
【问题描述】:
我目前正在为安卓开发一款多人纸牌游戏,使用 libgdx 作为游戏引擎。我的问题更笼统。
我不确定在此架构中处理回调的最佳做法是什么。我的控制器是一个大型状态机,它会在从游戏引擎的 render() 方法调用时一遍又一遍地检查输入。
我有两个主要回调,来自 gui 的用户输入和来自 android google play 服务部分的网络回调。
目前这些回调方法/输入侦听器只是设置成员变量,这些变量由控制器/状态机的 getter 方法检查,例如我从控制器一遍又一遍地调用它,检查它是否 != null 并继续如果是。
@Override
public Boolean allPlayersConnected() {
Boolean allConnected = null;
if (startGame != null) {
allConnected = startGame;
startGame = null;
}
return allConnected;
}
由 google play services api 的回调设置的 startGame“标志”beeing。
我不知道这是不是好的做法,看起来不像。
我可以从设置控制器成员变量的谷歌播放服务回调中调用控制器方法,并在每个渲染循环中检查它,但这只是移动变量。
我也可以将控制器设计为这些事件的观察者,但是如果发生事件,我将在控制器内部的 update 方法中执行什么操作。我不认为我想要更改这些统计信息,即使我可以访问当前状态。我用这个到处传播状态代码,一些在一个巨大的更新方法的不同部分,一些在实际的状态机代码中。只是在 update 方法中设置一个成员变量,和我上面的想法很相似。
另一件事是,直接从回调方法更改控制器状态。那将是更少的代码、更少的变量和更快的速度,但我认为我会破坏 MVP 概念,因为我会从控制器中夺走控制权并让即 gui 改变控制器的状态。
对此有何意见?
编辑:
我想得越多,我就越认为观察者和命令模式的结合是要走的路。
所以我确实可以削减当前状态机的大部分并将其打包到观察者 update() 方法中。我可以使用可用信息创建命令对象,而不是通过大命令枚举发送命令,并将它们传递给观察者(控制器),在那里我检查命令是否可行,并使用需要执行的信息调用执行,例如模型接口。
【问题讨论】: