Передача параметра Level при переходе к следующей сцене?

StackOverflow https://stackoverflow.com//questions/25014279

Вопрос

Я пытаюсь найти наилучший способ передать параметр уровня между сценами, используя Spritebuilder и Cocos2D в Xcode.

Я использую приведенный ниже стандартный код для перехода между сценами.

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

Любая помощь будет высоко оценена.

Это было полезно?

Решение

Предполагая, что Gameplay.ccb имеет GameplayClass назначается как его пользовательский класс, и этот класс имеет свойство с именем currentLevel, вы можете получить доступ к экземпляру и назначить уровень следующим образом:

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

[[CCDirector sharedDirector] replaceScene:theScene];

Обратите внимание, что к тому времени currentLevel присваивается GameplayClass будет уже запущен свой init и didLoadFromCCB методы, поскольку это происходит во время loadAsScene.Если вам нужна дальнейшая обработка инициализации, переопределите onEnter в GameplayClass:

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

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

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

Другие советы

В моей игре (созданной с помощью Cocos2d 2.0 + CocosBuilder) Я добавил метод класса loadWithLevelID:levelID к классу GameObjectLayer, который управляет элементами игрового процесса:

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

В общем, добавление метода "load" к классам, которые сопоставляют файлы ccbi, дает следующие преимущества:

  1. Только класс знает имя связанного с ним файла ccbi.
  2. На файл ccbi для создания данного класса ссылаются только один раз во всем проекте.
  3. Вся логика для настройки объекта (напримертипа G1GameObjectLayer) находится внутри самого объекта.

Я думаю, вы можете следовать аналогичному подходу с вашим подклассом CCScene.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top