Articles of 实体系统

部件是否应该成为2D游戏场景的一部分?

我正在分离2D游戏逻辑和绘图的过程中,也就是说,我正从将场景/实体抽象成仅存储和更新数据的场景/实体(由渲染器绘制)中移动。 这对于场景和实体来说效果相当不错,但我无法弄清楚UI如何适应。现在,我在一些场景的绘制例程中绘制小部件。 场景目前也可以处理input,所以它与UI工具箱的工作方式相当接近。 甚至有只有UI的场景,例如主菜单。 但是在场景不再吸引的新方法中,我需要一种新的方法。 我怎么能这样做? 小部件甚至应该与实体一起生活在场景中? 还是应该在自己的场景中,例如窗口或对话框?

在实体组件系统中执行组件

好的,我现在刚开始掌握整个ECS模式,需要澄清一些事情。 为了logging,我正在尝试开发一个使用C ++和OpenGL的游戏,而且我对游戏编程还比较陌生。 首先,可以说我有一个Entity类,它可能有几个组件,如MeshRenderer,Collider等等。从我所读到的内容来看,我明白每个“系统”都执行特定的任务,如计算物理和渲染,如果需要,使用更多的一个组件。 所以举个例子,我将有一个MeshRendererSystem在所有具有MeshRenderer组件的实体上执行。 在Unity中,我发现每个GameObject都默认拥有渲染器,摄像机,对撞机和刚体等组件。据我所知,一个实体应该以一个空的“容器”开始,并且应该填充组件创建一个特定types的游戏对象。 所以我不明白的是“系统”如何在实体组件系统中工作。 http://docs.unity3d.com/ScriptReference/GameObject.html 所以我有一个GameObject(实体)类 class GameObject { public: GameObject(std::string objectName); ~GameObject(void); Component AddComponent(std::string name); Component AddComponent(Component componentType); }; 所以,如果我有一个游戏对象来模拟一个军舰,我想添加一个MeshRenderer组件,我会执行以下操作: warship->AddComponent(new MeshRenderer()); 在MeshRenderers构造函数中,我应该调用MeshRendererSystem并将“订阅”这个系统的军舰对象? 在这种情况下,MeshRendererSystem可能应该是一个Singleton(“不寒而栗”)。 从查看Unity的GameObject,如果每个对象都有一个渲染器或默认GameObject类中的任何组件,那么Unity将遍历所有可用的对象。 对我来说,这似乎是不必要的,因为一些对象可能不需要被渲染。 实际上,这些系统应该如何实施?

实体组件系统耦合

最近我一直在做一个小型的个人项目,这个项目基本上是一个实体组件系统框架,带有自动化系统。 虽然我对框架的工作方式有一个很好的想法,但由于缺乏经验,我实际上难以保持一切的联系。 框架的一些细节: 每个实体都由它的组件定义。 系统负责通过更改组件来实际修改实体。 为了改善参考的局部性,不是将每个分量保持在适当的实体中,而是将所有的分量存储在同质的向量中,并且每个实体保存每个向量的索引列表。 由于每个系统修改了特定的组件,因此它应该只保留具有相应组件的实体的列表。 无论何时将组件添加到实体或从实体中删除组件,都会对系统进行“注册”。 到目前为止,我如何处理所有这些事情,都是有一个ComponentManager,一个EntityManager和一个SystemManager。 然而这些类别之间的耦合非常紧密。 EntitManager需要访问ComponentManager以处理索引列表的大小以及每个组件types对它们的映射。 它也需要访问实际添加组件在适当的向量。 另一个耦合是在EntityManager和SystemManager之间。 无论何时创建实体,都需要将其添加到相应系统的列表中。 一般事件公共汽车似乎会帮助,但我不知道如何实现它,而不使其全球。 在保持系统function的同时,如何通过拆除耦合来改进此devise?

实体系统和“复合”实体

我是新来的实体组件系统模式,有什么我不明白。 假设我有以下实体: Player: { Components: [ Position: { x: 0, y: 0 }, Health: { max: 100, current: 50 }, Sprites: { … } } } 当我渲染一个具有运行状况组件的实体时,我也希望在该实体上方呈现健康状况栏。 我是否将健康栏视为一个新的实体,并将其附加到玩家身上,即玩家变成实体的复合体; 或者[健康栏]应该是健康组件的一部分,在这种情况下,它将如何被渲染/创建? 为了说明我想说的话: Player: { ChildEntities: [ Character: { Components: [ Position: { x:parent.x, y:parent.y }, Sprites: { parent… } ] }, HealthBar: { Components: [ Position: { […]

TypeScript中基于组件的体系结构

我正在用TypeScript的Phaser做一个游戏。 我想为演员实施一个基于组件的架构。 我想要达到的是这样的: var component:AwesomeComponent = actor.getComponent<AwesomeComponent>(); 我知道有一个解决方法,通过构造typesT的对象。但我不喜欢它,因为我可能需要定义大量不同的构造函数来表示所有不同types的组件。 我到目前为止所做的是传递一个string的types(当然,数字会更好,但我仍然是原型): getComponent<T>(componentType:string): T { for (let i = 0; i < this.components.length; i++) { if (componentType == this.components[i].componentType) { return <T><any>this.components[i]; } } return undefined; } 它工作,但结果不好,你必须键入类名称两次: var animComp = actor.getComponent<AnimationComponent>("AnimationComponent"); 有关如何解决它的任何建议? 感谢您的时间!

用C ++实体系统

我正在使用实体系统开发游戏引擎,我有一些问题。 我如何看到实体系统: 组件 :带有属性的类,设置并获取。 雪碧 Physicbody 飞船 … 系统 :具有组件列表的类。 (组件逻辑) EntityManager的 渲染 input 相机 … 实体 :只是一个空的类与组件列表。 我做了什么: 目前,我有一个允许我这样做的程序: // Create a new entity/ Entity* entity = game.createEntity(); // Add some components. entity->addComponent( new TransformableComponent() ) ->setPosition( 15, 50 ) ->setRotation( 90 ) ->addComponent( new PhysicComponent() ) ->setMass( 70 ) ->addComponent( new SpriteComponent() ) […]

实体组件系统中的状态/屏幕管理

我的实体/组件系统正在愉快地嗡嗡声,尽管我最初有一些性能问题,一切工作正常。 不过,我意识到我在开始这件事情时错过了一个关键点:你如何处理不同的屏幕? 目前,我有一个GameManager类,它拥有一个组件管理器和实体管理器。 当我创建一个实体时,实体经理为其分配一个ID并确保它被跟踪。 当我修改分配给实体的组件时。 一个UpdateEntity方法被调用,它会警告每个系统,他们可能需要添加或删除实体从它们各自的实体列表中。 这样做的问题在于,由每个系统操作的实体的集合完全由单个系统确定,通常基于“所需组件”filter。 (例如,一个实体必须有一个可渲染的组件。) 在这种情况下,我不能只保留每个屏幕的实体集合,只能更新/绘制这些集合。 他们必须根据他们对当前屏幕的适用性来添加和删除,这将导致他们的相关组件被移除,或者在每个屏幕中启用/禁用组中的实体以隐藏不应该被看见的东西。 这些方法看起来真的很糟糕。 什么是处理这个好方法? 想到一个非常简单的方法,就是在每个屏幕上创建一个单独的GameManager (在我的实现中拥有所有的系统,实体等),这意味着设备上下文之外的所有内容都将被复制。 这很麻烦,因为有些东西总是可见的,或者我可能想要在半透明的菜单窗口下继续显示游戏。 另一个select是向GameManager类添加一个“图层”键,可以通过游戏管理器保存的可显示的图层堆栈进行检查。 *System.Draw()将按照堆栈确定的顺序为每个活动层调用。 当系统为它们各自的实体集合请求迭代器时,它将被预过滤到参与活动层的那些实体(caching的)中。 这些集合可以从已经用于维护每个系统的实体集合的同一个UpdateEntity事件中更新。 不过,有点感觉像一个黑客。 如果我把自己编码在一个角落里,只要给他们贴上有用的建议就可以随意扔西红柿。 学习曲线的万岁。

我应该如何在实例/类之间共享variables?

我正在用LOVE做一个游戏,所以一切都在Lua中进行编程。 最近我一直在尝试使用类和对象方向。 我发现一个很好的系统使用的是将游戏的大部分代码放在不同的类中,并且有一个具有其中任何类的所有实例的实例表。 这样,我可以通过每个类的每个实例并更新并通过调用相同的函数来绘制它。 但是,有一个问题。 比方说,我有一个玩家的实例,有一个武器的健康和充能时间的variables。 我也有一个负责绘制HUD的主实例。 我如何告诉主实例玩家的健康状况? 坏的解决scheme 假设玩家实例总是在表中具有相同的位置 – 可以很容易地更改。 使用全局variables。 全局variables是邪恶的。 让主实例在实例表之外,并让玩家在主实例内部设置variables,然后将其用于HUD绘图。 这是非常糟糕的,因为现在我必须复制主实例所需的每个variables。 实例之间共享variables的正确标准方式是什么? 我是否需要改变跟踪实例的方式? 编辑:LOVE的驼峰库有一个信号/插槽系统。 这是一个合理的方式来分享实例之间的variables?

子弹和射弹在基于组件的实体系统中

目前我为射手写的一款游戏引擎似乎正常工作。 目前射弹很稀less,行进速度很慢,并且在networking上同步,它们是作为实体产生的。 但是在将来,我将拥有能够产生大量快速发射物的武器。 所以在这里,我想知道如果生成一个专门的投射系统是一个更好的主意。 我目前想要生成射弹池来管理短寿命射弹的同步,而不限制射弹数量。 物理和碰撞由物理引擎管理,我可以在其中注册任何types的对象(服务器和客户端)。 有没有更好的方法来解决这个问题?

实体组件系统中的大量精灵管理

我正在做一个基于实体组件系统的2.5D游戏。 也就是说,实体是由系统处理的组件组。 我很难看到一个以“RenderableSprites”组件为目标的精灵渲染系统如何在处理时有效地管理组件,以便只有屏幕上的精灵被迭代并随后绘制。 我可以看到LINQ等各种解决scheme,但他们都需要迭代通过组件的集合,无论是否明确。 即使不是实体构件系统的范式,处理这个问题的通常做法是什么? 为了解决这个问题,我的瓷砖为基础的“地板”实体,最好将地板拼成一个实体,而在他们分开之前。 这允许在瓦片地图中按照位置对瓦片进行索引,使得每个更新步骤(稍后限于检测到摄像机移动的更新),方法地select瓦片而不是通过迭代过滤并传播到“可渲染的精灵”组件,不在屏幕上不在画图步骤中处理。 我现在添加风景实体,但是当每个树是一个独立的实体时,它不能很好地扩展。 关于风景是否应该组合成一个实体的建议? 这似乎打败了一个实体组件系统的一个点,我的spidey感觉告诉我这将导致难以计算碰撞等。 任何反馈非常感谢! 我在XNA工作,但我不认为这是一个非常具体的语言问题。 对任何感兴趣的人:我正在处理这个问题。 我正在构建一个实体管理器按ID存储实体,我应该早些做。 这将允许我维护精灵渲染器可以参考的实体ID的一些空间索引,然后再select要从管理器处理的实体。 这与每个系统持有对其目标组件的具体引用相反。 当我完成后,我可能会发布一些代码。