Skip to main content
Deno 2 is finally here 🎉️
Learn more


caviar stars caviar releases caviar License


game engine built on top of daybreak with WebGPU bindings with desktop and web support

Maintainers

Running In the Browser

Usage

moving squares

import { World, Scene, Rectangle } from 'https://deno.land/x/caviar/mod.ts';


class Game extends Scene {
    public test = new Rectangle(0, 0, 100, 100, "#00ff00");
    public test2 = new Rectangle(0, 0, 100, 100, "#00ff00");
    
    public setup() {
        this.addChild(this.test);
        this.addChild(this.test2);
    }
    public update() {
        this.test.setX(this.test.x + 5);
        this.test2.setX(this.test2.x + 2);
    }

}

const test = new World({
    title: "test",
    width: 800,
    height: 600,
    resizable: true,
}, [Game]);

await test.start();

perlin noise

import { World, Scene, Group, Rectangle } from 'https://deno.land/x/caviar/mod.ts';
import { PerlinNoise } from "https://deno.land/x/caviar/src/utils/mod.ts";

class Game extends Scene {
    public test: any;
    public chunkSize = 16;
    public tileSize = 16;
    public group: Group | undefined;
    
    public setup() {
        this.group = new Group(this, 0,0);
        this.world.loadPlugin('perlin', PerlinNoise);

        this.test = this.world.usePlugin('perlin');
        this.test.setSeed(0);

        for (let x = -40; x < this.chunkSize; x++) {
            for (let y = -40; y < this.chunkSize; y++) {
                const tileX = (1 * (this.chunkSize * this.tileSize)) + (x * this.tileSize);
                const tileY = (1 * (this.chunkSize * this.tileSize)) + (y * this.tileSize);
                const perlinValue = this.test.perlin2(tileX / 100, tileY / 100);
                if (perlinValue < 0.2) {
                    this.group.addChild(new Rectangle(tileX, tileY, this.tileSize, this.tileSize, '#ff0000'));
                }
                else if (perlinValue >= 0.2 && perlinValue < 0.3) {
                    this.group.addChild(new Rectangle(tileX, tileY, this.tileSize, this.tileSize, '#00ff00'));
                }
                else if (perlinValue >= 0.3) {
                    this.group.addChild(new Rectangle(tileX, tileY, this.tileSize, this.tileSize, '#0000ff'));
                }
            }
        }
        this.addChild(this.group);
    }
    public update() {
        
    }
}

const test = new World({
    title: "test",
    width: 800,
    height: 600,
    resizable: true,
}, [Game]);

await test.start();

pixel texture

import { Keys, PICO8, TextureSprite, Scene, World } from 'https://deno.land/x/caviar/mod.ts';
import type { KeyEvent, MouseDownEvent } from 'https://deno.land/x/caviar/mod.ts';

class Game extends Scene {
  public test = new TextureSprite(this, 10, 10, {
    data: [
      "..9..9..",
      "..9999..",
      ".AAAAAA.",
      ".A1F1FA.",
      ".AFFFFA.",
      ".FEEEEAA",
      ".EEEEEEA",
      "..E..E..",
    ],
    pixelWidth: 32,
    pixelHeight: 32,
    palette: PICO8,
  });

  public setup() {
    this.addChild(this.test);
  }
  public draw() {
    
  }
  public keyDown(key: KeyEvent) {
    switch (key.keycode) {
      case Keys.ARROWUP: {
        this.test.setY(this.test.y - 10);
        break;
      }
      case Keys.ARROWDOWN: {
        this.test.setY(this.test.y + 10);
        break;
      }
      case Keys.ARROWLEFT: {
        this.test.setX(this.test.x - 10);
        break;
      }
      case Keys.ARROWRIGHT: {
        this.test.setX(this.test.x + 10);
        break;
      }
    }
  }
}

const test = new World({
  title: "test",
  width: 800,
  height: 600,
  centered: true,
  fullscreen: false,
  hidden: false,
  resizable: true,
  minimized: false,
  maximized: false,
  flags: null,
}, [Game]);

await test.start();

License

MIT

Tools