首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何组织游戏代码以适应MVC模式?

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

Stack Overflow用户
提问于 2009-02-17 01:59:04
回答 5查看 19.9K关注 0票数 72

我是一名大学新生,正在攻读我的计算机科学学位。在过去的几年里,我编写了很多程序,但就在最近,我开始更多地研究关于组织代码、设计模式、语言差异等的理论想法。

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

我想做一个小的角色扮演游戏,但这个问题确实适用于任何类型的游戏。如何以结构化的方式组织游戏对象,如模型-视图-控制器模式?它看起来是一个令人惊叹的模式,使用非常广泛,而且很有意义,但我在弄清楚如何实现它时遇到了麻烦。

例如,我需要跟踪一个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

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-02-17 05:00:41

将Model看作一种游戏API可能会对您有所帮助。如果游戏从一开始就没有用户界面,你的游戏会变成什么样子呢?你提到你脑海中的是一个RPG,所以在这种情况下,你可以想象玩家的角色,他/她的库存,法术,能力,NPCs,甚至地图和战斗规则等东西都是模型的一部分。这就像大富翁的规则和碎片,没有详细说明最终游戏如何显示它,或者用户将如何与它交互。它就像Quake一样,是一组抽象的3D对象,通过一个级别移动,计算交集和碰撞,但没有渲染、阴影或声音效果。

通过将所有这些放入模型中,游戏本身现在是UI不可知的。它可以连接到ASCII文本界面,比如Rogue游戏,或者类似于Zork的命令行UI,或者基于web的3D UI。根据游戏机制的不同,其中一些UI可能不太适合,但它们都是可能的。

视图层是依赖于UI的层。它反映了您对UI的具体选择,并将非常专注于该技术。它可能负责读取模型的状态并将其绘制为3D、ASCII或web页面的图像和HTML。它还负责显示玩家与游戏交互所需的任何控制机制。

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

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

然后,如果60秒过去导致玩家的基地发生了一些维修,基地可以实施维修,并立即通知任何观察者连接到它的基地已经更新。视图可以作为观察者附加,并注意它需要重新显示基础,因为它的状态已经改变。通知本身可能已经包含了足够的信息来更新视图,或者它可能必须转过身来参考模型才能更新,但结果将是相同的。

票数 57
EN

Stack Overflow用户

发布于 2009-02-17 02:26:17

你在这方面做得很好。基本上,问问自己这个问题:“如果我必须更改程序的某一部分,哪些代码会更改?”

如果它可以在不改变基本数据的情况下改变外观,那么它就在视图中。如果它是可以从很多方面查看的数据,那就是模型。如果是你怎么玩的,那就是控制力。

因此,如果你是用两个或一个刀片来画一把“斧头”,那就是视图。如果是你用斧头造成多少点生命伤害,那就是模型。如果是通过键入"s“或右键单击来摆动斧头,这就是控制。

票数 19
EN

Stack Overflow用户

发布于 2009-02-17 02:26:54

集中用户交互逻辑的MVC概念是一个很好的游戏开发模型。

我做了一些Flash游戏开发的工作。Here是一篇关于闪存中对象池的文章。这个概念是跨平台的,可能会给你一些启发。

你一次关心所有的事情是正确的。根据您的游戏设计,您的游戏循环可能有很多需要处理。这是您将学习所有肮脏的优化技巧的地方,通常是很难的方式:)

有许多方法可以组织您的代码-一种方法可能是将GameManager类编写为单例。所有游戏对象都绑定到它以进行管理和用户交互。GameManager处理所有用户输入,并将消息分派到其对象池。您可以使用接口来定义游戏对象和GameManager之间的通用通信模式。

就性能优化而言,线程是非常强大的。异步操作可以确保您不会浪费这些宝贵的周期。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/555283

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档