Cocos2d的最佳实践

时间:2012-02-10 09:42:34

标签: cocos2d-iphone

我正处于我的cocos2d冒险之初,并且有一些意识形态问题要问。我正在制作一个小型太空射击游戏,我是否正确使用以下类结构?

  • 场景
    • 背景图层
      • 无限视差背景
    • 游戏图层
      • 太空飞船
      • 子弹
    • 控制层
      • 操纵杆
      • 按钮

以及后续问题 - 从其他图层访问对象的最佳做法是什么?例如,当操纵杆更新时,它必须旋转太空船并移动背景。这两个都在其他层面。是否有一些推荐的方法可以解决这个问题,还是应该通过Tag获取所需的对象并对其进行操作?

3 个答案:

答案 0 :(得分:3)

Cocos是一个基于单一的大型系统,可能不会吸引一些开发人员,但通常用于Cocos应用程序,并且是框架的基本架构。如果你有一个主场景和许多后续图层添加到该场景,并且你希望来自一个图层的控件影响其他图层上的精灵或逻辑,那么使主场景成为单例并从控制杆发送信息确实没有错返回到场景以处理操纵其他图层或精灵。我一直这样做,这种技术在书籍和网上的无数Cocos教程中使用,所以如果你这样做的话,你可以觉得你没有破坏太多的规则(这也很容易)。

如果您选择在一个图层中使用指针将数据发送到其他图层,这会让您遇到很多麻烦,因为一个节点永远不应该拥有另一个节点,因为它没有特定的父子关系。当您稍后删除场景时,这样做可能会导致本机Cocos清理方法崩溃和问题,并可能泄漏内存。你可以在这种情况下使用弱引用,但这仍然依赖于一层期望另一层始终存在,这可能不是这种情况。

将数据发送回主游戏场景然后相应地发送和使用非常有效。

答案 1 :(得分:1)

这似乎是一种非常合理的排列对象的方法,这是我使用的方法。

为了访问对象,我会将对象的显式引用保存为成员变量并直接使用它。 (使用标签不是一个糟糕的选择,我发现它可能会有点混乱)。

@interface Class1 : NSObject
{
    CCLayer *backgroundLayer;
    CCLayer *contentLayer;
    CCLayer *hudLayer;

    CCSprite *objectIMayNeedToUseOnBackgroundLayer;
    CCNode *objectIMayNeedToUseOnContentLayer;

}

答案 2 :(得分:1)

关于标签,我用来确保我分配的标签号是唯一的一种方法是定义一个枚举,如下所示:

typedef enum
{
    kTag_BackgroundLayer = 100,
    kTag_BackgroundImage,
    kTag_GameLayer = 200,
    kTag_BadGuy,
    kTag_GoodGuy,
    kTag_Obstacle,
    kTag_ControlLayer = 300
    kTag_Joystick,
    kTag_Buttons
};

大多数时候我也只是设置CCNode的zOrder和标签属性(即CCSprites,CCLabelTTF等),所以你实际上也可以使用枚举来定义你的zOrder。