Articles of 组件的

我应该使用抽象类还是函数指针来实现组件通知?

我想创建一个基于组件的游戏引擎,其中包含完成这些工作的子系统,实体只是一个组件列表(加上位置和旋转,因为每个对象都有),数据。 另外,我希望子系统为实体创建组件(实体具有组件types列表,子系统创建它们)。 如果一个实体被添加到世界上,子系统必须被通知。 我认为最好的方式是观察者模式:我的场景管理员通知每个子系统。 这是我卡住的地方。 当场景管理器通知时,应该是一个带有句柄消息的函数指针或抽象系统类吗? 在第一种情况下,我怎样才能得到这个工作variables的参数? 这个抽象类的方法不是我最喜欢的,我觉得函数指针可能会更好。 考虑这种情况:我的位置组件将从位置系统编辑,所以我的系统或我的组件必须通知渲染系统。 鉴于我的上述要求,我该如何处理这些通知?

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

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

在哪里把我的实体组件消息function?

我已经完成了我的研究,并阅读了许多关于消息传递和ECS的文章和post,正如我所能find的,以帮助我开展工作。 不过,我在如何让我的消息function被正确处理的路障。 关于我的ECS系统的一些信息。 件: 实体 – 只包含附加组件列表的通用对象,有几个方法来询问它是否具有某些组件并检索它们。 组件 – 仅保存特定于其性质的数据,并且都具有表示组件types的位掩码。 系统 – 特定于其本质的function性代码,并保留要处理的组件列表。 消息 – 消息当前通过MessageInfo类创建。 可以使用以下这行代码轻松创建消息: MessageInfo* msg = new MessageInfo(MESSAGE_TYPE, LISTENER_ENTITY, boost::ANY PARAMS); 我试图保持解耦尽可能,并考虑添加一个静态MessageCenter,我可以推送消息,然后将它们立即派遣或投入队列(取决于推function调用)。 例如,消息被创建并被推送到消息中心。 消息中心立即查看其关心X消息的系统映射,并将消息发送到所有系统固有的“RecieveMessage”方法。 这个方法听起来对我来说真的很好,所以我开始用纸来开发,最后跑到了墙上。 让我提出一个我遇到的情况。 场景: 我有一个文本标签实体被用作位置(x / y coords)组件和文本组件(string,字体大小等)的%指标。 我想改变这个实体的一些数据属性,例如显示的文本和它的颜色。 因为我知道所有的系统都有一个recieveMessage方法,所以我很快就能够封装这些types的请求所特有的function,如下所示。 void SOMESYSTEM::RecieveMessage(MessageInfo* messageInfo) { switch(messageInfo->GetMessageType()) { case MessageType::CHANGE_TEXT: { boost::any params = messageInfo->GetParams(); if(params.type() == typeid(std::tuple<BaseComponent*,std::string>)) { auto […]

基于开源组件的游戏引擎?

可能重复: 是否有现有的基于FOSS组件的框架? 基于组件的游戏对象devise,你知道哪些开源游戏引擎? 他们最好的? 我的意思是最好不要在graphics或物理,但最好在行为,消息等方面。 这个问题是另一个问题的启发的结果 谢谢!!!

我有多less构图?

(虽然我确定这是一个常见的问题,但我真的不知道要search什么,作文是我唯一能想到的。) 我一遍又一遍地读了多重inheritance和子类化,真的很糟糕,特别是对于游戏实体。 如果我有三种动作,五种types的枪和三种types的装甲,我不想让45个不同的类来获得所有可能的组合。 我将添加一个动作行为,枪的行为和护甲行为到一个单一的通用对象。 这就说得通了。 但是我能拿多久? 我可以想象得到许多不同types的行为:DamageBehavior,MotionBehavior,TargetableBehavior等。如果我添加一个新的行为类,那么我需要更新所有其他使用它们的类。 但是当我的function不适合一类行为时会发生什么? 例如,我的装甲必须是可以破坏的,但也是可以更新的。 我应该能够在一个实体上同时使用多种types的行为,比如两个动作行为吗? 任何人都可以提供任何智慧或指向我的方向一些有用的文章? 谢谢!

在XNA中加载订单?

我想知道是否是手动控制的呼叫顺序机制 void Game.LoadContent() 就像它的情况一样 void Game.Draw(GameTime gt) 通过设置 int DrawableGameComponent.DrawOrder ? 除了将组件添加到Game.Components容器和 也许存在与Game.Update(GameTime gt)类似的东西? UPDATE 为了举例说明我的问题,考虑你有几个游戏组件相互依赖关于它们的实例。 所有从DrawableGameComponentinheritance。 现在假设在其中一个组件中,您正在从游戏内容管道中加载Model ,并将其添加到某个静态容器中,以便为其他游戏组件提供访问权限。 public override LoadContent() { // … Model m = _contentManager.Load<Model>(@"content/myModel"); // GameComponents is a static class with an accessible list where game components reside. GameComponents.AddCompnent(m); // … } 现在很容易想象,这个组件加载方法必须在其他游戏组件之前,它们想要以自己的加载方法访问模型m。

C ++格式化序列化

我已经决定是时候在我简单的引擎中实现序列化了,但是这在过去的几天/星期里给我造成了很多麻烦。 我的引擎使用类似于T = Machine博客中描述的基于实体/组件的方法。 为了简单起见,我的第一个目标是实现实体的序列化。 由于我将使用Lua进行脚本编写,因此我认为将实体序列化为Lua表格会很好。 不幸的是,我发现在C ++中序列化的信息相当稀less。 经过多天的思考,我发现了一个方法,正在为我的实现工作, 这里描述。 本质上,我有一个EntityManager类,我从中请求新的实体。 这个类包含实体以及所有组件派生的BaseComponenttypes的指针。 因为我将组件存储为基本指针,所以我不能使用朋友类进行序列化,但必须使BaseComponent从具有纯虚拟序列化方法的Serializable类inheritance。 所以,这不是那么糟糕,我只需要从Serializable类inheritance并实现序列化方法。 为了支持反序列化,我必须根据最后一个链接做一些技巧。 也就是说,我必须在每个组件中包含一个静态对象,其唯一目的是从组件名称到构造函数填充映射。 这是一个通用的例子(请忽略任何可能的错误), /* Base.h */ struct Base: public Serializeable{ static std::map&ltstd::string, std::function&ltBase*(void)> > deriveds; virtual ~Base(void){} }; /* Derived.h */ template&ltclass T> struct add_map_entry{ explicit add_map_entry(std::string name){ Base::deriveds[name] = [](void) -> Base* { return new T; }; } } class […]

如何将不同的类项添加到相同的列表C#XNA

我正在试图建立一个模块化的船舶系统,其中可以将部件添加到船舶实体或将其移除。 我正在使用一个叫做ModuleManager的类,它有一个ShipModules列表。 这对于非常基本的模块建造船舶来说工作得很好,但是我想添加一个具有推力function的ThrusterModule ,并且出于显而易见的原因可能使用GunMountModule 。 问题是我不能这样做。 List<ShipModules> modules = new List<ShipModules>(); ThrusterModule engine = new ThrusterModule(); modules.Add(engine); 我知道我不能这样做,因为他们是不同的types。 问:如何将所有这些模块添加到模块管理器? 因为我不想处理有几个不同types的模块需要几个不同的variables来保存它们 我有一个想法,但我想知道这是否是最好的路线,我听说过课堂作文。 这对我所解释的有利吗? 谢谢。

在Entity中将组件(类)添加到unordered_map? (可能的typeid作为关键问题)

我有一个testing放在一起有几个简单的组件应该被添加到一个实体,但addComponent函数不工作; 我认为这与typeid /组件类inheritance有关,但我不确定。 它似乎添加一个单一的条目到types的地图,但没有别的。 任何帮助非常感谢,谢谢! #include <iostream> #include <unordered_map> #include <typeinfo> using namespace std; //———————————————————————- //the base component class Component { public: Component() {cout<<"new Component created\n";} }; //———————————————————————- //a "thing" component class Thing : public Component { public: Thing() {cout<<"new Thing created\n";} }; //———————————————————————- //a "what" component class What : public Component { public: What() […]

ECS:循环实体的许多系统的性能

我一直在使用ECS来处理当前的游戏,并且我注意到我提出了很多系统,这些系统会覆盖有时重叠的实体列表,所以我不止一次在同一个实体上循环播放超过一次一个系统正在处理同一个实体。 如果只是遍历所有应该更新的实体,那么是不是更好? 如果是的话,你会怎么做? 重新devise系统,让单个系统负责相同实体上的更多内容? 将代码从系统移动到组件上的update()方法? 或者我只是担心一些对性能没有太大影响的事情,而采取不同的做法可能会产生其他的瓶颈呢?