Example

The full example of the things mentioned in Entity, Component, System and Scene:

import {
    Component,
    Engine,
    Entity,
    Rectangle,
    Renderable,
    Scene,
    System,
    Transform
} from "PrimeEngine.ts";

class PleaseRotate extends Component {}

class RotatorSystem extends System {
    private angle: number = 0;

    public readonly queries = { Rotatable: [Transform, PleaseRotate] };

    public update(query: string, entities: Entity[], delta: number): void {
        this.angle += delta;

        if (this.angle > Math.PI * 2) this.angle = 0;

        for (const entity of entities) {
            entity.components.get(Transform).rotation = this.angle;
        }
    }
}

async function main(): Promise<void> {
    const canvas: HTMLCanvasElement = document.getElementById(
        "canvas"
    ) as HTMLCanvasElement;

    const rectangle = new Entity("rectangle", [
        Renderable,
        Transform,
        Rectangle,
        PleaseRotate
    ]);

    rectangle.components.get(Rectangle).width = 100;
    rectangle.components.get(Rectangle).height = 100;

    rectangle.components.get(Renderable).fill.enabled = true;

    const MainScene = new Scene(
        "MainScene",
        [rectangle],
        [new CanvasRenderingSystem(canvas), new RotatorSystem()]
    );

    const engine = new Engine({
        scene: MainScene
    });
    engine.start();
}

main();