準備は少なく、創造はもっと。
2D ブラウザゲームのためのオープンソースツールキット。退屈な部分は任せて、楽しいところへ早くたどり着けます。
2D ブラウザゲームのためのオープンソースツールキット。退屈な部分は任せて、楽しいところへ早くたどり着けます。
最高の 2D Web ゲームを、もっと手軽に
ゲームはいつも小さなひらめきから始まります。いじってみたくなる世界、手触りが「ちょうどいい」ジャンプ、自分にしか思いつかないネタ。ところがそこへ配管工事がやってきます。ゲームループ、くっきりしたドット、操作、サウンド、レベル、アセット、そして「なんで壊れたの?」の調査。遊べるところまで行く前に、ひらめきがしぼんでしまうこともあります。
配管工事は debuff が引き受けます。あなたはいじって、揺らして、わざと壊して、思わずニヤッとした部分だけを残していけばいいのです。
game.world.systems.physics.step() の奥深くまで潜る必要はありません。ゲームは update と render を持つシーンで、楽しい機能はどれも呼び出しひとつで使えます。
const game = new Game({ canvas, width: 320, height: 180 });
const input = new Input(game, {
bindings: { pop: ["Space", "PadA", "Pointer"] },
});
game.add(play).go("play");
game.start();// ふわふわしすぎ? しっくりくるまで開発パネルのスライダーを動かしましょう。
const tuning = game.params.define("player", {
speed: { type: "number", default: 140, min: 0, max: 600, units: "px/s" },
});
player.vx = approach(player.vx, dir * tuning.values.speed, accel * dt);if (input.pressed("pop")) {
// ぷにっ、キラッ、ブルッ、ポン
squash(tweens, player, 0.35);
particles.emit({ x: player.x, y: player.y, count: 16, gravity: 200 });
game.camera.shake(0.3);
audio.synth({ freq: 660, freqEnd: 220, decay: 0.15 });
}import { expect, play, test } from "keiko";
test("never leaves the screen", async () => {
const game = await play<State>();
game.press("ArrowLeft");
game.during("3s", (s) => s.player.x >= 8, "buff stays on screen");
});{
"steps": [
{ "press": "ArrowRight" },
{ "wait": 30 },
{ "release": "ArrowRight" },
{ "expect": { "state.player.x": { "gt": 200 } } },
{ "capture": "moved" }
]
}サンプルには、タイルマップのプラットフォーマー、見下ろし型アドベンチャーの mossfell、マッチ3 の squish、群れを生き延びるサバイバルゲーム Overbuffed があります。どれもブラウザですぐに遊べて、それぞれのソースと関連ドキュメントもそろっています。
エージェントは大歓迎ですが、必須ではありません。debuff MCP サーバーを使えば、Claude Code のようなエージェントが、あなたの開いているゲームを遊べます。状態や説明付きのエラーを読み、パラメータを調整し、変更をシナリオで検証したりもできます。エージェントの操作はすべて開発パネルに表示され、そこから元に戻せます。
新しいプロジェクトにはコマンドとルールをまとめた AGENTS.md が入っているので、エージェントは最初から正しい文脈で作業を始められます。創作上の判断はあなたのものです。ツールは、エージェントが提案し、人が決めるように作られています。
Vite、Vitest、happy-dom、TypeScript、Tiled、LDtk をはじめ、たくさんのオープンソースの成果の上に成り立っています。ありがとうございます。