Přeskočit obsah

Herní smyčka¤

Abychom nemuseli každý objekt ve scéně spravovat ručně a zároveň mohli jednoduše sledovat interakce mezi nimi, můžeme využít knihovnu game-loop. Tu lze nainstalovat stejně jako ostatní knihovny. Je také součástí šablony template-jaculus-saturn.

Knihovna nabízí třídu GameLoop, která se stará o správu objektů ve scéně a jejich vykreslování. Při vytvoření instance třídy GameLoop je potřeba předat referenci na displej, na kterém se bude scéna vykreslovat -- v našem případě je to saturn.display.

Objekty ve scéně pak spravují metody addShape a removeShape. Vykreslování pak probíhá automaticky při každém "ticku" smyčky. V každém "ticku" se také kontrolují kolize mezi objekty a na základě nich se vyvolávají události.

Ukázka šablony¤

import { GameLoop } from "game-loop";
import { createSaturn } from "saturn";
import { LineSegment } from "shapes";
import * as colors from "colors";


const saturn = createSaturn();
let loop = new GameLoop(saturn.display);

let line = new LineSegment({
    x: 32,
    y: 32,
    x2: 48,
    y2: 48,
    color: colors.red,
});
loop.addShape(line);

loop.on("tick", (delta) => {
    line.rotate(5);
});

Ukázka detekce kolizí¤

Následující ukázka demonstruje detekci kolizí mezi dvěma kružnicemi. Jedna z nich se pohybuje a při kolizi s druhou se vyvolá událost collision.

...
let circleA = new Circle({
    x: 32,
    y: 32,
    radius: 8,
    color: colors.red,
});
loop.addShape(circleA);
let circleB = new Circle({
    x: 32,
    y: 32,
    radius: 8,
    color: colors.blue,
});
loop.addShape(circleB);

let dx = 1;
loop.on("tick", (delta) => {
    let x = circleB.getX() + dx;
    circleB.setX(x);
    if (x > 64 || x < 0) {
        dx *= -1;
    }
});

loop.on("collision", circleA, circleB, () => {
    console.log(`Detekována kolize ${Date.now()}`);
});