【发布时间】:2016-02-15 09:04:54
【问题描述】:
我目前正在使用 cocos2dx 引擎编写游戏,并且我有一个关卡管理器来跟踪当前关卡和需要加载的场景。我想避免长 if 语句,例如:
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_Scene1、Game_Scene2 等)
这样的问题有什么好的解决方案吗?标题是模板,但我不确定这个解决方案是否是模板。
【问题讨论】:
-
如果
level是运行时值,则不能(仅)使用模板,因为它需要编译时值。但是你确定你的设计是对的吗?这些编号的类有点像警告标志。 -
为什么方法是静态的?这看起来像动态多态性,即带有
virtual createScene()方法的基类GameScene。然后你创建一个工厂或者工厂方法来根据层数创建正确的实例。 -
或者,它甚至看起来像
Kit(基于原型的Factory)。为什么不同级别的场景有不同的类?这种东西应该是动态的,而不是静态的。 -
switch怎么样?使用表格/地图怎么样? -
@iksemyonov 如果我用 Java 编程,我会这样做,这是唯一的方法。我支持@joachim 的解决方案:一个用
std::functions 填充的常量容器(map、array ...)。
标签: c++ templates c++11 refactoring cocos2d-x