我正在使用MVC模式在java中制作2D游戏,在阅读并搜索我的屁股之后,我仍然没有找到令人满意的安慰,我应该如何处理对象的图形表示。
我应该将每个对象,例如Player分为PlayerModel(存储在Model中)和PlayerView(存储在View中)吗?
这似乎有点混乱,因为我必须跟踪哪个图形表示对象,即“ScaryMonsterEnemyView”连接到哪个逻辑表示对象,“ScaryMonsterEnemyModel”。根据MVC,这真的是我应该怎么做的吗?如果是这样,这个连接应该存储在哪里?在视图中?
我知道这可能是一个愚蠢的问题,但我想从一开始就尽可能多地获得。感谢您帮忙:))
答案 0 :(得分:4)
如果我没弄错的话,你基本上都在问如何将游戏分解为模型 - 视图 - 控制器范例。
简而言之,模型就是游戏的状态。在O-O术语中,您可以将模型视为游戏中的所有对象。
Controller是在每个更新周期中应用于游戏状态(在本例中为所有游戏对象)的一组规则。这可以在所有对象中实现为名为update()的方法,也可以是在游戏循环中调用的函数,系统地遍历需要更新的所有对象,并更新它们。您还可以将Controller视为游戏循环本身。它调用所有内容进行更新,然后在屏幕上绘制并重复,除非满足某些条件,然后它告诉程序执行其他操作。通过这种方式,您几乎拥有两个嵌套的MVC结构。一个通过菜单等控制程序的流程,一个专用于游戏本身。
视图只是游戏的图形表示。这可以像屏幕上的文本一样简单,但在您的情况下,它是2D图形。要实现这一点,您可以让每个对象也直接或通过封装包含其图形状态。 View只会查询所有对象的图形状态,然后将其分流到屏幕上。同样,这可以基于每个对象实现,例如称为draw()的方法,或者直接从游戏循环调用的另一个系统函数。通常的做法是创建一个名为“Sptite”的对象或类似的东西来保存图形信息,并且绘制的每个游戏对象都有一个个人实例。另请注意,View不必是自身的对象。仅仅在游戏循环中调用的函数就足够了,尽管有时需要存储直接影响View操作的信息(如窗口大小),在这种情况下,View可以是一个对象。控制器也是如此。
另外请记住,这些划分可以进一步划分,以简化生活。例如:控制器可分为AI处理,移动更新和碰撞检查。视图可以分为游戏对象显示和HUD,模型可以是所有对象+所有独立于游戏对象的状态(如分辨率的游戏设置,窗口大小,键配置等)。
我知道这可能有点矫枉过正,而且它可能有额外的信息,但希望它可以回答你的问题,并为你提供从哪里开始的想法。
答案 1 :(得分:1)
模型和视图是对象的两个集合/类别/域。
控制器提供一组接口以在模型对象上执行某些功能。如果需要,视图可以直接与模型对象进行关于其状态信息的对话。
传统上,View域对应于GUI,具有按钮,表单,Windows等概念。在桌面环境中。
您的View域(或其中一个)将对应您将构建的3D环境。 (树木,房屋,人等)。 这包括碰撞细节和物理。这两者都需要与3D环境相关的几何体。
在游戏中,任何这些对象都必须与另一个域中的对象协作才是非常罕见的。但举个例子,考虑一下电话。该对象将存在于您的3D环境中,但也将与另一个描述“半调用”,“通道”,“切换”等的域协作。这些对象不属于您的View域,而是属于单独的Model域。< / p>
更相关的示例可能是某种评分系统,例如RPG统计信息,它们属于模型域。