一尘不染

如何组织游戏代码以适合MVC模式?

java

我是大学一年级的学生,攻读计算机科学学位。最近几年,我编写了很多程序,但是最近,我对结构代码,设计模式,语言差异等方面的理论有了更多的了解。

我有一个Java类,所以我放弃了C ++的研究/开发,而转到了Java和JOGL(Java OpenGL)。太好了!但这不是重点。

我想做一个小型的角色扮演游戏,但是这个问题确实适用于任何类型的游戏。您如何以结构化的方式组织游戏对象,例如Model-View-
Controller模式?它看起来是一种了不起的模式,已经被广泛使用并且很有道理,但是我在弄清楚如何实现它方面遇到了麻烦。

例如,我需要跟踪GL对象以绘制到屏幕上。我必须具有实现MouseListener,MouseMotionListener,MouseWheelListener和KeyListener的类(或一个类,多合一输入管理器)。而且我必须将游戏数据放在所有这些不同类都可以访问和修改的地方。如果有人按下键盘上的按钮,则输入管理类需要以某种方式执行键所映射的操作;当需要绘制框架时,图形类需要找到一种方法来遍历所有不同的“事物”并将其全部绘制。

而我最大的问题是GUI;它在哪里联系在一起?这有点像输入,但不完全相同,它需要从实际的游戏模拟中设置和获取数据。而且,如果我决定尝试添加网络(甚至类似于GUI),则更为复杂的是)还需要访问大量数据以进行修改和读取…

哦,我都很困惑。我不知道如何将所有这些以面向对象的方式一起使用…编写清楚适合模式的东西很容易,但是当您发生大量事情时,所有事情都绑在一个游戏循环上,彼此修改以及游戏数据等等,……我什至不知道。也许我只是在做比实际更大的交易。

其他人有这种感觉吗?请澄清一下我的处境,这样我就可以花更少的时间去担心和不知道从哪里开始!

编辑:找到了一个不错的图表,可能会帮助我解决所有问题…来源:(提防,PS文件!)http://www.tucs.fi/publications/attachment.php?fname=TR553.ps.gz

Edit2:我也喜欢这个人对他如何计划他的MVC游戏的解释:http :
//interactivesection.wordpress.com/2007/11/19/dum-de-dum-drum-my-first-mvc-
game-development/

Edit3:另一篇很棒的文章!
http://dewitters.koonsolo.com/gamemvc.html


阅读 232

收藏
2020-12-03

共1个答案

一尘不染

可能会帮助您将模型视为一种游戏API。如果从一开始就没有针对该游戏的用户界面,那么您的游戏将沦为什么?您提到的是,您所想到的是RPG,因此在这种情况下,您可以想象拥有角色,他/她的库存,咒语,能力,NPC甚至是地图和战斗规则之类的东西都属于模型。就像垄断的规则和部分一样,没有最终游戏如何显示或用户如何与之交互的细节。就像《雷神之锤》一样,它是一组抽象的3D对象,它们在一个关卡中移动,并计算出诸如相交和碰撞之类的东西,但没有渲染,阴影或声音效果。

通过将所有这些都放入模型中,游戏本身现在与UI无关。它可以像Rogue游戏一样挂接到ASCII文本界面,或者类似于Zork的命令行UI,或者基于Web的3D
UI。根据游戏机制的不同,其中一些用户界面可能非常糟糕,但它们都是可能的。

视图层是依赖于UI的层。它反映了您使用的UI的特定选择,并将非常致力于该技术。它可能负责读取模型的状态,并以3D,ASCII或网页的图像和HTML绘制模型状态。它还负责显示玩家与游戏互动所需的任何控制机制。

控制器层是两者之间的粘合剂。它永远不应包含任何实际的游戏逻辑,也不应负责驱动View层。相反,它应该将在“视图”层中执行的操作(单击按钮,单击屏幕区域,操纵杆操作等)转换为对模型执行的操作。例如,放下物品,攻击NPC,等等。它还负责收集数据并进行任何转换或处理,以使View图层更易于显示它。

现在,我在上面描述的方式好像是驱动游戏的事件序列非常不同,这可能仅非常适合于网络游戏。那是因为那是我最近花费的时间。在不受网络用户请求和服务器响应驱动的游戏中(例如,在用户计算机上运行的游戏),您可能需要确保模型层很好地实现了观察者模式。例如,如果由于时间流逝而在模型中进行操作,那么您可能不希望View层不断轮询模型以获取更新。相反,通过使用观察者模式,模型可以在模型对象发生更改时通知任何观察者。进而可以用来提示立即更新视图以反映更改。

然后,如果经过60秒导致玩家的基地进行了一些维修,则该基地可能会进行维修,并立即通知与之相连的所有观察者该基地已经更新。视图可以作为观察者附加,请注意,由于其状态已更改,因此需要重新显示基础。通知本身可能已经包含了足够的信息来更新View,或者它可能必须转过身来咨询模型以进行更新,但是结果将是相同的。

2020-12-03