哪种设计模式用于2D iPhone游戏?

时间:2011-05-16 21:12:07

标签: iphone objective-c design-patterns

给出关于游戏的一些背景知识:掉落的物品从顶部漂浮,目标是轻弹/滑动另一个物体来击中它们。如果物品撞到地面,你将失去生命,并获得击落物品的分数。

这是我有点困惑的地方。在O'Reilly的iPhone游戏开发中。他们声明AppDelegate继承了游戏状态机对象,并在App Delegate中拥有主游戏循环。关于MVC没什么。

我打算使用MVC。我已经为模型识别了所有对象,并且将使用一个控制器来更新每个模型及其相应的视图。然后在App Delegate中有一个导航控制器,并从主屏幕推送某些控制器(播放,指令,统计数据)。然后在我的gameViewController中运行游戏循环。顺便说一句,我正在使用Chipmunk作为物理引擎。

这是我的第一场比赛,所以我有点困惑。我非常感谢有关如何进行的任何建议。我希望在跳转到代码之前从一开始就获得面向对象的设计。

3 个答案:

答案 0 :(得分:7)

我不认为MVC真的是你想要的。 MVC可以应用于你的整体应用程序状态 - 即菜单的视图,游戏板的视图等。它不适合在游戏中 - 至少只是在思考我的头脑。

看看gameDev上的这篇文章。人们对此有很多有用的模式比我更聪明。

https://gamedev.stackexchange.com/questions/4157/what-are-some-programming-design-patterns-that-are-useful-in-game-development

答案 1 :(得分:1)

我的MVC如下所示。创建的每个游戏对象只是一个模型。没有附加逻辑的空数据。创建对象时,它还会附加一个Brain或控制器。每个创建的Brain都会添加到Brain列表中。脑列表更新每个大脑,大脑改变模型。

为了在屏幕上显示某些内容,Brain将模型添加到场景中。场景保留了正在渲染的所有模型的列表。场景也从游戏循环更新。每个更新场景查看每个模型,任何没有视图的模型都会被赋予视图(基于模型中的数据创建新视图)。然后,场景跟踪视图,直到模型的数据显示它不再需要它。

当我在iPhone上工作时,我喜欢打破游戏循环到自己的线程。 O'Reilly的那些人非常聪明,所以拿出我所说的含盐。

[NSThread detachNewThreadSelector:@selector(GameLoop:) toTarget:self withObject:nil];

然后游戏循环本身首先更新大脑(或“控制器列表”),然后更新场景(或“视图列表”)。

最后一块将它们联系在一起的是输入。对于iPhone,我使用全屏视图。在视图的touchesBegan和touchesEnd中,我生成了传递给InputManager的事件。 InputManager将根据需要将事件发送到不同的模型。

答案 2 :(得分:0)

你不认为游戏状态机是一种数据模型吗?我没有你提到的O'Reilly书,但你给我的描述听起来非常像MVC。

MVC的要点是将应用程序的内容与屏幕上显示内容的方式分开。 MVC中的“模型”不必包含您从文件或Web服务器读取的哑数据对象......它可以很容易地模拟,连接到另一个设备等等。我想的方式如果您要丢弃应用程序的GUI并将其替换为脚本,命令行界面或Web服务,那么模型就是您保留的部分。游戏状态机肯定符合这种描述。

在iOS应用程序中让应用程序委托实例化模型并不罕见。然后,您拥有了知道如何与模型通信并将其提供的数据转换为可在视图中显示的内容的视图控制器。如果模型提供的某些数据是纹理或网格等图形元素,那就没关系......毕竟这些是游戏运行的数据。