我正在为自上而下的多人2D射击游戏设计游戏引擎,我希望该引擎可以合理地重用于其他自上而下的射击游戏。目前,我正在考虑应如何设计其中的实体系统。首先,我想到了这一点:
我有一个叫做EntityManager的类。它应该实现一种称为Update的方法,以及另一个称为Draw的方法。之所以将Logic和Rendering分开是因为,如果运行独立服务器,则可以省略Draw方法。
EntityManager拥有BaseEntity类型的对象列表。每个实体都拥有一个组件列表,例如EntityModel(实体的可绘制表示),EntityNetworkInterface和EntityPhysicalBody。
EntityManager还拥有一个组件管理器列表,例如EntityRenderManager,EntityNetworkManager和EntityPhysicsManager。每个组件管理器都保留对实体组件的引用。有多种原因将此代码移出实体自己的类,而改为集体进行。例如,我使用游戏的外部物理库Box2D。在Box2D中,首先将实体和形状添加到一个世界(在本例中为EntityPhysicsManager拥有),然后添加碰撞回调(将在我的系统中分派给实体对象本身)。然后,您运行一个函数来模拟系统中的所有内容。我发现很难找到比在这样的外部组件管理器中更好的解决方案。
实体创建是这样完成的:EntityManager实现方法RegisterEntity(entityClass,factory),该方法注册如何创建该类的实体。它还实现了CreateEntity(entityClass)方法,该方法将返回BaseEntity类型的对象。
现在出现了我的问题:如何将对组件的引用注册到组件管理器?我不知道如何从工厂/关闭处引用组件管理器。