Estoy actualizando mi respuesta porque muchas cosas no estaban claras antes de los comentarios. Por favor, descuida conmigo mientras explico mis pensamientos.
En general, dos aspectos clave a considerar en cualquier diseño es la cohesión y el acoplamiento . Todos sabemos que necesitamos una alta cohesión y un bajo acoplamiento para poder hacer un diseño más reutilizable y extensible.
Entonces, si el mundo tiene que manejar todo, eso significa que tiene una baja cohesión y un acoplamiento estrecho (porque necesita saber y hacer todo). Sin embargo, este también es el caso cuando una entidad de juego tiene que hacer todo. Actualice su ubicación, renderice su textura, etc. etc.
Lo que realmente le interesa es crear sistemas que se centren en un aspecto de la entidad. Por ejemplo, una entidad del juego podría tener una Textura, pero un Representante sería responsable de representar esa textura en la pantalla. Al Renderer no le importa qué otras propiedades tenga la entidad.
Yendo un poco más allá, una entidad de juego es simplemente una bolsa de propiedades. Estas propiedades son manipuladas por sistemas que se centran en propiedades específicas. Y aquí es donde entran en juego los sistemas de entidad basados en componentes (CBES), donde propiedades = componentes.
Específicamente, CBES con sistemas (o subsistemas). Este diseño tiende a tener unos pocos sistemas que se centran en componentes específicos de una entidad sin importar qué otros componentes tiene la entidad. Además, los sistemas se combinan solo con la información que necesitan para procesar estos componentes.
Tomemos tu ejemplo. Dado que la entrada de dónde mover la entidad se basa en el controlador del jugador, es probable que tenga un PlayerControllerSystem. Este sistema controlaría, además de muchas otras cosas, el Componente de posición de la entidad. En este caso, el PlayerControllerSystem necesitaría saber sobre el Nivel y el Componente de Posición. Si más tarde decide agregar la detección de colisión, crearía un CollisionSystem que nuevamente usaría la posición de las entidades, pero esta vez para calcular cuadros delimitadores (o podría tener un BoundingBoxComponent, su llamada). El hecho es que puede activar o desactivar fácilmente el comportamiento (incluso sobre la marcha) simplemente agregando / eliminando componentes. Entonces, más comportamiento significa que más sistemas están manipulando los componentes de una entidad, pero todos están en una clase bien definida con bajo acoplamiento. ¿Quieres scripting? Agregar un componente de secuencia de comandos. BAM! Acaba de agregar capacidades de scripting con 2 clases. ¿Física? ¿Sonido? Lo mismo de nuevo.
Entonces, la razón por la que estoy abogando por CBES con SubSystems es porque es perfectamente OO y un sistema general fácil de mantener / extensible. Agregar un comportamiento a una entidad es tan simple como decidir qué datos necesita ese comportamiento y qué entidades lo necesitan.
Para obtener más información sobre los sistemas de entidades basados en componentes con subsistemas, hay una excelente serie de publicaciones de blog de T = Machine en Entity Systems que son el futuro del desarrollo de MMOG . El autor incluso llegó a crear un wiki para recopilar varias implementaciones llamadas Entity Systems Project
Una publicación general (y bien conocida) sobre Sistemas de entidades basadas en componentes en general es Evolucionar su jerarquía que creó el sistema para Tony Hawk Pro.
Finalmente, si está buscando una biblioteca con código de ejemplo, no vaya más allá de la biblioteca Artemis . Artemis está principalmente en Java, pero aquí hay un puerto en C # (que actualmente estoy usando en mi proyecto XNA).
Actor
saber sobreworld
todo?