2016-02-15 40 views
0

我目前正在使用cocos2dx引擎编写游戏,并且我有一个级别管理器,用于跟踪当前级别和需要加载的场景。我想避免长的if语句,比如这个:用于静态方法的类的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(); 

我能做什么来“删除” if语句?因此,这将是这个样子:

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

,它会采取正确的类(即:Game_Scene1Game_Scene2等)

是否有这样的问题一个很好的解决方案?标题说模板,但我不确定如果解决方案是模板。

+0

如果'level'是一个运行时值,则不能(仅)使用模板,因为它需要一个编译时间值。但是你确定你的设计是正确的吗?这些编号的类是一个警告标志。 – Biffen

+1

为什么该方法是静态的?这看起来像动态多态性,即,具有'virtual createScene()'方法的基础'GameScene'类。然后创建一个工厂或工厂方法,根据关卡编号创建正确的实例。 – 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; ... 

使用该解决方案,那么你可以调用使用level为指标的相关create_scene功能。从而避免了如果分支。

scene = tab[level - 1](); 

您必须检查索引的正确性以避免内存不足。

希望我回答了你的问题。不要犹豫,问你是否需要更多的解释。

+0

谢谢!这帮了我很多!我做得有点不同(所以它更适合我的代码),但仍然是你的解决方案是成功的关键;) – L3M0L

+0

我很高兴我能帮忙;) –