我试图找出在Xcode中使用Spritebuilder和Cocos2D在场景之间传递关卡参数的最佳方法。

我正在使用下面的标准代码在场景之间转换。

[[CCDirector sharedDirector] replaceScene:[CCBReader loadAsScene:@"Gameplay"]];

任何帮助将不胜感激。

有帮助吗?

解决方案

假设 Gameplay.ccb 有一个 GameplayClass 分配为其自定义类,并且该类具有名为 currentLevel, ,您可以访问实例并按如下方式分配级别:

CCScene* theScene = [CCBReader loadAsScene:@"Gameplay"];
GameplayClass* game = (GameplayClass*)theScene.children.firstObject;
game.currentLevel = 3;

[[CCDirector sharedDirector] replaceScene:theScene];

请注意,到时候 currentLevel 被分配到 GameplayClass 将已经运行它 initdidLoadFromCCB 方法,因为这发生在 loadAsScene.如果需要进一步的init处理复盖 onEnterGameplayClass:

-(void) onEnter
{
    [super onEnter]; // must call super

    switch (self.currentLevel)
    {
        // other switches omitted...

        case 3:
            // your level 3 code here
            break;
    }
}

其他提示

在我的游戏中(使用cocos2d 2.0 + cocosbuilder制作)我将类方法生成loadWithLevelID:levelID添加到游戏组件的类游戏元素:

@implementation GameObjectLayer {
    G1LevelID * _levelID;
}
// load a Luminetic Land game object layer
+ (instancetype)loadWithLevelID:(G1LevelID*)levelID {
    NSString * levelFileName = ... builds levelFileName from levelID;
    GameObjectLayer * gol = (GameObjectLayer*) [CCBReader nodeGraphFromFile:levelFileName];
    [gol setLevelID:levelID];
    return gol;
}
- (void)setLevelID:(G1LevelID*)levelID {
    _levelID = levelID;
}
. 所以现在我可以创建一个GameObjectLayer键入

GameObjectLayer * gol = [GameObjectLayer loadWithLevelID:levelID];
.

一般来说,将“加载”方法添加到映射CCBI文件提供以下优点的类:

  1. 只有班级知道其相关的ccbi文件的名称。
  2. 创建给定类的ccbi文件仅在整个项目中引用一次。
  3. 设置对象的所有逻辑(例如g1gameObjectLayer类型)在对象本身内部。
  4. 我认为您可以遵循与CCScene子类的类似方法。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top