如果我没有弄错,你基本上是问如何将游戏分成模型 - 视图 - 控制器范例。
简而言之,模型就是您游戏的状态。在O-O术语中,您可以将模型看作游戏中的所有对象。
控制器是在每个更新周期中应用于游戏状态(在本例中为所有游戏对象)的一组规则。这可以在所有对象中实现为一个名为update()的方法,也可以是在您的游戏循环中调用的函数,系统地遍历所有需要更新的对象,并更新它们。你也可以把Controller当作游戏循环本身。它会调用一切来更新,然后在屏幕上绘制并重复,除非满足一些条件,否则它会告诉程序执行其他操作。这样,你几乎有两个嵌套的MVC结构。一个通过菜单等来控制程序的流动,另一个专用于游戏本身。
视图只是您的游戏的图形表示。这可以像屏幕上的文本一样简单,但在您的情况下,它是2D图形。为了实现这一点,你可以让每个对象都直接包含图形状态,或者封装。视图只会查询所有对象的图形状态,然后将其分流到屏幕上。再次,这可以在每个对象的基础上实现,比如称为draw()的方法,或者直接从游戏循环中调用的另一个系统函数。通常的做法是创建一个名为'Sptite'或类似的东西来保存图形信息,并且让每个绘制的游戏对象都有一个个人实例。还要注意,视图本身不需要是一个对象。尽管有时需要存储直接影响视图操作的信息(如窗口大小),但在这种情况下,视图可以是一个对象,仅仅在游戏循环中调用的函数就足够了。控制器也是如此。
另外请记住,这些分割可以进一步分割,使生活更简单。例如:控制器可以分为AI处理,动作更新和碰撞检查。视图可以分为游戏对象显示和HUD,而模型可以是所有对象+独立于游戏对象的所有状态(如分辨率,窗口大小,按键配置等游戏设置)。
我知道这可能有点矫枉过正,它可能有额外的信息,但希望它能回答你的问题,并给你从何处开始的想法。
也许你会发现[这篇文章](http://www.gamasutra.com/view/feature/130693/the_guerrilla_guide_to_game_code.php)有帮助..如果你还没有读过它。 – 2012-07-14 15:04:37
@tereško所以基本上ScaryMonsterEnemyView将持有ScaryMonsterEnemyModel?这可能是有道理的,我猜... MVC中的 – tobes 2012-07-14 15:23:08
视图不支持模型。该视图仅接收来自模型图层的数据。它要么从模型层(经典MVC)发送,要么通过视图(Model2 MVC)请求。 – 2012-07-14 17:25:25