Parametro del livello di passaggio quando la transizione verso la scena successiva?
-
21-12-2019 - |
Domanda
Sto cercando di capire il modo migliore per superare un parametro di livello tra scene utilizzando SpriteBuilder e COCOS2D in XCode.
Sto usando il codice standard qui sotto per la transizione tra scene.
[[CCDirector sharedDirector] replaceScene:[CCBReader loadAsScene:@"Gameplay"]];
.
Qualsiasi aiuto sarà molto apprezzato.
Soluzione
Supponendo che il Gameplay.ccb
abbia un GameplayClass
assegnato come la sua classe personalizzata e quella classe ha una proprietà denominata currentLevel
, è possibile accedere all'istanza e assegnare il livello come segue:
CCScene* theScene = [CCBReader loadAsScene:@"Gameplay"];
GameplayClass* game = (GameplayClass*)theScene.children.firstObject;
game.currentLevel = 3;
[[CCDirector sharedDirector] replaceScene:theScene];
.
Si noti che dal momento in cui viene assegnato currentLevel
, il GameplayClass
avrà già eseguito i suoi metodi init
e didLoadFromCCB
da quando ciò accade durante loadAsScene
.Se è necessario un ulteriore init di elaborazione override onEnter
in GameplayClass
:
-(void) onEnter
{
[super onEnter]; // must call super
switch (self.currentLevel)
{
// other switches omitted...
case 3:
// your level 3 code here
break;
}
}
. Altri suggerimenti
Nel mio gioco (realizzato con cocos2d 2.0 + cocosbuilder) Ho aggiunto un metodo di classe loadWithLevelID:levelID
alla classe GameObjectLayer che gestisce gli elementi di gioco:
@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;
}
.
Quindi ora posso creare una digitazione di GameObjectLayer
GameObjectLayer * gol = [GameObjectLayer loadWithLevelID:levelID];
.
In generale, aggiungendo un metodo "caricamento" alle classi che mappare i file CCBI offre i seguenti vantaggi:
- .
- Solo la classe conosce il nome del suo file CCBI correlato.
- Il file CCBI per creare una determinata classe viene referenziata solo una volta nell'intero progetto.
- Tutta la logica per configurare un oggetto (ad esempio il tipo G1GameObjectLayer) è all'interno dell'oggetto stesso.
Penso che tu possa seguire un approccio simile con la tua sottoclasse CCSCene.