Articles of 实体系统

我怎样才能在组件实体引擎中定位精灵?

我正在构建我的第一个组件/实体引擎,我不确定我的一些select。 我在这里问我第一个疑问的建议。 我画了两个不同的行为的对象: 物理驱动的位置。 其他逻辑定义的位置。 目前,我只创建了第一种对象,添加到一些实体的一个Render component (其中包含关于要绘制的精灵的信息)和一个包含正文信息的Physic component 。 Rendering system仅将Render components sprites连接到主视图, Physic System将拥有拥有Physic component每个实体并为每个实体定义精灵位置。 问题1) 直接通过物理系统访问(和修改)Sprites职位是否是一个有效的select? 问题2) 对于第二种types的对象,我应该使用只负责这个的第三个组件来管理精灵位置吗? 这是一个有效的解决scheme,或者我完全错了吗? 我对如何用这种系统管理逻辑和职位感到有点困惑……为我需要定义的每一个行为创建一个组件似乎有点令人难以置信。

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

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

如何通过单个事件最好地解决多个组件修改?

我试图通过一个事件来解决多个组件的修改。 有没有更好的方法来处理这个问题? 我有一个标签实体,关心盾牌实体的生命值组件何时被修改(损坏,再生等)。 标签将需要更改 其文本显示当前屏蔽剩余的百分比。 其文本颜色来显示屏蔽剩余的严重性。 当我的ShieldSystemparsinghitPoints组件时,运行下面的代码。 对于我计划倾听的eahtypes的修改,我需要为for -loop添加一个新的if -statement。 这意味着如果不止一个人想要修改任何监听的文本组件,sprite组件等,系统之间有一堆重复的代码。 for(int i =0; i < listeners.size(); i++) { if(listeners.count(MessageType::CHANGE_TEXT) == 1) { std::vector<Entity*> entities = listeners[MessageType::CHANGE_TEXT]; for(int j; j < entities.size(); j++) { Entity* e = entities[j]; MessageInfo* messageInfo = new MessageInfo(MessageType::CHANGE_TEXT, e, "Some Text"); MessageCenter::Dispatch(messageInfo); } } // Add an If(listeners.count(MessageType::CHANGE_TEXT_COLOR)… // Add […]

如何在实体组件系统中实现空间分区?

我的系统在组件上工作,而不需要任何关于实体的事情。 我想实现简单的网格划分,所以每个实体将根据其当前位置被赋予一个单元格。 但是系统如何知道哪些组件要更新? 例如:CollisionSystem必须检查单元内的每个组件之间的碰撞,但CollisionComponents必须以某种方式附加到网格上,以便系统知道要testing哪个碰撞,这似乎不是一个好的解决scheme。 我该怎么办?

实体组件系统:将指针存储在组件到实体中

我想知道是否将一个指针存储在拥有组件的实体的每个组件中是一个坏主意。 比如我有一个组件“NPC”。 拥有这个组件的每个实体也必须有一个Position和Sprite组件。 有时我从我的系统中获得一个NPC组件列表,但是我也需要相应的Position和Sprite组件。 我可以检索实体,但是我必须input相当多的代码,而且比指针更加昂贵。 所以将一个指向实体的指针存储在一个组件中是一个坏主意?

组件 – 实体系统代码生成

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

在创建关卡时处理创建实体

我目前正在研究一个基于2D的物理学平台,有点像超级肉的风格。 在超级肉的男孩,你有多个层次,我想要一个类似的东西,但有一个一般的方式来处理创建实体在一个层次的开始。 因为我正在使用一个实体组件devise和使用平铺编辑器来加载水平(甚至lua脚本做一些更多的configuration/水平相关的逻辑),我将如何处理创建实体? 目前,我parsing我的平铺的XML映射,并做类似的事情 if("MovingPlatform"){ createMovingPlatform(mapObject) }elseif("SomeOtherEntity"){ } //… so on so forth 但是,这将很快成为if语句的一个非常长的分支来加载我的实体。 有没有一个更清洁的devise模式或这样做的方式。 我正在考虑使用一个地图或string来创建该实体的类,如下所示: //in constructor of level loader entityCreatorMap["MovingPlatform"] = MovingPlatformEntityLoader() //somewhere later creating my entities by parsing xml entityCreatorMap[mapObject.getName()].create(mapObject) 但是,这将是很多线初始化这些对象。 有任何想法吗?

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。 我是否误解了实体系统? 如果有人有任何建议,我会很高兴听到它。 谢谢。