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

标签 java oop design-patterns model-view-controller

我是一名大学新生,正在攻读计算机科学学位...过去几年我编写了很多程序,但最近我对组织代码、设计模式、语言差异的理论思想有了更多的了解等。

我有一个 Java 类(class),因此我放弃了 C++ 研究/开发,转而使用 Java 和 JOGL(Java OpenGL)。太棒了!但这不是重点。

我想做一个小型角色扮演游戏,但这个问题确实适用于任何类型的游戏。您如何以结构化的方式组织游戏对象,例如模型- 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

最佳答案

将模型视为一种游戏 API 可能会对您有所帮助。如果游戏一开始就没有 UI,你的游戏会沦落到什么地步?你提到你想到的是一个角色扮演游戏,所以在这种情况下,你可以想象让玩家角色、他/她的库存、法术、能力、NPC,甚至 map 和战斗规则之类的东西都成为模型的一部分.这就像大富翁的规则和片段,没有最终游戏如何显示或用户将如何与之交互的细节。就像 Quake 一样,是一组抽象的 3D 对象在关卡中移动,计算了交叉点和碰撞等内容,但没有渲染、阴影或声音效果。

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

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

Controller 层是两者之间的粘合剂。它不应该包含任何实际的游戏逻辑,也不应该负责驱动 View 层。相反,它应该将 View 层中的 Action (点击按钮、点击屏幕区域、操纵杆 Action 等)转换为模型上的 Action 。例如,掉落元素、攻击 NPC 等等。它还负责收集数据并进行任何转换或处理,以使 View 层更容易显示它。

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

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

关于java - 如何组织游戏代码以适应 MVC 模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/555283/

相关文章:

oop - 最佳实践 : Abstract data via get/set or allow access to the variable?

php - 依赖注入(inject)中的默认值

Java/Android/Eclipse : IllegalArgumentException: already added

java - 私有(private)内部类合成了意外的匿名类

C++将成员对象函数赋值给类成员函数

security - 要求唯一的电子邮件,同时不泄露现有用户的电子邮件

c# - 实现单例设计模式[请建议]

java - API架构中断路器设计模式的优势是什么?

java - 如何在不将包含类的JAR 放入/lib/ext 中的情况下跨多个WAR 在Tomcat 上缓存对象?

c# - 数据过滤的设计模式