Articles of 实体系统

在回合制的roguelike中用ECS处理AI

我试图实现实体组件系统模式在roguelike游戏中使用。 现在,我有3个系统。 input,AI和操作。 input系统基本上就是玩家用键盘input的系统。 AI系统是给NPC的。 动作系统用Action组件来处理任何东西,Action组件用来描述一个移动,一个攻击,一个物品使用,基本上任何能够提高游戏时间的东西。 但是,我在执行正确的行为时遇到了麻烦。 很明显,玩家应该转弯,得到他的意见。 如果input无效,他会一次又一次地轮到他,直到他转过一段时间。 那么敌人就应该从AI系统中移动,并启动它。 那么这个行为应该是什么样的呢? while(!input.passesTime()) input.getInput() draw() action.do(Player) for all Entities with AI AI.think(Entity) action.do(Entity) draw() 注意一切事物是如何交织在一起的,作为一个单一的(或多个)系统是没有意义的。 我怎样才能更好地devise这个? 尤其要注意,我需要每次更新屏幕,即使input无效,因为他们可能会写出一些东西(例如“没有什么有趣的事情发生”)。 经过一番思考似乎很清楚,渲染器也应该是一个系统,但是这并没有真正地清理这些需求。

如何处理实体系统中的单一组件和系统中的不同types的武器?

武器可以用作近战或远程武器,可以投掷,抛掷,射击,射击,投掷(射弹)或用于砍杀,猛击,刺伤。 我如何将这些应用到实体系统? 我的第一个方法是创建一个WeaponType的enum类,一个近战或范围。 public enum WeaponType { MELEE, RANGE } public interface Weapon { void use(); } 然后我创建一个武器组件并添加武器types数据,以确定它的types。 对于近战武器来说,它需要有一种方法来处理不同types的“攻击动作”,如斜线,猛击,刺等 。 对于远距离武器,需要有一个容器,工厂和一个方法来处理射击,射击,投掷,抛掷等不同的“射弹运动” 。现在的问题是如何创建一种方法来处理不同种类的弹丸议案,请记住我特别使用阿什利ECS框架 public class WeaponComponent implements Component { public Weapon weapon; public WeaponType type; // if weapon type is melee, use the below data public Container container // holds the created projectile public Factory factory […]

实体经理循环意见

这一天我重构代码,我想要改进的是我的实体经理代码。 更确切地说,实体更新的更新函数。 我的引擎是基于2D平铺的引擎,我正在使用一个iPhone游戏。 我的想法是将实体更新拆分成几个任务,因为当我有空时,我愿意移动到基于组件的实体。 这是一个物理任务,碰撞检测任务,AI任务等… 很长一段时间,我一直在使用一个简单的update()函数来更新实体管理器在循环中调用的实体更新。 现在我又遇到了另外一种方法(最后它是一样的),但是却给我带来了一些好处,例如不同任务的不同任务(物理可以运行在与碰撞不同的刷新速率等等) 这里是源代码。 如果有人能发表评论,发表意见或改进,我将会非常高兴。 对不起ti是ObjC,但我觉得这很容易理解: //Run the update process o nall entities. for(int i=0; i< numGameObjects;++i) { GameObject* go=_entities[i]; //If this game object was marked to be delted don't do any process with it. //It will be released when update loop is finished. if(! [go isToBeDeleted]) { //Player does its […]

在基于实体组件的模型中如何处理“视图”?

来自MVC的背景下,我想了解基于实体组件的模型。 但是,我可以看到有关使用组件(数据对象)和实体(不同数据对象,即组件)的描述,但无法看到如何创建视图。 虽然我可以看到一些叫做“渲染”的组件。 但是,我将如何使用它? 看来,我并不需要在这个架构中将数据与视图分离。 但我怀疑,如果是这样的话,事情就会搞砸了。

实体系统体系结构; 游泳池和工厂

我正在使用C ++, Artemis的C ++端口和SFML创建基于实体系统架构的2D游戏。 我不得不跳过几圈,但到现在为止还是比较平稳的。 在这个游戏中,我有一个EntityFactory类,它基本上只是让artemis::Entity对象,做一些处理(如创建精灵或设置实体的位置)并返回artemis::Entity 。 这是由一个静态类,如下所示: class EntityFactory { public: //Creates the player, should only be called once static artemis::Entity CreatePlayer(artemis::World& world, sf::Vector2f pos); //Creates a bullet, can be called many times static artemis::Entity CreateBullet(artemis::World& world, sf::Vector2f pos); //Creates a static image static artemis::Entity CreateStatic(artemis::World& world, sf::Vector2f pos, std::string imgLoc); //Some more entities… […]

使用DHT跨越多台服务器来提高可靠性是否可行?

目前,我有一个想法,如何处理分布MMO服务器。 核心是一堆工作节点,它们共享同一组分布式散列表。 每个DHT存储一个特定的游戏组件。 每一个协调器服务器(也可以有许多)服务器会将所有连接的工作节点推出,并等待它们完成所有分配的任务。 该系统还分为四个部分:客户,显然是玩家使用。 位于负载均衡器和用户之后的代理服务器连接到。 他们所做的只是处理传入的用户数据包,validation它们并将请求传递到工作群集。 工作集群接收来自代理的数据包,并将它们附加到进程队列,并等待来自控制器节点的帧事件处理它们。 我只是想知道,如果像这样的工人节点添加一个DHT将是可行的? 这应该可以让开箱即用和高可用性,因为DHT的相当不错。

在ECS框架中,为什么组件是通过名称而不是Enum索引的?

我一直在阅读关于ECS框架的大量讨论,并且经常看到通过名称引用组件,而不是通过诸如enum或struct类的string对象。 我开始自己构建一个testing实现,并觉得应该有一个强types而不是string,以便我可以从列表中select要查找的组件,而不是使用string“猜测”。 作为一个例子,你会经常看到: Entity.GetComponent("Position"); 而不是: Entity.GetComponent(ComponentTypes.Position);

转换ECS中的组件

我见过的许多游戏引擎是基于实体组件系统的 。 它具有某种变换组件作为所有实体的必要组件。 虽然这似乎是有道理的,考虑到一个实体只是某种types的财产袋,一个组件和转换的集合是世界空间行为(因此只是组成部分的一部分) 。 我注意到另外两件非常奇怪的事情: 变换组件用于构建实体之间的层次结构,因为它们具有父实体以及子实体 变换组件专用于单一种类的世界空间,例如2D或3D。 例子: Unity3D引擎。 似乎通过每个实体的变换组件访问实体的孩子和父母。 另外, 变换组件以3D向量中的坐标为特征。 Xenko游戏引擎 (以前的Paradox3D),可以在GitHub上看到。 那么这是一种常见的做法吗? 最佳/最差的做法? 背后的原因是什么? 一个固定的Transform组件 , 使变换组件仅适用于一个世界空间 使用变换组件作为层次结构图?

更新multithreading实体组件系统

我目前正在尝试实施(分类)实体组件系统。 我有它的要点,那就是ECS应该如何工作。 到目前为止,我的devise中有4个类(尚未完全实现): EntityWorld是系统,实体及其各自组件的全局容器。 它负责更新系统/步进。 EntitySystem代表系统的基类,具有虚拟更新function。 Entity是一个容器,基本上有一个组件和一个id列表,没有更多。 EntityComponent表示一个组件。 现在,我想让multithreading系统成为可能,但是我想我已经遇到了一个问题。 假设我的EntityWorld以最简单的方式存储它的实体,例如在一个std::vector<Entity*>中。 现在,该列表将在更新时被完全传递给系统,或者EntityWorld通过该列表循环,并将这些实体一个一个地发送到系统。 在我的理解中,当使用多个线程时,每次系统更新时都需要locking整个列表。 这实际上等于零的性能增长,因为其他线程总是等待列表获得免费。 有没有更好的方法来实现这一点? 所以multithreading可以更新(和R / W同时进行)? 提前致谢!

实体状态应该如何精细化?

我正在编写一个基于组件的实体系统,其中一个组件是实体的状态,它决定了它如何对游戏事件做出反应。 如果任何人有执行国家的经验,他们应该如何粒度? 为了让我们知道他们在我的情况下的WalkingLeft ,我有一个WalkingLeft状态和一个WalkingRight状态(而不是一个简单的Walking状态),我担心它们可能太细。 你怎么看?