Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
RPG游戏循环和类结构(适用于iPhone的cocos2D)_Iphone_Objective C_Class Design_Cocos2d Iphone - Fatal编程技术网

RPG游戏循环和类结构(适用于iPhone的cocos2D)

RPG游戏循环和类结构(适用于iPhone的cocos2D),iphone,objective-c,class-design,cocos2d-iphone,Iphone,Objective C,Class Design,Cocos2d Iphone,我想在iPhone上用Cocos2D制作一个RPG。我做了不少研究,我真的很喜欢Cocos2D用于场景的模型。我可以实例化一个场景,设置我的角色等等,这一切都非常好。。。我遇到的问题是构造一个游戏循环,并将代码与场景分离 例如,我将在多个场景中维护游戏状态的代码放在哪里?我是否将场景中触发的事件的代码放在该场景的类中?或者我是否有其他类将init代码与逻辑分离 此外,我读过很多教程,其中提到了场景的改变,但我没有读过任何一本关于更新场景的教程——从用户那里获取输入并基于此更新显示。这是在场景对象

我想在iPhone上用Cocos2D制作一个RPG。我做了不少研究,我真的很喜欢Cocos2D用于场景的模型。我可以实例化一个场景,设置我的角色等等,这一切都非常好。。。我遇到的问题是构造一个游戏循环,并将代码与场景分离

例如,我将在多个场景中维护游戏状态的代码放在哪里?我是否将场景中触发的事件的代码放在该场景的类中?或者我是否有其他类将init代码与逻辑分离

此外,我读过很多教程,其中提到了场景的改变,但我没有读过任何一本关于更新场景的教程——从用户那里获取输入并基于此更新显示。这是在场景对象中发生的,还是在单独的显示引擎类型类中发生的


提前谢谢

听起来你最好仔细阅读一下这个模式。您不必死死地遵守它(例如,在某些情况下,允许模型和视图之间有一些重叠是有意义的),但对它有很好的理解将有助于您构建任何具有大量图形对象和逻辑控制它们的程序,以及需要广播状态或将其保存到光盘(游戏保存)等

您还必须认识到,cocos2d提供了一个很好的系统来构造图形场景图并高效地进行渲染,但它并没有为游戏编程提供完整的基础设施。从这个意义上说,它更像是一个图形引擎,而不是一个游戏引擎。如果您试图将游戏的架构与cocos2d的结构相适应,那么最终可能不会得到最可维护的结果。相反,您应该像对待cocos2d那样对待它:它是一个很好的工具,可以满足您的显示和动画需求

你肯定应该有一个对象,而不是维持游戏状态的场景,否则,当你在场景之间切换时,所有的状态都会去哪里?在场景/级别中,您应该简单地尝试使用良好的面向对象设计,使状态分布在各种类的对象上。每个角色对象都会记住自己的状态等。在这里,您可以看到MVC在何处变得有用:当您将游戏保存到光盘时,您希望记住每个角色的健康水平,但可能不想记住精灵动画显示的确切帧索引。因此,您需要区分精灵和角色(模型)本身。也就是说,正如我前面提到的,对于没有太多逻辑连接的游戏对象,或者不需要保存的游戏对象,只需将模型和视图融合到一个类中(基本上通过子类化CCSprite)就可以了

要实现MVC应有的效果,您还应该学习MVC的基础知识。(你最好在苹果的界面上使用。)在实时性更强的游戏中,这样的技术可能太慢了,但由于你正在制作一个RPG(很好的入门选择),你可能会为了一个更易于维护的架构而牺牲性能

根据MVC模式,游戏场景(只是另一个cocos2d精灵)扮演着控制器的角色。它本身并不绘制任何东西,而是告诉其他所有东西根据输入和状态绘制自己。在游戏场景中加入各种逻辑和功能是很有诱惑力的,但是当你注意到它膨胀时,你应该问问自己如何将这些功能分离到其他类中。分析要实现的功能类型。这与数据和状态(模型)有关吗?还是关于动画和渲染(视图)?或者是关于将逻辑与渲染连接起来(在这种情况下,您应该尝试让视图直接观察模型)

游戏场景/控制器基本上是一个调度中心,它接收输入事件(例如,来自用户或来自报告他们击中某物的精灵),并决定如何处理这些事件:它可能会告诉一个或多个模型对象以某种方式更新自己,或者它可能只会触发其他精灵中的动画,比如说

在实时游戏中,场景中会有一个“滴答”或“分步”方法,告诉所有对象更新自己。此方法(游戏循环)是程序的核心,每次绘制新帧时都会运行。(在现代游戏引擎中,有很多多线程,但我们不要考虑这些。)但在您的情况下,您可能希望创建一个模块,可以完全独立于游戏场景“玩游戏”。想象一下,创建一个仅使用文本输入就能通过终端下棋的程序。如果您以这种方式创建整个游戏系统,然后通过一个小巧干净的界面将其连接到图形引擎,您将拥有一个真正可维护的应用程序,其中包含大量可重用的代码,可供将来的项目使用


一些好的经验法则:模型(数据)不应该知道任何关于精灵或显示状态的信息;视图(精灵)不应该包含任何游戏的实际逻辑(游戏规则),但只知道如何做简单的事情,如移动和反弹,以及在发生复杂事件时向场景报告。只要有可能,视图应该直接对模型中的更改做出反应,而不需要控制器的干预。

谢谢!这就是我要寻找的,虽然我想当我真正开始编码时,我可能还有几十个问题:pHi,我想实现一个实时游戏,类似于飞行控制,一次大约移动14个小精灵。我真的很想实现一个好的设计,但是,使用键值观察会不会太慢?