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

我想创建一个基于组件的游戏引擎,其中包含完成这些工作的子系统,实体只是一个组件列表(加上位置和旋转,因为每个对象都有),数据。

另外,我希望子系统为实体创建组件(实体具有组件types列表,子系统创建它们)。 如果一个实体被添加到世界上,子系统必须被通知。 我认为最好的方式是观察者模式:我的场景管理员通知每个子系统。

这是我卡住的地方。 当场景管理器通知时,应该是一个带有句柄消息的函数指针或抽象系统类吗? 在第一种情况下,我怎样才能得到这个工作variables的参数?

这个抽象类的方法不是我最喜欢的,我觉得函数指针可能会更好。 考虑这种情况:我的位置组件将从位置系统编辑,所以我的系统或我的组件必须通知渲染系统。

鉴于我的上述要求,我该如何处理这些通知?

移动你的初始化逻辑。 “子系统”可以创建一个组件或注册一个组件,但将其保留为未初始化状态。 然后,请求创建的代码可以使用了解所有不同types的每个组件types初始化方法来初始化组件。 如果子系统需要组件的初始化版本,则可以在激活组件之后发送单独的“激活”消息(甚至更好,让游戏对象处于活动状态,并在激活游戏对象后根据需要激活所有组件)这可以让你删除/停用整个对象,而不会破坏或取消初始化,这确实派上用场。

所以,创建组件,注册,初始化,激活和获利,依次进行。

另一种方法是做你的一个建议,并用“丰富”的数据发送消息。 一个超级简单的方法来完成这个只是使用Lua表或类似的消息(embeddedLua是C + +是超级简单)。 另一种类似的方法是将所有的消息数据打包成某种types的string(使用XML,JSON或自定义格式),然后在创建组件时由子系统进行parsing/解压缩。 不过,我强烈推荐第一种方法。