Articles of 实体系统

我们如何协调系统在ECS内处理的订单?

如果我在编译时知道所有的系统,我可以自己订购。 不过,我打算有用户定义的mods。 这增加了一层复杂性,因为我(作为框架开发者)不知道哪些mod将被开发,或者被安装在特定用户的机器上。 我想过添加某种执行顺序 // within core code systemRegistrar.register(PhysicsSystem.class).before(RenderingSystem.class); // within third-party mod systemRegistrar.register(ModSystem.class).before(PhysicsSystem.class); 我曾经想过使用某种消息或事件总线的偶然订购 // within core code // – PhysicsSystem public void update() { // do physics-y stuff eventBus.send(new PhysicsSystemUpdatedEvent()); } // – RenderingSystem public void handle(PhysicsSystemUpdatedEvent event) { // do rendering stuff eventBus.send(new RenderingSystemUpdatedEvent()); } 但是这会模糊将会发生的事情和可能发生的事情之间的界限。 我想到的另一个想法是,我们可能会有点脏 ,不关心系统执行的顺序太多,因为即使我们在应用物理之前渲染,下一帧也会渲染物理更新在前一帧中进行的。 这是一致的,但它模糊了框架内发生的事情之间的界限。

如何确定在不破坏封装的情况下在基于组件的系统中呈现什么animation?

在基于组件的系统中,应该如何改变实体的渲染/视觉状态,以便我知道要使用什么animation而不破坏封装? 我的猜测是,它必须是基于消息的系统,而不是基于查询的系统,因为if检查每个帧以确定基于其他组件的属性的值的正确animation,非常有效。

实现像类的系统而不仅仅是函数的好处

在一个实体系统中,有一个名为World的中心类,它存储所有的组件实例。 这是一个数组字典,实体ID是数组的索引。 要访问一个id = 3的实体组件,你可以这样做: world.storage["ComponentType"][3] 。 所以,在游戏的每一个循环中,这些数组都会被传送到他们尊敬的系统( movement(world.storage["Position"], world.storage["Velocity"]) )。 现在,我不明白为什么系统不能像function一样实现,正如我所展示的那样。 用数据和方法(caching)使用类可以做什么优化? 另外,这些系统需要迭代所有存在的实体,这不会使entity framework比基于常规的基于引擎的引擎慢得多吗? 为什么有些人把系统“注册”到World级?

服务器架构软件方面

我正在制作一些类似Terraria的游戏。 我有几个原型,但其中大多数使用“实体组件系统”(ESC)和一些自定义的地形实现。 现在我已经达到了我想要研究一些多人游戏技术的部分。 所以我在这里。 这是我迄今为止; *我想在Python中编写服务器,我不需要,但我喜欢python,因为我觉得我可以很容易地改变逻辑,它的工作原理。 知道,我的第一个问题是, ESC,应该在服务器上运行,对吧? 但是,如何在客户端和服务器之间同步实体和组件? 当客户端连接到服务器时,我如何同步世界? 世界随着它的扩展而随机生成。 有人可以解释或链接一些关于如何完成服务器实体 – >客户端实体的数据吗? 以及如何同步地形?

select渲染所需的实体

目前我正在sorting和循环每个实体在我的水平,但我真的不需要。 只有一小部分将在屏幕上。 如果我可以从屏幕上(或靠近屏幕)的主列表中提取一个实体列表,那将是非常棒的,但是我相信维护一个不同types的列表,比如四叉树或者其他可能是有序的,但是我没有这方面的经验。 我怎样才能做到这一点?

与阿尔忒弥斯画小精灵

我正在尝试跟踪StarWarrior代码(Artemis教程)。 我无法弄清楚这些精灵是如何绘制的。 这是玩家船舶初始化的代码: /// <summary>The initialize player ship.</summary> private void InitializePlayerShip() { Entity entity = this.entityWorld.CreateEntity(); entity.Group = "SHIPS"; entity.AddComponentFromPool<TransformComponent>(); entity.AddComponent(new SpatialFormComponent("PlayerShip")); entity.AddComponent(new HealthComponent(30)); entity.GetComponent<TransformComponent>().X = this.GraphicsDevice.Viewport.Width * 0.5f; entity.GetComponent<TransformComponent>().Y = this.GraphicsDevice.Viewport.Height – 50; entity.Tag = "PLAYER"; } 哪一行代码实际上导致船只被绘制? (绘图发生在PlayerShip.cs中)下面是我认为正在发生的代码的注释版本: /// <summary>The initialize player ship.</summary> private void InitializePlayerShip() { Entity entity = this.entityWorld.CreateEntity(); //declare and […]

如何正确使用unordered_multimap作为实体和组件存储?

安装程序 我用面向对象的方法做了几个游戏(更像是animation),扩展了这些对象的基类以及扩展这些对象的对象,并且发现我无法把头部扩大到更大的游戏思路。 于是我做了一些研究,发现了devise游戏的实体组件系统。 我非常喜欢这个想法,并且在阅读Byte54的完美答案之后,彻底地理解了它的用处: 在基于组件的实体架构中“系统”的作用是什么? 。 有了这个说法,我决定使用描述的Entity-Component系统来创建我目前的游戏理念。 有了C ++和SFML的基本知识,我想使用一个没有实体本身的类的unordered_multimap来实现这个实体组件系统的主干。 这是这个想法: unordered_mulitmap将实体标识存储为查找项,而该值是一个inheritance的Component对象。 Examlpe: ____________________________ |ID |Component | —————————- |0 |Movable | |0 |Accelable | |0 |Renderable | |1 |Movable | |1 |Renderable | |2 |Renderable | —————————- 所以,根据这个对象映射,ID为0的实体有三个组件: Movable , Accelable和Renderable 。 这些组件对象存储实体特定的数据,如位置,加速度和渲染标志。 这个实体就是简单的ID,其中的组件附着在描述其属性的ID上。 问题 我想在地图中存储组件对象,允许地图拥有组件的完全所有权。 我遇到的问题是,我不太了解指针,共享指针和引用以获得设置。 我怎样才能在unordered_multimap内初始化这些组件,以及它们的各种成员variables呢? 当定义map为unordered_multimap<int, component>时,基类component类是否可以接受其子类的成员variables? 要求 我需要一个系统能够抓取一个实体,以及所有的附加组件,并从组件中获取成员,以便对位置,速度等进行必要的计算和重新分配。 需要澄清? 发表评论与您的​​关注,我会很乐意编辑或评论回来!

在实体系统中定义碰撞响应

我正在构建一个非常简单的自上而下的2D射击游戏,它使用了一个实体组件模式。 我已经添加了几个不同的实体到一个级别,并给他们不同的碰撞组。 我有一个实体来代表传送者(分配给碰撞组A),一个玩家实体(B组)和一群敌人(C组)。 我知道实际的碰撞响应应该在碰撞系统中根据碰撞实体所属的组来决定。 我无法弄清楚如何定义碰撞的细节。 例如,如果一个玩家与一个传送器发生冲突,我需要将玩家移动到关卡上。 我在哪里存储目标位置? 我假设在传送器上的一个组件。 我应该为这些数据创建一个全新的组件吗? 我觉得它应该存储在传送器碰撞组件中,但是并不是所有使用碰撞组件的实体都需要这个数据。 有人可以请尝试开导我吗? 谢谢

实体组件系统,组件之间的通信

我正在尝试为我简单的2D游戏实施ECS。 我想问一个关于组件如何与实体进行通信的问题。 我试图实现一些组件,如SpriteComponent , MoveComponent , CollisionComponent等。这些组件之间的适当通信方式是什么? 例如我的Sprite&Physics组件需要知道当前的位置,这受到Move组件的影响。 我给了我的每个组件句柄,指向实体,他们可以发送到引擎并调用不同的函数,如updatePosition(EntityHandle handle, float x, float y) 。 这是正确的方法吗?

实体组件系统中的碰撞响应

这个问题似乎是我的一个重复,但我不认为这是问题。 我试图用ECS来构建一个游戏,但是我希望这个ECS尽可能简单,所以我在回避消息。 我的问题是这些行为应该在哪里进行碰撞响应。 不是身体的反应,而是合理的反应(例如子弹伤害玩家,玩家拿起健康,爆炸摧毁敌人)。 是否有一个大的HandleCollisionsSystem,或每种types的碰撞都有自己的系统,或者逻辑是否在碰撞实体的一个或两个组件中(但是一个组件只是数据,对不对?) 我确信有几种方法,但是现在我想在简单的方面犯错。