Articles of 实体系统

摘要使用ECS进行攻击的能力

正如标题所示,我的问题是如何使用ECS(实体组件系统)来抽象“攻击”的概念。 我正在做的“游戏”是一个实时的roguelike,所有敌人/ NPC /玩家都是一个实体(只是一个Id)的组件。 我阅读了这个链接 ,这有助于澄清有关攻击系统的一些事情,但我仍然困惑如何与ECS一起实施。

实体组件体系结构 – 多个组件之间的初始化

我开始研究等距世界中的游戏,并且我在理解如何实现实体组件系统思想的某些方面时遇到了一些麻烦。 这里是我到目前为止的组件和系统: WorldData(只有一个使用过,包含地图和单元格大小)Camera(目前也只有一个曾经使用过,虽然可以改变我猜)WorldPosition(只包含X和Y值,在世界空间)Renderable(包含要绘制的图像,屏幕位置值+偏移量和深度)地板(包含地板types和步行速度) 现在,如果我使用WorldPosition,Floor和Renderable组件创建一个实体,那么我应该如何将逻辑强制执行某些规则。 例如,如果Floor.FloorType设置为“Grass”,我希望Renderable组件中的图像设置为“floor-grass.png”。 是否应该在“FloorSystem”这个名为“FloorSystem”的东西中进行检查,它会检查每个拥有Floor和Renderable组件的实体并更新它们? 如果是这样,我是否需要在Floor上的某种“脏”标志来说明它什么时候发生变化,以便FloorSystem知道更新它,而不是更新每个框架中的每个地砖? 或者,我是否会创建一个“脏”的组件,当它发生变化时,我会附加到该组件上? 任何指导将非常感谢! 我喜欢这个建筑的普遍优雅,我认为一旦我得到更好的处理,它将在我的游戏中运行良好。

实体组件系统中的通信模式

我正在为我的游戏join另外两个主要组件:用于通信的事件总线和用于加载脚本的Lua解释器。 现在,父元素是一个框架/游戏对象,引用了所有这三个组件。 我的问题是,最好的沟通模式是什么:将解释器和任何其他编排对象钻入每个系统,或者将所有这些调用集中在事件总线的下标中,并从中做出一切。 例: //计划A public class CollisionEntitySystem extends EntityProcessingSystem { LuaEngine mEngine; EventBus mBus; MoreThings mThings; public CollisionEntitySystem(LuaEngine engine, EventBus bus, MoreThings things){ mEngine = engine; mBus = bus; mThings = things; } @Override protected void process(Entity e) { //Something wonderful happened here mEngine.load("onCollision.lua", parameters); } }; //计划B public class CollisionEntitySystem extends EntityProcessingSystem { […]

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

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

组件和系统在实体组件系统中如何相互关联?

我试图学习和理解ECS(实体组件系统),以便使用这种devise模式创建一个游戏,但是我有很多东西我还是不明白。 可以说我有一个PositionComponent和一个MovementSystem或PhysicsSystem 。 PhysicsSystem很大程度上依赖于PositionComponent,因为为了计算刚体运动,它需要PositionComponent包含的x和y位置(在2D游戏中)。 组件和系统之间有什么关系? MovementSystem如何从PositionComponent获取x和y值?

如何有效地处理大块之间移动的实体?

我正在做一个游戏,其中的实体需要存储在大块。 这是基本的块格式: public static Entity [row][column][entities] chunkEntities; 但是,我的一些实体移动。 如何处理切换块的实体切换,以及最有效的方法是什么?

实体组件系统,如何分离需要实体的组件作为参数?

我使用Artemis实体系统框架,C#端口 。 我有一个处理项目和使用它们的好方法的问题。 游戏主要是由AI驱动的,所以不是玩家互动,而是AI。 AI基本上是由AISystem运行的AISystem 。 AI有帮助函数,它允许它find所有的项目(即与InteractiveComponent实体),然后它可以path查找并使用该项目。 AI使用存储在其组件中的BehaviorTree 。 我有InteractiveComponent ,允许玩家和AI Use实体。 我有这个工作,但它看起来有点肮脏的解决scheme。 Use方法是由绑定到该组件的Item对象实现的接口。 这样我可以有以下项目: new InteractiveComponent(new AwesomeItem()); 呼叫Use要求我: 获取实体参考 查找组件“InteractiveComponent” interactiveComponent.use(我) me是(这个)实体。 正在调用该用途的AI实体。 我正在将实体传递给Use方法,因为使用某些东西可以改变实体。 它可以添加组件,检查它是否有特定的组件,然后修改数据或删除组件,甚至可以删除该实体。 所以,我有点迷路了 这工作,所以这是“好”我猜,但它看起来很脏。 我还没有find一种方法来允许一些InteractiveSystem使用项目,而不会增加巨大的复杂性问题(当你试图迫使Entity系统做一些它不容易的事情时,会很快产生这些问题。 所以,问题是: 如何解耦这样,我不必将实体传递给组件? 我对目前的代码感觉不太好,但到目前为止,这是我们提出的最好的解决scheme。

ECS引用另一个实体的属性

在一个实体组件系统(实现的组件只包含数据,系统运行在数据组上)可以保证系统运行的实体具有所需的数据。 例如,如果一个MovementSystem同时具有Transform和RigidBody组件,则MovementSystem只能在一个实体上运行。 运动系统知道,实体拥有执行其逻辑所需的所有数据。 我发现的问题是,如果一个系统需要操作另一个实体的属性 – 我们不能保证这个其他实体有我们想要操作的数据。 让我们使用一个人为的例子,因为我喜欢代码 DamageComponent: DamageComponent(target, damage) : Component { Entity target = target; int damage = damage; } HealthComponent: HealthComponent(health) : Component { int currentHealth = health; } 系统: DamageSystem() : System { // Operates on all Entities which have a DamageComponent DamageComponent dc = this.entity.getComponent(DamageComponent); // damage the target every […]

在实体攻击中触发攻击和take_damage事件?

我有一个身体健康,装甲和伤害的Entity类。 我希望我的实体在攻击或受到伤害时提出某种attack和attack事件。 这是我目前的实现: class Entity: """Base class for all entities.""" def __init__(self, name, health, armor=0, damage=0): """Initializes a new entity.""" self.name = name self.base_health = health self.base_armor = armor self.base_damage = damage self.events = event_dict('take_damage', 'die', 'attack', 'kill') def take_damage(self, damage, attacker=None): """Takes damage from a source.""" final_damage = damage * (self.armor / (100 + […]

实体系统的通用多个容器派生类

我正在为游戏开发一个实体系统。 我已经读过,caching对于遍历实体及其组件的常见操作非常重要。 目前我有一个包含实体列表的世界类,以及每个组件的列表。 class World { vector<Entity> entities; vector<PositionComponent> position_components; vector<SpeedComponent> speed_components; … }; 这样做的想法是让内存中的实体和组件连续caching。 问题是你必须为每个不同的组件编写特定的代码,因为它是在源代码中硬编码的。 一个解决scheme可能是具有Component *的matrix,其中matrix的第i行是所有PositionComponents,依此类推。 这个问题是,与指针你没有连续的内存和caching友好的破解。 编写generics代码的最好方法是什么,仍然有caching友好的数据?