Mi pregunta es esta:
¿Cómo se almacenarían los datos del contexto global, es decir. información de datos mundiales, hora mundial actual, etc. en un sistema de componentes de entidad?
Estoy pensando en trabajar para construir un juego de simulación mundial de estilo abierto Dwarf Fortress en C ++. He creado un motor de juego de estilo de componente de entidad solo por diversión, y actualmente estoy tratando de descubrir cómo voy a trabajar en todas las características que quiero. Además del juego estándar (renderización, física, datos de componentes específicos de la entidad, etc.), también me gustaría tener algunos datos contextuales globales a los que todos los sistemas relevantes tendrían acceso (es decir, los datos mundiales como el año en que es actualmente , si está ocurriendo el calentamiento global, cualquier tipo de cosa que sea relevante para simular un mundo). Originalmente había pensado en hacer un componente "mundial", pero esto parece inútil y difícil si muchos sistemas diferentes necesitan acceder a estos datos lógicamente "globales".
¿Tendría sentido tener un componente "mundial" o debería almacenar estos datos de otra manera?
También había pensado simplemente en hacer que estos datos fueran globales, dando así acceso a cualquier sistema que quisiera usarlos; Parece una violación de los principios de entidad-componente en general, y tal vez desordenado por otras razones, pero pensé que realmente podría funcionar.
La otra cosa en la que pensé sería incorporar datos relevantes del contexto mundial directamente en los propios sistemas. Por ejemplo, si tuviera un AgeSystem
"envejecimiento" de todas las entidades que tienen un getsWeakerAsTimePasses
componente o no, entonces este sistema podría almacenar datos de tiempo relevantes para el mundo directamente como datos de miembros que usaría para calcular el paso del tiempo y cuánto envejecer y debilitar a las personas, etc. Esta tercera opción era mi menos favorita, pero algo que se me había ocurrido en una lluvia de ideas.
¿Alguien puede aconsejar?
fuente
Respuestas:
Cualquier forma que funcione es una manera que funciona. Eso suena sarcástico, pero realmente, tu juego es 1000 veces más importante que tu arquitectura. Elija cualquier enfoque que le guste y encuentre fácil de usar.
Los que he visto en juegos de envío reales (usando diseño basado en componentes, no ECS específicamente; nunca he visto ECS puro "en la naturaleza", aunque muchos diseños de componentes tienen elementos similares a ECS) incluyen:
handle<PhysicsSystem> = GetResource<PhysicsSystem>("/systems/physics")
, sí, realmente)Todos trabajan Tengo quejas con algunos enfoques y un favorito obvio, pero todos se han utilizado para enviar juegos AAA. A veces, múltiples enfoques en un solo proyecto (más de 40-100 equipos de ingenieros tienden a crear códigos duplicados al azar, por desgracia).
fuente