Articles of 实体组件

需要意见我的基于组件的devise

我有一个实体类和一个组件类。 实体类有一个附加组件的列表,每个组件也有一个成员variables,该variables是对它所连接的实体(循环devise)的引用。 然后,有EntityManager类,它有一个(你猜对了!)实体的列表,每个实体也有一个对其封装实体管理器的引用。 这种周期性devise的原因是由于数据依赖。 为了进一步解释,我的实体类实质上只是一个巨大的数据桶:实例化时,任何types的实体需要的任何数据已经存在于这个类中。 但是,为了使用这些数据,实体需要附加相关的组件。 例如,我的渲染组件将实体的spriteData成员和绘制到后台缓冲区。 没有渲染组件,spriteData不被使用。 由于我的组件需要访问实体的成员variables,所以每个组件都需要对它所连接的实体的引用。 例如,为什么我的实体需要引用实体管理器,这是因为某些组件(例如碰撞)需要访问其他实体的数据桶才能运行(对于碰撞,这将检查附近实体的位置向量并将其与组件的引用实体进行比较)。 除此之外还有更多的东西,但是我只想强调我正在做的事情的核心思想,并且想要一个像这样的周期性方法(只有很less的数据封装)是一个好主意。 也许我只是在过度嘲笑/耸耸肩。 关于如何引导devise的意见也将受到极大的赞赏。

Java:通过读取XML文件来创建一个用户定义的类的实例

我正在尝试为游戏编写引擎,特别是基于组件的引擎(在我的方法中,组件包含数据和逻辑)。 所以基本上我有实体,每个实体都有一个组件列表(每个组件都扩展了Component类)。 现在,我想能够在xml文件中为我的实体定义模板,并在运行时加载它们。 模板看起来像这样: <Entity> <Component name="MovementComponent"> <…Variables to be initialized…> </Component> <Component name="RenderComponent"> <…Animations…> </Component> </Entity> “name”属性是相应组件类的名称。 现在,当然组件是游戏特定的,所以我需要一种方法来创建组件的实例,并将其添加到实体的列表中,而不需要知道具体的类。 我想过Class.forName(“…”名称“属性…”)。newInstance(),但是这样我不能将组件添加到列表,因为它是组件的ArrayList和程序不能知道newInstance方法返回的对象实际上是Component的一个子类。 有没有简单的方法来做到这一点?

正确的方法来封装组件?

我在编写组件系统和实体系统方面已经尝试过了。 我还没有设法解决的是事件相撞的问题。 说,我们有一个组件A,B和C.一个触发器'杀B'事件。 当B收到它时,它将删除该消息(不会进一步传播)。 当C收到它时,它将删除B.哪个组件将首先得到事件的顺序没有定义。 当订单是'A,B,C'时,B保持活着,但'A,C,B'B被删除。 换句话说,事件的副作用是不确定的。 A,B和C需要彼此了解(我不想要)来正确处理事件。 我打算使用游戏的组件,因此更为实际的例子是:我们有一个箭头(子弹组件),在碰撞链接(Collidable组件)上触发一个碰撞事件。 链接有盾牌(也Collidable)停止影响链接健康组件的伤害。 箭头和健康都是在没有屏蔽的情况下编写的,我的组件架构应该被封装,所以Health在不知道箭头或屏蔽的情况下处理碰撞事件。 损坏是否停止取决于组件的顺序,这是随机的。 我所提出的最好的做法是保持事件在处理结束时会执行的“caching”,但是这个解决scheme仍然存在相同的问题,只是延迟了。 我可以抛弃事件,尝试在系统中存储“突变”的实体组件系统,但与仅仅使用全局数据完全不同。 编辑: 好的,我的沟通技巧很糟糕。 以下是我为了让组件工作而不知道彼此所做的事情: 使用“纯”实体系统(组件是纯数据,系统中的所有逻辑) 组件不会互相通话。 系统通过向实体添加系统专有组件来相互交谈 以上情况的系统是:移动,HandleCollision,ApplyArrowDamage。 在计算运动时,运动会将碰撞组件追加到碰撞(链接)的“接收器”中。 HandleCollision作用于Collision组件,将ArrowDamage组件附加到Link实体,并从Link中移除Collision组件。 ApplyArrowDamage可以做到这一点,并删除ArrowDamage组件,并可能附加死组件来处理elswere。 现在,为了创建遮挡箭头的情况,我创建了一个CheckShield系统,并将其放在HandleCollision和ApplyArrowDamage之间。 CheckShield与ApplyArrowDamage一起工作,检查接收者(在这种情况下是Link)是否有装备的盾牌,如果是,则移除ArrowDamage组件。 这样,我的旧代码不需要考虑新的代码正常工作,反之亦然。 对于'ABC'的情况,我也是这样做的:如果我想C删除B,我写了一个新的系统与C一起工作,然后在与B一起工作的系统之前开始工作。唯一的解决这个问题的方法是事件引发就是不断地重新抛出事件,当它改变状态时,不断重新抛出它直到它在最后一次迭代中没有改变。

组件 – 实体系统代码生成

我真的很喜欢组件实体的方法(我目前正在使用ASH haxe,但特定的语言/框架并不重要)。 然而,问题是 – 有太多的基本类需要频繁更新。 所以我想有像组件和节点的ymlconfiguration文件,并从中生成实际的类。 有没有现有的解决scheme,利用这样的codegen,或者一些通用的codegen解决scheme,应该很容易configuration这样的任务?

C ++实体组件系统:不同的行为

我正在尝试使用动作RPG类游戏,并使用alecthomas的一个修改版本的entityx,这基本上是一个实体组件系统。 我想要实现的一些东西真的很麻烦,因为我不知道如何把它放在组件上。 以下是我无法弄清的一些事情: 假设我有那些应该代表演员的实体,他们有健康,耐力,法力,属性……我如何实现一个定时的buff / debuff系统,而不会破坏ECS的目的? 每个角色可以同时受到多个BUFF的影响,BUFF可以影响到他们的任何事情。 一个组件只能保存这么多的数据,我不能为每个需要保存不同数据的buff添加一个新的组件。 如果我有一个连锁闪电的技能,我和一个演员一起施放,它会立即随机select和伤害敌方演员,游戏逻辑处理器只会清除伤害,并用RenderComponent为闪电效果创建一个实体。 但是RenderComponent只会告诉渲染处理器它是Lightning,数据在哪里描述哪个敌人被击中? 大多数技能效果对于其可渲染部分(如Source,Target,Intensity)具有某种参数… 这两个问题都基于同样的问题:我怎样才能在尽可能less的组件中表示具有不同参数的事物?

如何处理实体的初始化和破坏

我一直在使用ECS模式,随着游戏复杂性的增加,我开始对实体初始化和破坏代码的时间有问题。 我将以物理学为例,但同样的原则也适用于大多数其他方面。 首先几个定义: PhysicsModule – 低级物理系统(通常是一个像box2d的外部库) – 不知道ECS PhysicsSystem – ECS系统 – 作为低级模块与ECS其余部分之间的接口 EntityWorld – 负责创建和销毁实体并将其关联到系统的对象 例如,一个典型的情况是这样的: 1)实体从外部数据创建(Transform,ShapeData,CollidableData) 2)数据必须注册到PhysicsModule(使用ShapeData和CollidableData) 3)每一帧,PhysicsSystem向PhysicsModule询问相关对象的位置并更新变换。 重复一段时间。 4)实体在另一个系统被毁坏的方式很远 5)PhysicsModule需要被告知去除关联的物理对象 有问题的步骤是2)和5)。 我可以想到处理这个问题的两种方法。 让PhysicsSystem处理生命周期。 优点: 逻辑被封装在一个系统中 缺点: PhysicsSystem需要知道初始数据(ShapeData,CollidableData),在用PhysicsModule初始注册之后它是无用的 EntityWorld必须跟踪哪些实体被新鲜地添加或从系统中移除以通知它们 必须推迟对实体的破坏,以使其组成部分仍然可以在同一框架内获得 这种方法往往会导致长时间的事件链(跨越几帧),这是难以遵循的 为了使这个工作,主循环总是最终成为一个完整的混乱,以确保特定的inits,更新和销毁按正确的顺序完成。 所有的init和destroy代码都有一个地方。 优点: init数据不会在初始注册之后使用 init / destroy代码在一个地方 所有的清理工作都可以按正确的顺序在一个框架内完成 缺点: 这基本上成为上帝的对象,并知道游戏中的一切 整个事情可能变得非常混乱,所有可能的排列 必须推迟对实体的破坏,以使其组成部分仍然可以在同一框架内获得 目前我的游戏已经演变成第一个解决scheme,而且我遇到了很多问题,所以我正在考虑尝试另一种方法。 我提到的第二个看起来好一点,但确实涉及一个上帝对象,从我的经验来看,这是一个不好的做事方式。 另外,我看了一下ECS的各种实现,并注意到其中一些方法有通知系统的实体被添加/删除的方法,其中一些没有 – 所以显然有不同的方法。 我的问题是 – 是否有另一种处理实体初始化和破坏的方法,而不诉诸上帝对象或神环?

如何高效地过滤实体组件系统中具有特定值的组件(例如网格位置中的所有实体)?

我正在开发一个基于3D网格的游戏,我正在尝试使用ECS来实现它。 我有一个表示实体在网格上的位置的位置分量。 它由3个整数组成(例如[1,3,2])。 现在可以想象用户点击位置[1,3,2]。 我现在想要有效地检索位置[1,3,2]中的所有实体。 我只能看到一种方法来实现使用ECS。 我需要过滤所有具有位置分量的组件(这可以在O(1)中完成),然后通过所有位置分量进行过滤,只find等于[1,3,2]的位置。 这是非常低效的,因为我有一个十万个实体的位置组件循环,但我只需要它们中的一小部分。 需要注意的是,在任何其他情况下,我都不需要在单个帧中遍历所有十万个位置分量。 对于所有其他系统,我过滤既有位置分量又有其他分量的实体,所以我最终只能循环遍历每一帧中的一小部分位置。 这意味着我不能只是检索所有相关的实体作为循环的一部分,通过所有的位置,因为我没有这样的循环。 传统上使用OOP,我会从一个位置到一个包含所有对象的容器的字典,这将允许我完成O(1)中的上述内容。 从我的理解来看,这不是ECS的正确devise。 我是否误解了实体系统? 如果有人有任何建议,我会很高兴听到它。 谢谢。

如何获取ECS中的组件

我目前正在尝试开发一个使用基于组件的实体的游戏。 我现在面临的问题是如何屏蔽我的组件,并从实体中检索它们。 在这一刻,我使用一个枚举每个组件具有ab条目。 实体根据它们关联的组件定义掩码。 当我查询一个组件我传递相应的枚举值。 这里是一个基本的例子来展示我的代码如何工作: class Component { public: enum Type { A = (1u << 0), B = (1u << 1) }; virtual TypeBit() = 0; }; class Entity { public: shared_ptr<Component> GetComponent(Component::Type type); unsigned int TypeMask(); private: std::list<shared_ptr<Component>> _components; } 我喜欢的是我的方法是使用逻辑操作的位掩码的简单性,即查看系统是否对实体感兴趣。 我有的问题是,每次当我添加一个新的组件,我不得不添加一个新的枚举值。 这增加了错误的可能性,这就是为什么我更喜欢更通用的解决scheme。

在Entity中将组件(类)添加到unordered_map? (可能的typeid作为关键问题)

我有一个testing放在一起有几个简单的组件应该被添加到一个实体,但addComponent函数不工作; 我认为这与typeid /组件类inheritance有关,但我不确定。 它似乎添加一个单一的条目到types的地图,但没有别的。 任何帮助非常感谢,谢谢! #include <iostream> #include <unordered_map> #include <typeinfo> using namespace std; //———————————————————————- //the base component class Component { public: Component() {cout<<"new Component created\n";} }; //———————————————————————- //a "thing" component class Thing : public Component { public: Thing() {cout<<"new Thing created\n";} }; //———————————————————————- //a "what" component class What : public Component { public: What() […]

实体组件体系结构和脚本不使用线程

我正在为实践目的而devise一个小型游戏引擎,同时也将我的一些想法付诸行动。 到目前为止,我已经有了一些渲染,声音等系统。下一步是将所有这些东西放在一起。 我已经看过实体组件系统,特别是下面的文章: http : //www.gamedev.net/page/resources/_/technical/game-programming/implementing-component-entity-systems-r3382 我认为这种方法适合我的需求到了一定的水平,但我也想在脚本中实现游戏逻辑本身。 我想出了一个稍微不同的方法: 渲染,声音,物理,input和仿真系统对数据执行操作,这基本上是一个级别对象和一​​个实体列表(由于技术原因,我必须区分实体和级别几何)。 特定系统只对符合其标准的那些实体执行操作(例如,物理系统只处理具有包围体的实体)。 在我的方法中,系统不直接执行行为。 相反,他们要么创建输出(渲染,声音)或input(物理,input)。 仿真系统管理可能分配给实体的脚本。 一个实体的脚本由两部分组成,首先是在实体添加到场景时执行的初始化代码,其次是每帧执行一次的代码(或更less,取决于代码是否包含等待语句)。 此外,每个实体都可以实现事件处理程序,只要input或物理系统抛出事件(例如CollisionEvent,KeyDownEvent等),就会调用它们。 实体脚本可以定义参数,这些参数可以在关卡编辑器中修改。 我的问题是,这个架构是否有一些严重的弱点。 由于我想避免线程化,所以我的脚本将被仿真系统调度,这导致我限制了每帧调用一次实体脚本的限制(这意味着应该避免循环,因为基本上所有东西都已经在一个大循环内)。 这是合理的还是有更好的办法?