本文へスキップ

基本コンセプト ​

Game ​

Game はキャンバス、ループ、そして共有サービス(camera、random、params、stats、hooks、inspect)を持っています。

ts
import { Game } from "@debuffjp/core";

const game = new Game({ canvas, width: 320, height: 180, scale: "integer", pixelArt: true });

ゲームのコードは常に 論理単位(この例では 320×180)で書きます。キャンバスはコンテナに合わせて拡大縮小され、高 DPI の画面でもバッキングストアをくっきり保ちます。

scale挙動
fit(デフォルト)アスペクト比を保ったままコンテナいっぱいに表示
integer整数倍のスケールのみ。ドット絵をくっきり見せたいときに
none論理サイズをそのまま CSS ピクセルで表示

シーン ​

シーンはただのオブジェクトです。メソッドはすべて省略できます。

ts
game
  .add({
    id: "play",
    enter() {},
    update(dt) {}, // fixed step, seconds
    render(draw, alpha) {}, // draw in logical units; alpha interpolates between steps
    exit() {},
    inspect: () => ({ score }), // JSON for tools and tests
  })
  .go("play");
game.start();

固定ステップのループ ​

シミュレーションは、ディスプレイのリフレッシュレートに関係なく、決まった刻み(デフォルトは 1/60 秒)で進みます。描画には alpha が渡されるので、動きをなめらかに補間できます。シード付きの game.random と組み合わせれば、同じ入力からは必ず同じゲームが生まれます。これがシナリオテストを再現可能にしている仕組みです。

  • game.freeze(0.08):ヒットストップ。シミュレーションは止まり、描画は続きます。
  • game.timeScale = 0.5:スローモーション。
  • タブが非表示になると、ループは自動で一時停止します。

フックとプラグイン ​

game.hooks は beforeUpdate、afterUpdate、beforeRender、afterRender、sceneChange を公開しています。game.use(plugin) で、これらの上に作られた再利用可能な振る舞いを組み込めます。プラグインを見てください。