【问题标题】:Model View Controller and Callbacks模型视图控制器和回调
【发布时间】: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() 方法中。我可以使用可用信息创建命令对象,而不是通过大命令枚举发送命令,并将它们传递给观察者(控制器),在那里我检查命令是否可行,并使用需要执行的信息调用执行,例如模型接口。

【问题讨论】:

    标签: model-view-controller


    【解决方案1】:

    首先,我认为您的命令是枚举还是命令对象与这里的主要问题无关——即如何将用户和网络输入连接到状态管理。

    我见过的最常见的游戏架构是一个更新循环,它检查输入、迭代游戏模拟,然后渲染一帧。在 MVC 世界中,这种结构只是同步这些步骤;你仍然有一个封装的视图和数据模型,控制器(游戏循环)充当这两个世界之间的桥梁。

    输入,无论是来自本地用户还是来自网络,通常都被视为修改游戏状态的请求。也就是说,控制器(作为其循环的第一部分)读入待处理的输入消息并处理它们,同时修改状态。这样,改变状态的代码就在一个地方:那个控制器。你是对的,在整个应用程序中传播状态修改代码是一种不好的做法;基本上,它不是 MVC。

    换句话说,您所有的回调都应该将输入转换为命令并将它们放入队列中。您不想将控制器(其工作是修改状态)与这些输入回调同步。您不知道输入何时会相对于游戏循环发生,因此最好将它们解耦。使用游戏模拟序列化输入处理也应该使您的逻辑更简单。

    您可以选择如何将回调连接到控制器;共享队列(一侧写入,另一侧从中读取)是一种强大的模式,并且易于实现线程安全。

    【讨论】:

    • 感谢您的回答,现在一切似乎都更加清晰了。我认为最重要的部分是同步部分。我不希望回调(观察者更新方法)立即执行命令,因为我不知道当前进程在哪里工作以及何时发生输入。也许还有一个问题:除了命令队列之外,我还填写了观察者更新方法,以及控制器何时从哪个命令中获取命令,我还需要哪些其他选项来保持一切同步以及控制器处于控制之中?跨度>
    • 这实际上取决于您拥有的命令,但是命令队列在很多地方都使用,包括 Windows。您可以搜索“事件驱动编程”以获取更多信息。使用有限输入系统(例如游戏手柄或工业等效设备)的系统通常只会将手柄的状态存储在一个对象中,并让控制器决定如何解释它。
    猜你喜欢
    • 2011-12-28
    • 1970-01-01
    • 2013-09-25
    • 2011-09-12
    • 2013-01-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多