在过渡到下一个场景时传递Level参数



我正试图找出在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期间。如果您需要进一步的初始化处理,在GameplayClass中覆盖onEnter:

-(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制作)中,我向类GameObjectLayer添加了一个类方法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文件的类中添加"load"方法可以提供以下好处:

  1. 只有类知道相关ccbi文件的名称。
  2. 用于创建给定类的ccbi文件在整个项目中只被引用一次。
  3. 设置对象(例如G1GameObjectLayer)的所有逻辑都在对象本身内部。

我认为你可以遵循类似的方法与你的CCScene子类。

最新更新