Передача параметра Level при переходе к следующей сцене?
-
21-12-2019 - |
Вопрос
Я пытаюсь найти наилучший способ передать параметр уровня между сценами, используя 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, дает следующие преимущества:
- Только класс знает имя связанного с ним файла ccbi.
- На файл ccbi для создания данного класса ссылаются только один раз во всем проекте.
- Вся логика для настройки объекта (напримертипа G1GameObjectLayer) находится внутри самого объекта.
Я думаю, вы можете следовать аналогичному подходу с вашим подклассом CCScene.