La clase Game

La clase Game es el punto de entrada principal para crear y administrar una instancia de juego en Angry Pixel Engine.
Actúa como el coordinador central que gestiona:

  • Escenas.
  • Entidades.
  • Componentes.
  • Managers (renderizado, físicas, entrada, etc.).

Además, proporciona métodos para configurar el juego, agregar escenas y dependencias, y controlar el ciclo de ejecución (game loop).

Constructor

new Game(config: GameConfig)

El constructor recibe un objeto GameConfig que permite definir:

  • El nodo HTML donde se renderizará el juego (containerNode).
  • Dimensiones (width, height).
  • Opcional: ajustes de físicas, colores, métodos de colisiones, etc.

Ejemplo básico

const game = new Game({
    containerNode: document.getElementById("app"),
    width: 1920,
    height: 1080,
});

game.addScene(MainScene, "MainScene", true);
game.start();

Ejemplo avanzado

const game = new Game({
    containerNode: document.getElementById("app"),
    width: 1920,
    height: 1080,
    debugEnabled: false,
    canvasColor: "#000000",
    physicsFramerate: 180,
    collisions: {
        collisionMatrix: [
            ["layer1", "layer2"],
            ["layer1", "layer3"],
        ],
        collisionMethod: CollisionMethods.SAT,
        collisionBroadPhaseMethod: BroadPhaseMethods.SpartialGrid,
    },
});

game.addScene(MainScene, "MainScene", true);
game.start();

Detalle de GameConfig

El objeto GameConfig permite personalizar cómo se inicializa el juego.
A continuación, se describen todas las propiedades disponibles:

PropiedadTipoDescripción
containerNodeHTMLElementNodo HTML donde se renderizará el juego. Obligatorio.
widthnumberAncho del juego en píxeles. Obligatorio.
heightnumberAlto del juego en píxeles. Obligatorio.
debugobject (opcional)Opciones de depuración. Permite mostrar colisionadores, posición del mouse y otros datos durante la ejecución.
debug.collidersbooleanMostrar colisionadores.
debug.mousePositionbooleanMostrar la posición del mouse.
debug.collidersColorstringColor de los colisionadores. Predeterminado: #00FF00 (verde).
debug.textColorstringColor de los textos de depuración. Predeterminado: #00FF00.
debug.textPositionstringPosición del texto de depuración: "top-left", "top-right", "bottom-left" o "bottom-right".
canvasColorstringColor de fondo del canvas. Predeterminado: #000000 (negro).
physicsFrameratenumberFrecuencia de actualización de físicas. Valores permitidos: 60, 120, 180 o 240. Predeterminado: 180.
headlessbooleanActiva el modo “headless”. Desactiva entrada y renderizado (ideal para servidores).
dependenciesArrayLista de dependencias externas que se inyectarán mediante dependency injection.
collisionsobject (opcional)Opciones de configuración de colisiones.
collisions.collisionMethodCollisionMethodsMétodo de detección de colisiones: SAT o ABB. Predeterminado: SAT.
collisions.collisionMatrixArrayMatriz que define qué capas pueden colisionar entre sí.
collisions.collisionBroadPhaseMethodBroadPhaseMethodsMétodo de “broad phase”: QuadTree o SpartialGrid. Predeterminado: SpartialGrid.

Nota: Si no se especifican algunas opciones, el motor usará los valores predeterminados recomendados.

Métodos

addScene(sceneType, name, openingScene = false)

Agrega una nueva escena al juego.

  • sceneType: la clase de la escena.
  • name: nombre para identificar la escena.
  • openingScene: si es true, esta será la primera escena al iniciar el juego.

Ejemplo:

game.addScene(MainScene, "MainScene", true);

addDependencyType(dependencyType, name?)

Agrega una clase que será usada como dependencia.

  • dependencyType: clase de la dependencia.
  • name: nombre de la dependencia (opcional si la clase usa el decorador injectable).

Ejemplo:

game.addDependencyType(MyCustomService);

addDependencyInstance(dependencyInstance, name)

Agrega una instancia específica como dependencia.

  • dependencyInstance: instancia a usar.
  • name: nombre de la dependencia.

Ejemplo:

game.addDependencyInstance(myDatabaseInstance, "Database");

start()

Inicia el juego y comienza el ciclo de actualización (game loop).

game.start();

stop()

Detiene el ciclo de actualización del juego.

game.stop();

Propiedades

running

Devuelve true si el juego está actualmente en ejecución.

if (game.running) {
    console.log("El juego está corriendo");
}

Resumen

La clase Game es responsable de:

✅ Inicializar la configuración y dependencias.
✅ Gestionar escenas.
✅ Controlar el ciclo de vida del juego (inicio y detención).
✅ Proveer un punto central para personalizar el comportamiento del motor.

Nota: Internamente, Game utiliza dependency injection para inicializar y comunicar todos los sistemas de juego.