我在尝试将Richard Lord's Ash Framework移植到“纯粹的”C ++(MSVC Express 2008)时完全迷失了,或者至少我还没有找到任何类似的实现, 我正在搞乱提升:融合库来实现框架所需的最小化反射要求,但模板元编程对我来说是新的,我遇到了编译错误和耗时的故障测试:( ...
任何人都知道移植框架的可行性或实用性吗?
以Entity类为例,有人可以澄清我如何实现如下结果:
(这是灵活的代码!)
waitEntity = new Entity( "wait" )
.add( new WaitForStart( waitView ) )
.add( new Display( waitView ) )
.add( new Position( 0, 0, 0 ) );
使用这样的C ++实现吗?
...
namespace bf = boost::fusion;
namespace bm = boost::mpl;
template<typename ComponentMap>
class EntityASH{
public:
EntityASH(ComponentMap c)
:m_components(c){ }
//"fusion-style" trying to return a new Components template entity for a new component type
template<typename T>
EntityASH
template<typename T>
/*¿Here im absoltely lost
EntityASH<
result_of::as_map<
typename result_of::push_back<ComponentMap,
fusion::pair<T,T>
>::type
>
>*/
EntityASH *add(){
typedef bf::pair<T, T> newTentryPair;
//bf::as_map(bf::push_back<ComponentMap,newTentryPair>(m_components,newTentryPair()));
return new EntityASH(bf::as_map(bf::push_back<ComponentMap,newTentryPair>(m_components,newTentryPair())));
...
答案 0 :(得分:0)
C ++中的构造函数无法返回某些内容,因此您必须使用另一种方法来创建实体,createEntity()将返回实体对象的引用或std :: shared_ptr。
我认为在这里使用模板没有任何优势,因为存储对组件的引用对我来说似乎更正确,因为组件是实体的一部分而不属于实体:
std::shared_ptr<Entity> createEntity() {
return std::make_shared<Entity>();
}
...
std::shared_ptr<Entity> addComponent(ComponentBase comp) {
mComponents.add(comp);
return shared_from_this();
}
...
createEntity().add(new Position())
.add(new Display())
.add(new Position());
我不明白你为什么要在这里使用模板?您是否希望组件成为实体类型的真实部分?这意味着您无法在运行时以简单的方式添加/删除组件。
我认为在大多数ECS中,实体只是出于可用性原因而存在的容器,并且可以完全由简单的整数ID替换,但是因为它破坏了可用性实体存储对其组件的引用,以便程序员更容易解决。 / p>