游戏实体类型分配 我将一个基于瓦片的2D游戏移植到C++,因为我不是java的爱好者(有些特性很好,但我就是不能习惯它)。我正在使用TMX平铺贴图。这个问题涉及如何将对象定义转换为实际的游戏实体。在Java中,我使用反射来分配指定类型的对象(假定它派生自基本游戏实体) 这很好,但是这个特性在C++中是不可用的(我明白为什么,我没有抱怨。我觉得反射混乱,我犹豫在爪哇使用它,哈哈)。我只是想知道翻译这些数据最好的方法是什么。我的想法是一个基类,所有实体都可以从该基类派生(这似乎很标准),然后让加载程序根据TMX映射中的“type”值分配派生类型。我想到了两种方法来做到这一点 一个巨大的开关盒。冗长而令人厌恶。我怀疑是否有人会提出这一建议(但这是显而易见的) 使用std::map,它将任意类型名称映射到一个函数,以分配与所述类型名称对应的所述类 最后,我考虑过将实体创建为一个基类,并对不同的实体类型使用脚本。脚本本身将向系统注册其实体类型,尽管游戏需要在加载时加载所述实体类型脚本(这可以通过一个主实体类型声明脚本完成,这将使每个实体的编辑数量减少到2:实体创建和实体注册)

游戏实体类型分配 我将一个基于瓦片的2D游戏移植到C++,因为我不是java的爱好者(有些特性很好,但我就是不能习惯它)。我正在使用TMX平铺贴图。这个问题涉及如何将对象定义转换为实际的游戏实体。在Java中,我使用反射来分配指定类型的对象(假定它派生自基本游戏实体) 这很好,但是这个特性在C++中是不可用的(我明白为什么,我没有抱怨。我觉得反射混乱,我犹豫在爪哇使用它,哈哈)。我只是想知道翻译这些数据最好的方法是什么。我的想法是一个基类,所有实体都可以从该基类派生(这似乎很标准),然后让加载程序根据TMX映射中的“type”值分配派生类型。我想到了两种方法来做到这一点 一个巨大的开关盒。冗长而令人厌恶。我怀疑是否有人会提出这一建议(但这是显而易见的) 使用std::map,它将任意类型名称映射到一个函数,以分配与所述类型名称对应的所述类 最后,我考虑过将实体创建为一个基类,并对不同的实体类型使用脚本。脚本本身将向系统注册其实体类型,尽管游戏需要在加载时加载所述实体类型脚本(这可以通过一个主实体类型声明脚本完成,这将使每个实体的编辑数量减少到2:实体创建和实体注册),c++,entity,tmx,C++,Entity,Tmx,虽然选项二看起来不错,但我不喜欢为每种类型更改3段代码(定义实体类、定义分配函数以及将函数添加到std::map)。选项3听起来不错,除了我脑子里想的两件事:我害怕纯脚本驱动实体的速度。此外,我知道向我的引擎添加脚本本身将是一个大项目(添加所有用于与库接口的助手函数将非常有趣) 有人知道更好的解决方案吗?也许不是更好,只是更干净。每个实体类型的代码编辑更少。如果使用工厂自注册,可以减少解决方案2中的代码更改数量。缺点是实体知道该工厂(自注册),并且该工厂必须是全局(例如单例)实例。如果这对你来说

虽然选项二看起来不错,但我不喜欢为每种类型更改3段代码(定义实体类、定义分配函数以及将函数添加到std::map)。选项3听起来不错,除了我脑子里想的两件事:我害怕纯脚本驱动实体的速度。此外,我知道向我的引擎添加脚本本身将是一个大项目(添加所有用于与库接口的助手函数将非常有趣)


有人知道更好的解决方案吗?也许不是更好,只是更干净。每个实体类型的代码编辑更少。

如果使用工厂自注册,可以减少解决方案2中的代码更改数量。缺点是实体知道该工厂(自注册),并且该工厂必须是全局(例如单例)实例。如果这对你来说没有问题,这个图案会很好。每个新类型只需要编译一个新文件的链接

您可以像这样实现自注册:

// foo.cpp
namespace 
{ 
  bool dummy = FactoryInstance().Register("FooKey", FooCreator); 
}

< /P>我喜欢这个想法,但是我想值得一提的是,为了实现这个目的,实体需要某种静态初始化程序(以便在没有主函数的情况下登记它自己,从而缩短代码编辑的数量)。C++中,“实体”不是“可能的”。但是可以这样实现:

class Foo{private:static bool\uu st_init;static bool static_init(){/*在static init time做任何需要的事情*/return true;//或false来指示static init fail};bool Foo::u st_init=Foo::static_init()好吧,代码在注释中看起来很糟糕,但希望你能看到我的观点。非常有趣,这个解决方案与我的类似,但更切题。我也喜欢在那个页面上实现的抽象工厂。总之,很棒的东西。谢谢!