听起来你最好阅读一下模型-视图-控制器 http://www.martinfowler.com/eaaDev/uiArchs.html图案。您不必盲目地遵守它(例如,在某些情况下,允许模型和视图之间存在一些重叠是有意义的),但是对其有一个很好的理解将帮助您构建任何具有大量图形对象的程序以及控制它们的逻辑,以及广播状态或将其保存到光盘(游戏保存)的需要等。
您还必须认识到,cocos2d 提供了一个很好的系统来构建图形场景图并有效地渲染它,但它没有提供用于编程游戏的完整基础设施。从这个意义上说,它更像是一个图形引擎而不是游戏引擎。如果您尝试将游戏的架构融入到 cocos2d 的结构中,您可能不会得到最可维护的结果。相反,您应该像对待 cocos2d 一样对待它:一个满足您的显示和动画需求的出色工具。
除了维持游戏状态的场景之外,您绝对应该有一个对象,因为否则当您在场景之间切换时,所有状态都会去哪里?在场景/关卡中,您应该尝试使用良好的面向对象设计来将状态分布在各个类的对象上。每个角色对象都会记住自己的状态等。在这里您可以看到 MVC 在哪里变得有用:当您将游戏保存到光盘时,您想要记住每个角色的健康水平,但可能不记得精灵动画显示的确切帧索引。所以你需要区分sprite和特点(模型)本身。也就是说,正如我之前提到的,对于没有太多逻辑附加的游戏对象,或者不需要保存的游戏对象,将模型和视图融合到一个类中可能是可以的(基本上是通过子类化CCSprite)。
要按照预期的方式实现 MVC,您还应该学习以下基础知识键值观察 http://developer.apple.com/Mac/library/documentation/Cocoa/Conceptual/KeyValueObserving/KeyValueObserving.html。 (你最好使用这个替换 http://www.mikeash.com/pyblog/key-value-observing-done-right.html对于 Apple 的界面。)在更强烈的实时游戏中,这样的技术可能太慢,但由于您正在制作 RPG(入门的好选择),您可能会为了更易于维护的架构而牺牲性能。
就 MVC 模式而言,游戏场景(只是另一个 cocos2d 精灵)扮演着控制器的角色。它本身不绘制任何东西,而是告诉其他所有东西根据输入和状态绘制自己。将各种逻辑和功能放入游戏场景中是很诱人的,但是当您注意到它膨胀时,您应该问自己如何将该功能分离到其他类中。分析您正在实现的功能类型。与数据和状态(模型)有关吗?或者是关于动画和渲染(View)?或者是关于将逻辑与渲染连接起来(在这种情况下,您应该尝试让视图直接观察模型)?
游戏场景/控制器基本上是一个调度中心,它接收输入事件(例如,来自用户或报告他们击中某物的精灵)并决定如何处理它们:它可能会告诉一个或多个模型例如,对象以某种方式更新自身,或者可能只是触发其他一些精灵中的动画。
在实时游戏中,场景中会有一个“tick”或“step”方法,告诉所有对象进行自我更新。该方法(游戏循环)是程序的核心,每次绘制新帧时都会运行。 (在现代游戏引擎中存在很多多线程,但我们不要考虑这一点。)但就您而言,您可能希望创建一个可以与游戏场景完全分离的“玩游戏”的模块。想象一下创建一个可以仅使用文本输入通过终端下棋的程序。如果您以这种方式创建整个游戏系统,然后通过一个小而干净的界面将其连接到图形引擎,您将拥有一个真正可维护的应用程序,其中包含许多可用于未来项目的可重用代码!
一些好的经验法则:模型(数据)不应该知道anything关于精灵或显示状态;视图(精灵)不应该包含任何游戏的实际逻辑(游戏规则),而只知道如何做简单的事情,例如移动和弹跳以及在发生复杂情况时向场景报告。只要有可能,视图就应该直接对模型中的更改做出反应,而无需控制器干预。