Arquitectura
Angry Pixel Engine se construye en torno al patrón Entidad-Componente-Sistema (ECS).
Qué es ECS
ECS es un patrón de arquitectura que separa los datos de la lógica mediante tres conceptos:
- Las entidades son identificadores que representan objetos del juego.
- Los componentes son datos asociados a las entidades. Contienen estado, pero no lógica.
- Los sistemas son la lógica que opera sobre las entidades a través de sus componentes.
El comportamiento surge de la combinación de los componentes de una entidad y los sistemas que actúan sobre ellos, en lugar de la herencia.
Jerarquía
El motor se organiza en la siguiente jerarquía:
Game
└── Scene
├── Systems
└── Entities
└── Components
Game
La clase Game es el punto de entrada. Un juego es una única instancia de Game, creada a partir de un objeto de configuración (elemento contenedor, resolución, ajustes de física y colisiones, y opciones similares).
Contiene las escenas y dependencias, y controla el bucle de juego mediante sus métodos start y stop.
Scene
Una Scene es una parte autónoma del juego, como un nivel, un menú o una pantalla de carga. Un juego puede registrar una o más escenas, y solo una escena está activa a la vez.
Cada escena define los sistemas que ejecuta, los recursos que carga y las entidades que crea cuando se activa.
Entity
Una entidad es un identificador único. Por sí misma no contiene datos ni lógica; obtiene estado y comportamiento de los componentes que se le asocian.
Component
Un componente es un contenedor de datos asociado a una entidad. Los componentes almacenan estado y no contienen lógica. El conjunto de componentes de una entidad define lo que es.
System
Un sistema contiene lógica. Consulta las entidades que tienen un determinado conjunto de componentes y opera sobre ellas. Un sistema ejecuta su lógica en cada frame y puede reaccionar a eventos del ciclo de vida como la creación, destrucción, activación y desactivación.
Bucle de juego
El motor ejecuta su ciclo de actualización en tres fases:
- Lógica de juego: sistemas de jugabilidad como entrada, audio, animación y lógica personalizada.
- Física: detección de colisiones y resolución física. El componente
Transformse actualiza en esta fase. - Renderizado: sistemas de renderizado y cámara.
Los sistemas personalizados se ejecutan por defecto en la fase de lógica de juego y pueden asignarse a las fases de física o pre-renderizado.