Articles of 基于组件的

组件消息传递系统 – 使用整数与消息对象

我目前正在为我的游戏开发一个基于组件的系统,并决定使用消息传递系统在组件之间进行通信。 我已经阅读了一些关于这个主题,似乎大多数人正在使用扩展在基本消息对象上的消息对象, MySpecificMessage extends Message 或者可能他们只有一个Message对象,它接受一个stringvariables来决定它的作用,像这样; new Message("positionX:10"); //Plus other variables you might need 但是我也看到了一些使用静态定义的整数的消息,像这样的消息; public static final int MySpecificMessage = 1; //Different numbers for different messages 基本上我想知道他们之间有什么优点和缺点,也可能在什么时候使用他们。 另外,如果你有任何其他types的消息系统,请分享。

在更新步骤中更改实体的当前状态还是等待结束?

假设我使用了一个行为组件,该组件包含一个函数调用,每个更新步骤都被分配给一个实体。 在那个函数调用里面,我正在改变实体的激活状态来激活或去激活,如下所示: void fun_update() { this_entity->set_active(true); if (this_entity->is_active()) { // This should return true or false? …. } } 什么会更正确? 要更改当前更新迭代的状态或等待当前更新步骤的结束以更新实体的状态? 我知道unity3d例如改变了当前的状态,但是当编码我自己的引擎时,我发现最后更容易更新它。

如何让我的组件只包含原始数据?

我在阅读ECS中的组件仅仅是数据,没有逻辑。 我试图按照这个,我得到了这个工作: class Sprite : public Component { public: Sprite(const std::string &textureid = ""); std::string getTextureId() const; void setTextureId(const std::string& textureid); void setColor(const Color& color); Color getColor() const; private: std::string m_textureid; Color m_color; }; 现在在我的SpriteRenderingSystem中,我必须为每个具有一个Sprite组件的实体创建每个框架(我现在正在使用它),设置该对象的参数,渲染并销毁它。 我知道这不是优化,我不喜欢它。 我认为我可以使用我的组件来保存一个指向SFML :: Sprite对象的指针,然后我只需要在每一帧都渲染它,而不必像下面那样创建/设置/渲染/销毁它: class Sprite : public Component { public: Sprite(const std::string &textureid = ""); std::string getTextureId() const; void […]

这种面向数据的devise如何保留级别数据,同时还提供caching优势?

我几乎是以数据导向的引擎的概念出售的; 然而,有一件事仍然没有回避。 如果我们把数据从大的数据集合到巨大的数组中,那么我们所拥有的任何可见性系统基本上都会将其大部分视为不可处理的。 考虑这一点: void do_stuff_with_data(data* vdata, const const_data* cdata, int count) { for ( int i = 0; i < count; ++i ) { if ( vdata->active ) { … process data } } } 考虑到大部分数据是不可见的,而且由于东西在四处移动,所以对于如何sorting它并没有合理的预测,并且分支预测被搞砸了。 这不是没有caching明智的好处? 我已经阅读了关于这个具体问题的文章,但是大部分资料都显示了“大局”,完全无视这个重要问题。

使用实体系统方法的基于回合的游戏的AI

我最近刚刚了解到Entity Systems,想试试一个真实的例子(我最近正在开发一款游戏,并试图通过Entity Systems移植它)。 但是我马上就有问题了。 其实这是一个两个问题。 首先是: 在传统的面向对象的方法中,我有一个游戏循环,每隔100msselect空闲单元的动作(所谓的“转向”)。 但是渲染显然是在每个游戏循环迭代中运行的。 我该怎么做? 也许我需要一些像系统运行的独立时间间隔? 像AI系统运行每个更新时的RenderingSystem一样,每100ms运行一次。 或者,也许有更好的办法,我应该使用? 第二个问题是关于这些AI系统 我知道如何使人工智能,将完全单独管理每个单位。 不过,我有一些同时寻找所有单位的做法: 标记应该开始移动的单位“移动”。 find每个“移动”单位到其目标(基本上最接近的敌人)的path。 所有“移动”单位都不被视为障碍物,而是所有不“移动”的单位视为障碍物。 试着将每一个单位移动一步。 如果不能步(某人已经站在那里),那么将path标记为无效(在下次AI迭代时重新计算),并向目标方向(如果有空闲节点)移动一步。 将所有“移动”单元标记为不“移动” 除此之外,还有以下几点:3.在进行前,我们将检查我们是否有敌人在我们周围,而不是移动,我们会攻击这个敌人。 所以,一个AI迭代需要对每个将要运行的单元进行操作,直到完成。 然后AI应该给下一个行动。 我如何在实体系统方法中做到这一点? 因为在ES中,所有的系统都是一个接一个地运行,我需要在它们之间自由地“跳跃”。 或者,也许我是过于复杂的事情,应该做一些不同的事情,而不是在系统之间“跳跃”?

我如何处理实体系统中的刀枪不入?

我目前有一个实体组件系统与消息。 消息被传送给每个用户,但是每个用户都得到他们自己的副本,这基本上意味着改变消息不会影响任何其他用户。 虽然这工作现在罚款,我想知道我将如何添加一个无懈可击的状态。 我有一个解决战斗的战斗系统。 它需要一个战斗事件(意图攻击的东西),并发出一个解决的战斗事件。 这个事件包含谁攻击谁和谁受到什么样的伤害的信息。 它也有一个bool,它给出了攻击之后这个实体是否还活着的状态。 它也控制着惠普,并删除实体,如果它被杀害。 我没有打破这个系统的问题。 计算伤害的系统,施加伤害的系统以及杀死实体的系统。 但我在哪里添加我的无敌? 如果我只是把它作为一个组成部分,那么它必须由应用损害的系统来处理。 如果我想稍后添加其他内容呢? 我必须建立和完善损害系统,它必须处理所有的小问题和错综复杂的问题。 如果我想添加一个经受无敌攻击的攻击呢? 显然,这是一个指数级的噩梦,这正是我希望通过ECS避免的。 我应该如何处理刀枪不入?

基于组件的devise中“对象”的隐含性

有一段时间,我主要使用“标准OOP”(inheritance重型,树型结构等)样式的devise来满足我的游戏开发需求。 然而,对于我目前的项目,我试图转移到一个基于组件的devise(这都是一个业余爱好,所以时间/金钱/生产力的速度并不重要ATM)。然而,在研究基于组件的devise时,我我们对“对象”的概念是如何实现的感到困惑。 从我所能理解的角度来看,关于组件和对象之间的关系有两个思想stream派。 一个范例似乎将对象实现为类,它们只是作为容器来容纳与另一个相互作用的组件。 然而,另一个范例似乎摆脱了对象本身的概念,而对象只是隐含存在的。 (但是,我不明白同步问题怎么没有出现,如果有人可以解释,这将是非常有用的。) 关于这两个理想,是否有任何主要的好处(性能,可用性等)来select一个范式?

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

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

我怎样才能解决组件types相对容易地支持添加新types?

我正在尝试为使用C ++和OpenGL开发的交互式应用程序构建实体组件系统。 我的问题很简单。 在我的GameObject类中,我有一个组件的集合。 我可以添加和检索组件。 class GameObject: public Object { public: GameObject(std::string objectName); ~GameObject(void); Component * AddComponent(std::string name); Component * AddComponent(Component componentType); Component * GetComponent (std::string TypeName); Component * GetComponent (<Component Type Here>); private: std::map<std::string,Component*> m_components; }; 我将拥有从基本Components类inheritance的组件集合。 所以,如果我有一个meshRenderer组件,并希望做到以下几点 GameObject * warship = new GameObject("myLovelyWarship"); MeshRenderer * meshRenderer = warship->AddComponent(MeshRenderer); 或者可能 MeshRenderer * meshRenderer = […]

处理使用交互中不同的库存项目

嘿在那里我的同事程序员。 寻找一个潜在的臭味代码问题的一点点input(我正准备在Code Review SE上发布这个代码,让我知道如果这是更合适的地方)。 在查看一些关于设置一个像库存和使用基于组件的系统的答案之后,我想出了一个创建项目的格式,这里有几个例子。 Entity potion = new Entity("Potion", new Item(100,50), new Healing(75,0)); Entity elixer = new Entity("Elixer", new Item(50, 25), new TempStatIncrease(0,5,…)); 这里是涉及的类。 Entity Class IComponent[] components string name IComponent Interface ComponentType componentType Item Class : IComponent int purchasePrice int resaleValue TempStatIncrease Class : IComponent int strength; int agility; … Healing Class : […]