转换到下一个场景时传递Level参数?

时间:2014-07-29 11:32:16

标签: objective-c cocos2d-iphone spritebuilder

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

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

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

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:2)

假设Gameplay.ccb已将GameplayClass指定为其自定义类,并且该类具有名为currentLevel的属性,则可以访问该实例并按如下方式分配级别: / p>

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

[[CCDirector sharedDirector] replaceScene:theScene];

请注意,在分配currentLevel时,GameplayClass已经运行了initdidLoadFromCCB方法,因为这种情况发生在loadAsScene期间。如果您需要在onEnter中覆盖GameplayClass进一步初始化处理:

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

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

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

答案 1 :(得分:0)

在我的游戏中(用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)都在对象本身内。
  4. 我认为您可以使用与CCScene子类类似的方法。