Articles of 实体系统

游戏系统和组件基础架构中的组件之间的关系?

基于我之前在这里提出的有关将input与实体的其他组件解耦的问题,我在XNA之上开发了一个小型组件体系结构,以了解每件事情是如何工作和共同进行的。 基本上,我的架构有以下组件/服务/系统: 游戏 这是任何游戏的根源,负责勾选游戏循环(更新,绘图)以及实例化所有系统。 GameModule 负责游戏某个方面的游戏模块,比如UI( UIModule ),Input( InputModule ),animation( SpriteAnimationModule ),场景( SceneStackModule )等等。 场景 掌握游戏的当前状态。 基本上是一个实体经理。 🙂 实体 只有一些组件和非常基本的世界空间信息,例如位置,旋转等等的实体 零件 一个实体的组件,可以是任何东西( SpriteComponent , ScriptComponent , ControllerComponent )… 然而现在我似乎有一个问题,就是我的游戏系统(模块)和组件之间的责任问题,这些组件之间并不知晓。 例如,我有一个在我的游戏中实例化的UIModule ,我需要在任何其他系统之前更新/渲染,以便在UI上正确处理input事件。 为此,我需要遍历所有的UIComponent – 不幸的是封装在当前场景中。 而这又只能通过SceneStackModule (场景的LIFO集合)访问。 所以我必须让我的UIModule知道场景的概念(通过使SceneStackModule成为UIModule的依赖),为每个场景创建一个UIModule ,或者使UIModule成为一个依赖,并且注册UIComponent两次(一次在实体中,一次在模块中)。 方法1 public class UIModule : GraphicalModuleBase { public UIModule(SceneStackModule sceneStack) { } public void Draw(GameTime gameTime) { […]

多遍历基于组件的层次结构

假设一个游戏使用一个基于组件的层次来存储它的所有实体。 所以它可以有物体,人物,灯光组织在某种树上。 渲染游戏时,需要先渲染物体,然后点亮。 所以它需要首先遍历层次结构并渲染find的所有对象,然后再遍历所有find的光源。 什么是更好的方法来做到这一点? 如果层次结构有数千个实体,则遍历树的两次可能会很慢。 我想过有两个列表,一个包含要呈现的对象,另一个是灯光。 用户每次将实体添加到层次结构中时,都会将其添加到相应的列表中。 这样,游戏只需遍历对象列表,然后是灯列表,而不需要遍历无用的实体。 什么是最好的select?

在ecs中嵌套父实体关系的问题

在给定的stream程中, character是父实体, gun是字符的子, bullet是枪的子。 我有一个名为NodeComponent的组件,它具有子实体的存储以及一个迭代子NodeSystem ,然后更新它相对于父节点的位置。 问题是迭代达到子弹时,需要一些时间来更新子弹的位置。 所以,当我移动父母的子弹是显而易见的。 我如何处理亲子关系转换,而不会丢失或减慢上下的更新? Character >> Gun >> Bullet

如何通过ECS转换和处理(控制)面向对象的游戏对象?

我很难将OOP游戏对象转换成Ashley ECS框架。 我有一个角色,枪和子弹类。 角色使用枪作为武器,枪类有一个处理子弹创造的火法。 在下面的代码中,是我目前WeaponSystem武器系统,它可以像Gun类一样用于任何武器的通用系统。 public interface Weapon { void use(); } public class WeaponComponent implements Component { Weapon weapon; } public class WeaponSystem extends IteratingSystem { … // Constructor … // Process Entity public void use(Entity weapon) { WeaponComponent weaponComponent = Components.getWeapon(weapon); weaponComponent.use(); … } } 字符系统 public class CharacterSystem extends IteratingSytem { … […]

如何从entity framework中的脚本访问实体?

我正在开发一个简单的基于libGDX的游戏,即时通讯使用实体组件系统ashley 。 对于非generics但自定义行为(例如玩家运动),我使用“脚本”,而不是可重用和通用的实体系统。 因此,我有一个ScriptComponent和一个ScriptSystem ,它在与实体相关的所有脚本上运行init()和update() 。 在某个时候,我想要生成一个地图,计算与游戏有关的属性等等,这些地方让我对从任何脚本访问这些属性感到困惑。 在Unity3D等引擎/环境中,GameObjects(实体)带来了查找其他实体的function,如FindGameObjectsWithTag(…) 。 但是,我怎么能认识到,在阿什利呢? 一个entity framework也应该可以访问一般的特定实体吗? 编辑:其他信息 这里有一个简单的例子 – 用例。 这是我刚刚为这个post创建的非常有名的例子。 我只是想演示一下,游戏中还需要一个“主要游戏对象”,这个游戏也使用了像阿什利这样的实体组件框架。 所以我认为一个正确的方法就是让这个主游戏对象也成为主角。 但我不确定,如果这是一个好方法。 在这里我用一个PlayerScript来展示这一点,这个PlayerScript根据游戏的难易程度(可能是由主菜单屏幕上的玩家设置)来设置玩家的生命。 这个PlayerScript被附加到播放器实体的ScriptComponent。 public class PlayerScript extends Script { int playerLives; public void init() { GameEntity entity = getTheEntityByName("game"); // this method doesn't exist GameScriptComponent gsc = scriptComponentMapper.get(entity); GameScript mainGameScript = gsc.getScriptByName("game"); if(mainGameScript.getDifficulty == "easy") playerLives […]

AI:处理与玩家驾驶相同input的运动

我的AIdevise非常简单。 我有不同的实体,可以由玩家或AI拥有。 这些实体有一个“input”组件,它保存实际input的状态,如右,左,上,下,火。 (并且是右边,左边,wasUp,wasDown,wasFire执行检查input是否被触发或没有)。 我的PlayerController类是通过从键盘或游戏手柄读取input来驱动该组件的。 以类似的方式,我的AIController通过逻辑function提供相同的input。 在处理运动时,现在我已经用这种方法撞墙了。 假设我处于二维空间,并且正在水平移动AI。 我正在从(0,0)移到(10,0),所以我一直激活“右”input,直到达到(10,0)的位置。 但是,如果我的实体的速度很高,我可能实际上会超越这个位置,并且引发一个回退,然后再次前进,因为它实际上不能解决。 我知道我可以检查前面的动作是否在同一个方向,如果我通过了目标,我可以强制这个位置到达我想要的位置。 但它看起来并不像一个干净的解决scheme。 这种方法是完全错误的吗? 我想尽量保持简单和模块化的同时。

实体组件系统devise。 实体的ID是否应该连续?

我正在实施一个实体组件系统 。 以下是我目前在c ++中的实现。 using ID = std::uint32_t; class Entity { public: Entity(ID index): index_{index} { } ID index() const; private: const ID index_; }; ID Entity::index() const { return index_; } class Entity_factory { public: Entity generate(); void destory(ID id); private: ID count_ = 0; std::unordered_set<ID> idle_IDs_; }; Entity Entity_factory::generate() { if (!idle_IDs_.empty()) { […]

与实体系统进行纹理切换

我正在使用在我的游戏中使用实体系统的想法。 到目前为止,我一直在成功地使用Artemis 。 但是,我有一个关于纹理切换的问题。 我读过,开关纹理往往是不好的。 所以,当游戏加载时,我加载所有的纹理: import org.newdawn.slick.opengl.TextureLoader; … public HashMap<String, Texture> Textures; … 那么对于每个纹理我都这样做: Texture tex = TextureLoader.getTexture("PNG", this.getClass().getResourceAsStream(texturePath)); Textures.put(textureName, tex); 然后当绘制实体时,我这样做: drawEntity() { glBindTexture(GL_TEXTURE_2D, Textures.get(entityTexture).getTextureID()); … } 说我有50个实体,使用10个不同的3D模型,每个都有自己的纹理。 当drawEntity系统运行时,它不会根据哪个实体使用哪个纹理进行分组。 所以我可以在绘制每个实体之前切换纹理! 是否有更有效的方式来切换实体之间的纹理? 或者glBindTexture()是一个很好的select?

最好的结构来处理基于实体组件的游戏引擎中的实体

我正在尝试开发一个基于2D实体组件的游戏,它有多个图层(从场景的前面或后面)。 我目前正在处理三维数组[z] [y] [x]中的地图图层。 映射中的每个图块都是一个实体,并具有一个定义x,y和z的positionComponent。 数组结构非常方便更新和渲染可视实体(在视口中)。 我还添加了一个1维数组来处理敌人和物品。 问题是,我想融合在一个单一的结构瓷砖地图和ennemy数组(我想更新和呈现实体在一个单一的结构)。 由于实体已经有了定义x,y和z的positionComponent,有没有一种很好的方式来摆脱三维数组而不会失去性能? 理想将能够做些像entities.get(z,y,x)的东西。

处理实体组件系统中的精灵加载和设置

我刚开始第一次使用实体组件系统,并且在做出某些决定时遇到了麻烦。 目前我有一个SpriteComponent包含一个Sprite,一个ContentManagerComponents持有一个内容管理器的实例,因此系统可以加载他们需要的内容,一个SpriteSystem需要这两个组件,并且只有一个方法来设置Sprite,可能会加载它预先(sprite渲染和animation由其他系统照顾)。 这有点看起来不错,但我主要关心的是…一个系统是不是SpriteSystem应该设置精灵? 这是我的select,因为我看到他们: 有系统需要改变精灵与SpriteSystem沟通莫名其妙。 可能是一个坏主意,因为它引入了系统之间的依赖关系(?)。 移动方法将精灵设置为SpriteComponent。 问题是,如果需要,该方法需要内容管理器加载精灵。 摆脱ContentManagerComponent并给SpriteComponent一个内容管理器。 但内容管理器不仅加载精灵。 任何帮助表示赞赏。