Articles of 实体系统

实体组件系统中的SceneGraph,转换

我最近正在学习实体组件系统,并开始将其实现到我的testing引擎中,但是我遇到了一个与场景graphics相结合的问题,这是我第一次尝试。 我所有的实体都有一个TransformComponent ,用于转换场景中的实体,包括位置,旋转和缩放。 这是我如何做到这一点: transform.reset(); Entity entity = this.entity; while (entity != null) { if (!lockScale) transform.scale(entity.scale); if (!lockRotation) transform.rotate(Vector3.AXIS_Z, entity.rotation); if (!lockPosition) transform.translate(entity.position); entity = entity.parent; } TransformComponent对所有的实体都是存在的,因此它不能从实体中删除,我限制它。 现在我有另一个组件,称为包含多边形的CollisionComponent ,以及发生碰撞时的callback以及碰撞标签。 它在更新时更新多边形的位置: polygon.setPosition(entity.position); polygon.setRotation(entity.rotation); polygon.setScale(entity.scale); 这对所有在场景中的实体都是有效的,它们被显示在正确的位置,并且碰撞正在工作。 这个问题从实体的子女开始,如果他们在场。 我附加了一个位置设置为(0,50)的子实体,其坐标系对于父实体系统是本地的。 但是在这里,graphics正确地工作,在旋转父对象时,由于变换matrix,子对象也旋转,但多边形停留在本地位置。 我现在所想的解决scheme是将实体位置放置在全局坐标系中,即使它们位于实体的子元素中,并且即使在父元素移动时也能正确地转换变换。 我怎样才能做到这一点?

在通过networking发送数据或将数据存储在文件中时,可以使用什么系统来识别我的实体?

我有一个使用实体组件系统(ECS)的游戏引擎。 我通过为不同组件types注册序列化器的系统来序列化ECS中包含的数据。 我想创建networking,使用权威的点对点,我仍然有一个服务器,但它只作为交通中心,不运行游戏逻辑。 这个想法是特定的实体跨客户端实例同步。 但是,这有一个问题。 虽然我可以轻松地序列化我的数据,但我不知道如何通过networking进行同步,或从文件加载它。 问题在于我的系统如何沟通。 我怎么知道哪个实体是另一端? 我如何让接收方知道发送的数据是用于哪个实体? 我的实体ID目前是作为连续号码生成的,但是使用它们感觉非常不可靠,因为可能有一段时间数字不同步。 例如,可能会更快地创建一个贴花实体,或者它们的创建顺序可能不同。 这也使得种子随机GUID无法使用。 在通过networking发送数据或将数据存储在文件中时,可以使用什么系统来识别我的实体?

创建多个渲染系统在实体 – 组件系统中绘制不同的实体

在创建基于ECS的游戏引擎时,你(或者我可以)创建多个渲染系统吗? 比方说,我有一个实体类,这是我的引擎中的基本单位,它所能做的就是添加,删除和获取附加的组件。 我有一个组件类,它只是一个类,其他组件可以派生并保存可用于定义实体的数据。 我有一个绘制方法的RenderSystem接受要绘制的实体。 我的问题是,我必须(或可以)创建RenderSystem的不同派生来满足不同的渲染? 一个例子是渲染精灵时,我必须创建一个单独的SpriteRenderSystem和animation我必须创建AnimationRenderSystem ? 另外我有一个世界级的管理一切,与实体和组件经理和系统。 那个类有一个Update和Draw方法。 所以,我必须检查正在处理的实体是否是特定types的SpriteEntity或AnimationEntity,并使用特定的渲染器? // World class … void Draw() { // Loop through all entities for (…) { // Check for specific entities if (entities[i] is SpriteEntity) { // Call specific sprite renderer _spriteRendererSystem.Draw(entities[i]); } else if (entities[i] is AnimationEntity) { // Call specific animation renderer _animationRendererSystem.Draw(entities[i]); } […]

我如何需要使用Entity-Component-System模式标记不同的(但有点相似的)实体

我有一些武器 – 手枪,霰弹枪,步枪。 我有一个处理所有武器的系统,另一个系统只处理手枪。 所以我需要创造“武器”和“手枪”两个组成部分,然后把它们加到实体 – “手枪”中。 所以现在我们有下一个组件 – “武器”,“手枪”,“步枪”,“霰弹枪”,因为将来我可能需要为不同的武器分开制造。 然后出于同样的原因,我创建了下一个组件 – “角色”,“玩家”,“敌人”,“朋友”(也许更多types的敌人和朋友),“弹药”,“弹药ForPistol”,“AmmoForRifle”有太多不同的组件仅用于标记关于types的不同实体。 我怎样才能避免这个数量的组件?

为实体组件系统中的实体指定types(超级实体 – 语法糖)

我从零开始使用C ++创建了ECS框架。 一切工作正常,但我认为我的代码是不是很可爱(在#1 ): – class RocketComponent{ Entity mainBodyGraphic; Entity topGraphic ; }; //inside some system (script-like) void createRocket(){ Entity mainBodyGraphic = graphicFactory->createCylinder(); Entity topGraphic = graphicFactory->createCone(); //^ internally create entity (with graphic component and others), // then attach together Pointer<RocketComponent> rocket = create<RocketComponent>(); rocket->mainBodyGraphic = mainBodyGraphic; rocket->topGraphic = topGraphic; //…. other logics …. } […]

ECS – 组件内部的组件?

阅读ECS,如果你可以称之为“游戏”,我试图实现一个简单的“游戏”。 基本概念 : 你有行星(实体),他们生产黄金。 ( 黄金是地球内部的一个组成部分) 行星可以自己建造建筑物( 建筑物部分) 建筑物(实体)具有相关的黄金成本( 成本部分) 但是成本组件中有黄金 (或无论如何) 至于我的问题: 我接近我对ECS的解释(组件是否应该在其他组件内?) 资源是否是有效的组件? 如果不是的话,放置它们在哪里是有意义的? 编辑清晰度: ECS – 实体 – 组件系统。 我的实体是组件的空哈希表。 我的组件用于游戏逻辑的系统内部,Treasury实体具有Gold组件,IncomeSystem更新该组件。 其他组件(可建设,人口,可移动)

如何在一个实体组件系统中管理变化的Z-Index?

如果有一个基于实体组件系统的游戏项目(如经典的塞尔达)。 Player和Enemys都是具有精灵和变形组件的实体。 武器也是具有精灵和变形成分的实体。 玩家和敌人可以拾起武器。 武器得到了一个ParentComponent,所以他们将被赋予载体实体的真实性。 有一个脚本/系统的。 每当一名玩家/敌人向上走时,武器必须放在背后的载体上,以便玩家走到屏幕的顶端。 我将通过使用武器之一切换载体变换部件的Z索引来做到这一点。 不幸的是,渲染系统是一个Sorted-Iterating-System,它包含一个带有Sprite-Components的所有实体的sorting列表,所以每次Im改变一个Entity的Z-Index时,我都要强制重新sorting列表。 这工作,但在java中sorting整个列表几乎每个gamellop更新听起来非常糟糕。 这真的是一个好主意,还是应该尝试别的? 顺便说一下:在实践中,我使用libGdx和Ashley作为ECS。

如何使用Ashley检测实体间的碰撞?

我正在开发一个使用Libgdx和Ashley的游戏,我想知道检测不同实体之间碰撞的最佳方法。 目前,我一直在使用ContactListener来检测不同types的实体之间的联系,但是我认为这可能会对游戏的性能产生负面影响,尤其是考虑到在移动应用程序中。 我想澄清,我想要执行的联系types是在玩家和硬币之间或者不需要身体的实体之间。

实体组件系统中的循环依赖关系

我正在使用一个实体组件系统在C ++中开发一个自上而下的射击游戏,并在尝试重构通电时遇到了问题。 目前我有一个PowerupSystem本质上是一个负载的if…else语句,直接修改播放器实体属性(例如速度)。 我想转向使用不同的PowerupComponent类,这些类inheritance自封装上电行为的基础PowerupComponent类。 SpeedPowerup就是一个例子。 这些派生类将有一个构造函数,它可以改变玩家实体中的值,还可以有一个析构函数将其设置回原来的值。 我遇到的问题是powerup的构造函数和析构函数需要访问玩家实体数据来进行这些更改(存储在我的World类中),给我一个循环依赖问题。 依赖关系是: 世界 – >电源系统 – >电源 – >世界 任何想法如何我能克服这个问题,赞赏。 在此先感谢,Rich。

实体 – 组件 – 系统devise

我读了很多关于ECS(战略)模式的内容,并且有几个问题。 考虑简单的空间游戏。 那里有星星。 明星是一个entity 。 如果我想做一个星系呢? 让银河成为一个entity看起来是合理的。 另一方面,星系只是一组星星。 在通常的面向对象devise中,我只是把它作为一个拥有星星/星星vector的类。 建立一个只是其他实体的容器的entity是否合法? 在某些时候不会刹车吗? 现在考虑行星系统。 它看起来像地球也是一个entity 。 但是将一颗行星与它的母星联系起来是明智的。 可能一个实体指的是另一个(有指针,或类似的东西)? 你将如何撰写? 提前致谢。