在创建关卡时处理创建实体

我目前正在研究一个基于2D的物理学平台,有点像超级肉的风格。 在超级肉的男孩,你有多个层次,我想要一个类似的东西,但有一个一般的方式来处理创建实体在一个层次的开始。 因为我正在使用一个实体组件devise和使用平铺编辑器来加载水平(甚至lua脚本做一些更多的configuration/水平相关的逻辑),我将如何处理创建实体?

目前,我parsing我的平铺的XML映射,并做类似的事情

if("MovingPlatform"){ createMovingPlatform(mapObject) }elseif("SomeOtherEntity"){ } //... so on so forth 

但是,这将很快成为if语句的一个非常长的分支来加载我的实体。 有没有一个更清洁的devise模式或这样做的方式。 我正在考虑使用一个地图或string来创建该实体的类,如下所示:

  //in constructor of level loader entityCreatorMap["MovingPlatform"] = MovingPlatformEntityLoader() //somewhere later creating my entities by parsing xml entityCreatorMap[mapObject.getName()].create(mapObject) 

但是,这将是很多线初始化这些对象。 有任何想法吗?

你可以做一个单例,它将存储名称和加载器实例之间的关系,并在加载器的构造函数中将加载器注册到它。 你会有像你的例子一样的操作,但它将被分配。 这里是一个例子:

 MovingPlatformEntityLoader::MovingPlatformEntityLoader() { EntityLoaderRegistry::registerEntity( "MovingPlatform", this ); } static MovingPlatformEntityLoader loader; 

MovingPlatformEntityLoader的构造函数被调用时,加载器将在registry中注册,其他类可以使用它。 为了调用构造函数,你可以像这个例子一样在这个带有静态修饰符的.cpp文件中创建MovingPlatformEntityLoader的实例。

这种技术的join:

  • 您不需要硬性修改的注册方法。
  • 即使您无法访问游戏的所有代码(可用于插件),也可以添加新的装载程序。

劣势:

  • 如果你有多个模块并且使用dynamic链接(例如插件),你将会在链接的“糟糕的习惯”中忘记未使用的.cpp文件(你必须手动将这些文件链接到dll的入口点)。
  • 您无法预测创建装载机的顺序。 这就是为什么单例应该像在这个例子中一样被一个静态方法访问的原因。