2012-07-14 45 views
7

我正在使用MVC模式在Java中制作2D游戏,并且在阅读和搜索我的屁股后,我还没有找到令人满意的answear来处理对象的图形表示。如何处理MVC 2D游戏中对象的图形表示?

我是否应该将每个对象(例如Player)分成PlayerModel(存储在模型中)和PlayerView(存储在视图中)?

这似乎有点乱,因此我将不得不跟踪哪个图形表示对象,即“ScaryMonsterEnemyView”连接到哪个逻辑表示对象,“ScaryMonsterEnemyModel”。根据MVC,这真的是我应该怎么做的吗?如果是这样,该连接应该存储在哪里?在视图中?

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

+1

也许你会发现[这篇文章](http://www.gamasutra.com/view/feature/130693/the_guerrilla_guide_to_game_code.php)有帮助..如果你还没有读过它。 – 2012-07-14 15:04:37

+0

@tereško所以基本上ScaryMonsterEnemyView将持有ScaryMonsterEnemyModel?这可能是有道理的,我猜... MVC中的 – tobes 2012-07-14 15:23:08

+0

视图不支持模型。该视图仅接收来自模型图层的数据。它要么从模型层(经典MVC)发送,要么通过视图(Model2 MVC)请求。 – 2012-07-14 17:25:25

回答

4

如果我没有弄错,你基本上是问如何将游戏分成模型 - 视图 - 控制器范例。

简而言之,模型就是您游戏的状态。在O-O术语中,您可以将模型看作游戏中的所有对象。

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

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

另外请记住,这些分割可以进一步分割,使生活更简单。例如:控制器可以分为AI处理,动作更新和碰撞检查。视图可以分为游戏对象显示和HUD,而模型可以是所有对象+独立于游戏对象的所有状态(如分辨率,窗口大小,按键配置等游戏设置)。

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

1

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

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

传统上,视图域对应于图形用户界面,其中包含按钮,窗体,Windows等概念。在桌面环境中。

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

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

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