Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Data structures 如何处理ECS中的动态分层实体_Data Structures_Game Engine_Entity Component System - Fatal编程技术网

Data structures 如何处理ECS中的动态分层实体

Data structures 如何处理ECS中的动态分层实体,data-structures,game-engine,entity-component-system,Data Structures,Game Engine,Entity Component System,这是一个类比:我有一个有机体,它是由细胞组成的,而细胞又可以进一步由一堆附件组成 我目前拥有的是一种子/父级之间的事件链,用于处理连接和分离组件(可能会影响链上的任何内容),它根本不涉及ecs,它们是实体中的函数 现在我已经使用了事件组件(用于对象上的鼠标事件)。如果我希望系统是纯的,我会在附加组件时创建附加组件吗?即使如此,我如何将所有必要的收件人发送到使用该组件的系统?用这种方式而不是一系列功能来处理它是否值得?有更好的方法吗?免责声明:我不确定我是否正确理解了你的问题。如果不是,我为谣言道

这是一个类比:我有一个有机体,它是由细胞组成的,而细胞又可以进一步由一堆附件组成

我目前拥有的是一种子/父级之间的事件链,用于处理连接和分离组件(可能会影响链上的任何内容),它根本不涉及ecs,它们是实体中的函数


现在我已经使用了事件组件(用于对象上的鼠标事件)。如果我希望系统是纯的,我会在附加组件时创建附加组件吗?即使如此,我如何将所有必要的收件人发送到使用该组件的系统?用这种方式而不是一系列功能来处理它是否值得?有更好的方法吗?

免责声明:我不确定我是否正确理解了你的问题。如果不是,我为谣言道歉


为了处理ECS中的层次结构,您可以使用类似于以下内容的专用组件:

struct relationship {
    entity_type first{entity_null};
    entity_type prev{entity_null};
    entity_type next{entity_null};
    entity_type parent{entity_null};
    // ... other data members ...
};
其中,
entity\u type
是您用于实体标识符的类型,
entity\u null
是您的表达方式-这尚未设置。这两件事主要取决于实际执行情况。例如,在my own()中存在
entt::null
,这是一种在类似这样的情况下使用的null实体

让我们现在考虑层次结构中的通用节点: *

parent
是父节点的实体标识符,因此您可以轻松地将树(层次结构)从叶遍历到根。 *
first
是第一个子节点的实体标识符,即当前标识符为根节点的子树的叶或内部节点列表。 *
prev
next
是当前节点的同级实体标识符

当您想要访问节点的所有子节点时,可以从
第一个
实体(其第一个子实体)开始,通过访问
下一个
一次迭代一个,直到它变为空。当您想从节点返回到其父节点时,只需使用
parent

此解决方案的一个优点是,子项列表是根据组件隐式定义的,您不必为它们使用
std::vector
或类似的工具。因此,您的组件中没有动态分配的内存来创建层次结构

如果你感兴趣,我也写了一篇关于这个话题的文章。如果你想了解更多细节,你可以阅读