我完全迷失在试图将Richard Lord's Ash Framework移植到“纯”C++ (MSVC Express2008)上,或者至少我没有找到任何类似的实现,我正在处理boost:fusion库来实现框架所需的最小反射要求,但模板元编程对我来说是新的,我被编译器错误和耗时的失败测试所淹没:( ...
有人知道移植框架的可行性或有用性吗?
以Entity类为例,有没有人能解释一下我如何才能达到这样的效果:
(这是FLEX代码!)
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())));..。
发布于 2013-11-27 06:44:18
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替换,但因为这会破坏可用性实体存储对其组件的引用,以便程序员更容易解析。
https://stackoverflow.com/questions/20221184
复制相似问题