我最近使用“实体系统”制作了一个简单的Space Invadors游戏。这种模式可以很好地将属性和行为分开。我花了一些迭代才能完全理解它,但是一旦设计了一些组件,使用现有组件来组成新对象就变得非常简单。
您应该阅读以下内容:
http://t-machine.org/index.php/2007/09/03/entity-systems-are-the-future-of-mmog-development-part-1/
它是一个非常博学的家伙经常更新。这也是唯一的带有具体代码示例的实体系统讨论。
我的迭代如下:
第一次迭代有一个“ EntitySystem”对象,正如Adam所描述的。但是我的组件仍然具有方法-我的“可渲染”组件具有paint()方法,而position组件具有move()方法等。当我开始充实实体时,我意识到我需要开始在两个之间传递消息组件和命令组件执行的更新……太混乱了。
因此,我回去重新阅读了T机博客。注释线程中有很多信息-他在其中确实强调了组件没有行为-行为是由实体系统提供的。这样,您不需要在组件之间传递消息并订购组件更新,因为顺序是由系统执行的全局顺序决定的。好。也许那太抽象了。
无论如何,对于迭代2,这是我从博客中收集到的内容:
EntityManager-充当组件“数据库”,可以查询包含某些类型的组件的实体。它甚至可以由内存数据库支持以快速访问...有关更多信息,请参阅t-machine第5部分。
EntitySystem-每个系统本质上只是在一组实体上运行的一种方法。每个系统将使用实体的组件x,y和z来完成工作。因此,您将向管理器查询包含x,y和z组件的实体,然后将结果传递给系统。
实体-只是一个ID,如long。实体是将一组组件实例组合为一个“实体”的实体。
组件-一组字段...。没有行为!当您开始添加行为时,即使在一个简单的Space Invadors游戏中,它也开始变得混乱。
编辑:顺便说一句,“ dt”是自上次主循环调用以来的增量时间
所以我的主要Invadors循环是这样的:
Collection<Entity> entitiesWithGuns = manager.getEntitiesWith(Gun.class);
Collection<Entity> entitiesWithDamagable =
manager.getEntitiesWith(BulletDamagable.class);
Collection<Entity> entitiesWithInvadorDamagable = manager.getEntitiesWith(InvadorDamagable.class);
keyboardShipControllerSystem.update(entitiesWithGuns, dt);
touchInputSystem.update(entitiesWithGuns, dt);
Collection<Entity> entitiesWithInvadorMovement = manager.getEntitiesWith(InvadorMovement.class);
invadorMovementSystem.update(entitiesWithInvadorMovement);
Collection<Entity> entitiesWithVelocity = manager.getEntitiesWith(Velocity.class);
movementSystem.move(entitiesWithVelocity, dt);
gunSystem.update(entitiesWithGuns, System.currentTimeMillis());
Collection<Entity> entitiesWithPositionAndForm = manager.getEntitiesWith(Position.class, Form.class);
collisionSystem.checkCollisions(entitiesWithPositionAndForm);
乍一看,它有点不可思议,但它的灵活性却难以置信。优化也很容易。对于不同的组件类型,您可以具有不同的后备数据存储区,以加快检索速度。对于“ form”类,您可以为其添加四叉树以加快访问速度以进行碰撞检测。
我像你; 我是一个经验丰富的开发人员,但没有编写游戏的经验。我花了一些时间研究开发模式,这个模式引起了我的注意。它绝不是唯一的处理方法,但我发现它非常直观且强大。我相信图案系列“游戏编程精粹”的书6正式讨论- http://www.amazon.com/Game-Programming-Gems/dp/1584500492。我自己还没有看过任何书籍,但听说它们是游戏编程的实际参考资料。