Helper Classes

Writing game logic just got cleaner. No more drilling through this.entity.scene.game... chains every single time.

Shorthand API

Access common properties and methods directly from your script components.

js
// Before                                        →  After
this.entity.destroy()                            →  this.destroy()
this.entity.hasTag("wall")                       →  this.hasTag("wall")
this.entity.scene.findByTag("wall")              →  this.findByTag("wall")
this.entity.scene.findAllByTag("wall")           →  this.findAllByTag("wall")
this.entity.scene.raycast(Mouse.x, Mouse.y)      →  this.raycast(Mouse.x, Mouse.y)
this.entity.scene.pick(Mouse.x, Mouse.y)         →  this.pick(Mouse.x, Mouse.y)
this.entity.scene                                →  this.scene
this.entity.scene.game                           →  this.game
this.entity.scene.game.camera                    →  this.camera

KeyCode & MouseButton

No more magic strings or raw numbers buried in your input checks:

js
if (Keyboard.isPressed(KeyCode.W))           // was: "w"
if (Keyboard.wasPressed(KeyCode.Space))      // was: "Space"
if (Mouse.wasPressed(MouseButton.Left))      // was: 0
if (Mouse.wasPressed(MouseButton.Right))     // was: 2
if (Mouse.wasPressed(MouseButton.Middle))    // was: 1

Vector2 / Vector3

js
const a = new Vector2(10, 5);
const b = new Vector2(3, 2);

Vector2.add(a, b)           // → Vector2(13, 7)
Vector2.sub(a, b)           // → Vector2(7, 3)
Vector2.distance(a, b)      // → number
Vector2.lerp(a, b, 0.5)     // → smooth midpoint
Vector2.dot(a, b)           // → scalar
a.normalize()               // modifies in place, returns self
a.clone()                   // safe copy

Mathf

js
Mathf.clamp(health, 0, 100)           // never go below 0 or above 100
Mathf.lerp(currentVal, target, 0.1)   // smooth follow / easing
Mathf.degToRad(90)                    // → 1.5707...
Mathf.radToDeg(Math.PI)               // → 180

Timer & Cooldown

js
// Timer — great for wave spawning, cutscenes, and delayed events
const waveTimer = new Timer(5.0, true); // 5 seconds, starts immediately

update(dt) {
  waveTimer.update(dt);
  if (waveTimer.isFinished()) {
    spawnNextWave();
    waveTimer.start(); // loop it
  }
}

// Cooldown — fire rates, dash recharge, ability delays
const fireCooldown = new Cooldown(0.2); // 5 shots per second

update(dt) {
  fireCooldown.update(dt);
  if (Mouse.wasPressed(MouseButton.Left) && fireCooldown.trigger()) {
    this.instantiate(Bullet, x, y);
  }
}

Utility Functions

js
Random.range(1, 10);            // random float between 1 and 10
Random.int(1, 10);              // random int between 1 and 10
HexToRGB("#ff0000")             // → { r: 255, g: 0, b: 0 }
RGBToHex(255, 0, 0)             // → "#ff0000"

Raycasting (with options)

js
const hit = this.raycast(Mouse.x, Mouse.y, {
  layerMask: Layers.Enemy,
  tag: "boss",
  ignore: this.entity
});

if (hit) {
  console.log("Hit:", hit.entity.name);
}

Tags, Layers & Raycasting

js
entity.tag = "enemy";
entity.layer = Layers.Enemy;

// Scene queries
const boss = this.findByTag("boss");
const allEnemies = this.findAllByTag("enemy");

// Raycast — only hits enemies, ignores everything else
const hit = this.raycast(Mouse.x, Mouse.y, { layerMask: Layers.Enemy, ignore: this.entity });
if (hit) console.log("Hit:", hit.entity.name);