Pergunta

Estou tentando descobrir a melhor maneira de passar um parâmetro de nível entre Cenas usando Spritebuilder e Cocos2D no Xcode.

Estou usando o código padrão abaixo para fazer a transição entre as cenas.

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

Qualquer ajuda será muito apreciada.

Foi útil?

Solução

Supondo que o Gameplay.ccb tem um GameplayClass atribuído como sua classe personalizada, e essa classe tem uma propriedade chamada currentLevel, você pode acessar a instância e atribuir o nível da seguinte forma:

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

[[CCDirector sharedDirector] replaceScene:theScene];

Observe que na hora currentLevel é atribuído o GameplayClass já terá executado seu init e didLoadFromCCB métodos, já que isso acontece durante loadAsScene.Se você precisar de mais substituição do processamento inicial onEnter em GameplayClass:

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

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

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

Outras dicas

No meu jogo (feito com Cocos2d 2.0 + CocosBuilder) adicionei um método de classe loadWithLevelID:levelID à classe GameObjectLayer que gerencia os elementos do jogo:

@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;
}

Agora posso criar uma digitação GameObjectLayer

GameObjectLayer * gol = [GameObjectLayer loadWithLevelID:levelID];

Em geral, adicionar um método "load" às classes que mapeiam arquivos ccbi oferece os seguintes benefícios:

  1. Somente a classe sabe o nome do arquivo ccbi relacionado.
  2. O arquivo ccbi para criar uma determinada classe é referenciado apenas uma vez em todo o projeto.
  3. Toda a lógica para configurar um objeto (por exemplodo tipo G1GameObjectLayer) está dentro do próprio objeto.

Acho que você pode seguir uma abordagem semelhante com sua subclasse CCScene.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top