Passando o parâmetro Level na transição para a próxima cena?
-
21-12-2019 - |
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.
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:
- Somente a classe sabe o nome do arquivo ccbi relacionado.
- O arquivo ccbi para criar uma determinada classe é referenciado apenas uma vez em todo o projeto.
- 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.