Skip to content

エンジン概要

@uzuhq/engine-2d は Vibe Coding を前提とした AI ファーストな Canvas ベースの 2D ゲームエンジンです。Claude Code などの AI アシスタントがドキュメントを参照しながらゲームを実装できるよう、シンプルで宣言的な API を提供します。レスポンシブな画面サイズ対応と高 DPI ディスプレイへの自動対応を備えており、UZU PlayScreen SDK と組み合わせてマルチプレイゲームを構築できます。

エンジンの役割

エンジンは描画とゲームオブジェクトの管理に特化しています。通信やサウンドなど、SDK が既に提供している機能はエンジンでは扱いません。

機能担当
ノード(ゲームオブジェクト)の管理エンジン
アニメーション・画面効果エンジン
衝突判定・物理演算エンジン
カメラ・タイルマップエンジン
サウンド(SE・BGM)SDK (@uzuhq/code-sdk)
マルチプレイ(通信)SDK (@uzuhq/code-sdk)

エンジンの初期化

createEngine() で Canvas 要素を渡してエンジンを作成します。

typescript
import { createEngine } from '@uzuhq/engine-2d';

const engine = createEngine({
  canvas: document.getElementById('canvas') as HTMLCanvasElement,
  background: '#1a1a2e',
  assets: {
    images: { player: '/sprites/player.png' },
  },
});
await engine.ready; // アセットロード完了を待つ

設定オプション

プロパティデフォルト説明
canvasHTMLCanvasElement必須描画先の canvas 要素
widthnumbercanvas.widthデザイン幅(固定サイズモード用)
heightnumbercanvas.heightデザイン高さ(固定サイズモード用)
backgroundstring'#000'背景色
assets.imagesRecord<string, string>初期ロードする画像 {キー: URL}

画面サイズとレスポンシブ対応

エンジンはデフォルトでレスポンシブモードで動作します。端末によって画面サイズが変わるため、座標のハードコードは禁止です。必ず engine.width / engine.height を使ってください。

レスポンシブモード(デフォルト)

縦画面の場合、幅は固定値 390 になり、高さは端末の画面比率によって 640〜844 の範囲で変動します。

typescript
// デフォルト: 縦画面
createEngine({ canvas });

// 明示的に縦画面を指定
createEngine({ canvas, orientation: 'portrait', baseSize: 390, maxLength: 844 });

// 横画面
createEngine({ canvas, orientation: 'landscape', baseSize: 390, maxLength: 844 });
設定デフォルト説明
orientation'portrait' | 'landscape''portrait'画面の向き
baseSizenumber390固定軸のサイズ(縦画面=幅、横画面=高さ)
maxLengthnumber844可変軸の上限

固定サイズモード

レスポンシブが不要な場合や、既存ゲームの互換性を保つ場合に使います。

typescript
createEngine({ canvas, width: 600, height: 600 });

レイアウトの指針

要素の配置コード例
上端に固定(スコアなど)y: 20
下端に固定(ボタンなど)y: engine.height - 80
画面中央x: engine.width / 2, y: engine.height / 2
全幅のボタンx: 30, width: engine.width - 60
画面外から登場させるy: engine.height + 50(下端外)

数値のハードコードに注意

画面サイズは端末によって異なります。以下のような書き方は避けてください。

typescript
// NG
const centerX = 195;
const groundY = 784;

// OK
const centerX = engine.width / 2;
const groundY = engine.height - 60;

次のステップ