8

我正在使用 MVC 模式在 Java 中制作一个 2D 游戏,在阅读和搜索我的屁股之后,我仍然没有找到一个令人满意的答案来说明我应该如何处理对象的图形表示。

我应该将每个对象(例如 Player)划分为 PlayerModel(存储在 Model 中)和 PlayerView(存储在 View 中)吗?

这似乎有点混乱,因为我必须跟踪哪个图形表示对象,即“ScaryMonsterEnemyView”连接到哪个逻辑表示对象“ScaryMonsterEnemyModel”。这真的是我应该按照 MVC 做的吗?如果是这样,这个连接应该存储在哪里?在视图中?

我知道这可能是一个愚蠢的问题,但我想从一开始就尽可能多地解决问题。感谢您的帮助:)

4

2 回答 2

4

如果我没记错的话,您基本上是在问如何将游戏拆分为模型-视图-控制器范式。

简单地说,模型就是你游戏的状态。在 OO 术语中,您可以将模型视为游戏中的所有对象。

控制器是在每个更新周期中应用于游戏状态(在本例中为所有游戏对象)的一组规则。这可以在您的所有对象中实现为一个名为 update() 的方法,或者它可以是在您的游戏循环中调用的一个函数,该函数系统地遍历所有需要更新的对象并更新它们。您也可以将控制器视为游戏循环本身。它调用所有内容进行更新,然后将其绘制在屏幕上并重复,除非满足某些条件,否则它会告诉程序执行其他操作。这样,您几乎拥有两个嵌套的 MVC 结构。一种通过菜单等控制程序的流程,另一种专用于游戏本身。

视图只是游戏的图形表示。这可以像屏幕上的文本一样简单,但在您的情况下,它是 2D 图形。为了实现这一点,您可以让每个对象也直接包含它们的图形状态,或者通过封装。视图只会查询所有对象的图形状态,然后将其分流到屏幕上。同样,这可以在每个对象的基础上实现,例如调用 draw() 的方法,或直接从游戏循环调用的另一个系统函数。一种常见的做法是创建一个名为“Sptite”的对象或类似的东西来保存图形信息,并让每个绘制的游戏对象都有一个个人实例。另请注意,视图不必是其自身的对象。在游戏循环中调用一个函数就足够了,尽管有时需要存储直接影响 View 操作的信息(如窗口大小),在这种情况下 View 可以是一个对象。控制器也是如此。

还要记住,这些部门可以进一步划分,以使生活更简单。例如:Controller 可以分为 AI 处理、动作更新和碰撞检查。View 可以分为游戏对象显示和 HUD,Model 可以是所有对象 + 所有独立于游戏对象的状态(如游戏的分辨率、窗口大小、键配置等设置)。

我知道这可能有点矫枉过正,它可能有额外的信息,但希望它回答你的问题,并给你从哪里开始的想法。

于 2012-08-21T03:47:29.953 回答
1

模型和视图是对象的两个集合/类别/域。

控制器提供了一组接口来对模型对象执行一些功能。如果需要,视图可以直接与模型对象讨论它们的状态信息。

传统上,View 域对应于 GUI,在桌面环境中具有按钮、表单、Windows 等概念。

您的视图域(或其中之一)将对应于您将构建的 3D 环境。(树木、房屋、人等)。这包括碰撞细节和你的物理。这两者都需要与您的 3D 环境相关的几何图形。

在游戏中,这些对象中的任何一个必须与另一个域中的对象协作可能是非常罕见的。但举个例子,考虑一部电话。该对象将存在于您的 3D 环境中,但也将与描述“半调用”、“通道”、“开关”等的另一个域协作。这些对象不属于您的视图域,而是属于单独的模型域。

一个更相关的示例可能是某种评分系统,例如 RPG 统计数据,它属于模型域。

于 2012-08-22T18:03:10.553 回答