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.

È stato utile?

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:

    .
  1. Solo la classe conosce il nome del suo file CCBI correlato.
  2. Il file CCBI per creare una determinata classe viene referenziata solo una volta nell'intero progetto.
  3. Tutta la logica per configurare un oggetto (ad esempio il tipo G1GameObjectLayer) è all'interno dell'oggetto stesso.
  4. Penso che tu possa seguire un approccio simile con la tua sottoclasse CCSCene.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top