2016-02-15 1 views
0

Я в настоящее время программирую игру с использованием cocos2dx engine, и у меня есть менеджер уровней, который отслеживает текущий уровень и сцену, которые необходимо загрузить. Я хочу, чтобы избежать долго, если заявления, такие как это:C++ шаблон для классов со статическим методом

Scene* scene; 
if (level == 1) 
{ 
     scene = Game_Scene1::createScene(); 
} 
else if (level == 2) 
{ 
     scene = Game_Scene2::createScene(); 
} 
else if (level == 3) 
{ 
     scene = Game_Scene3::createScene(); 
} 
(...) 
else if (level == 10) 
{ 
     scene = Game_Scene10::createScene(); 
} 

Director::getInstance()->replaceScene(TransitionFade::create(0.5, scene, Color3B(0,0,0))); 

Метод screateScene() статический метод

static cocos2d::Scene* createScene(); 

Что я мог сделать, чтобы «удалить», если заявление? Так это будет выглядеть примерно так:

Scene* scene = getScene(level, sceneClass::createScene()); 

и было бы взять правильный класс (то есть: Game_Scene1, Game_Scene2 и т.д.)

Есть хорошее решение для такой задачи? Заголовок говорит о шаблоне, но я не уверен, что решение для этого шаблона.

+0

Если 'level' - это значение времени выполнения, вы не можете (просто) использовать шаблон, так как ему потребуется значение времени компиляции. Но вы уверены, что у вас есть свой дизайн? Эти пронумерованные классы - это немного предупреждающий флаг. – Biffen

+1

Почему метод статический? Это выглядит как динамический полиморфизм, т. Е. Базовый класс GameScene с методом 'virtual createScene()'. Затем вы создаете фабричный или заводский метод для создания правильного экземпляра на основе номера уровня. – iksemyonov

+1

Или, может быть, он даже выглядит как 'Kit' (прототип основан на' Factory'). Почему существуют отдельные классы для сцен на разных уровнях? Этот тип материала должен быть динамическим, а не статическим. – iksemyonov

ответ

3

Одним простым решением было бы использовать таблицу указательных функций.

Вы можете объявить таблицу как

typedef cocos2d::Scene *(*PtfCreateScene)(); 
PtfCreateScene tab[10]; 

tab[0] = Game_Scene1::create_scene; 
tab[1] = Game_Scene2::create_scene; ... 

Используя это решение, то вы можете вызвать соответствующую функцию create_scene с помощью level в качестве индекса. Таким образом, избегая ветвей if.

scene = tab[level - 1](); 

Вам нужно будет проверить правильность индекса, чтобы избежать доступа к памяти.

Надеюсь, я ответил на ваш вопрос. Не стесняйтесь спрашивать, нужно ли вам больше объяснений.

+0

Спасибо! Это очень помогло мне! Я сделал это немного по-другому (поэтому он больше подходит для моего кода), но все же ваше решение было ключом к успеху;) – L3M0L

+0

Я рад, что смог помочь;) –