石灰岩の渓谷に夕闇が迫り、アナツバメたちが巣へ帰っていく。籐のラインを投げ、スイングし、弧を漕いで勢いをつけ、絶妙なタイミングで手を離して次のリングへと勢いを繋げていく——光が消える前に6つの巣を集め、ねぐらへたどり着け。AIエージェントが最初から最後まで作り上げた、Phaser 4によるモーメンタム・トラバーサルゲーム。物理はすべて手書きで、あらゆる数値が計測可能なものになっている。
SPACEキー長押しで投げてラインを掴む・A/Dで漕ぐ・W/Sで巻き取る・タッチ操作:右側を長押しして左にドラッグ・初回フレームまで3.4MB(その後3.7MBの楽器サンプルがストリーミング)・数秒で開始
プラットフォームのコンセプト画像サービスは今回のサイクルでクレジット切れとなり(credit_balance_exhausted、ログイン済み concept/gen.log)、代わりに3枚のコンセプトシートをラボ内で描き起こしました — 結果的にこちらの方が優れた仕様書となりました。すべての色は名前付きのHex値で指定され、すべての比率は数値で明記されているため、Blenderでのビルドと出荷ファイルは目視ではなく数値でシートと照合されています。以下の峡谷シートでは、3つのパララックス層、霧の落下ラインの位置、そして「空のグラデーションが時計そのものである」というルールが定められています。


アートが存在する前に、峡谷全体はグレーボックスの状態で動作し、自動プレイヤーによって走破されていました。感触レイヤーはそこで調整されました — ロープの拘束、ポンプ、リール、2つの重力、速度連動カメラなど。その後、到達可能性の検証によって出荷版の
step() 直接検証しました——レンダリングも実時間の壁もない、数千回のポンピングスイング&リリース試行です。その結果、ポンピングスインガーは自身のリング上202〜558px上昇し、最大2353px前方に運ばれることが判明しました。このレベル内のすべての巣とすべてのスパー足場は、これらの試行のいずれかが実際に到達した地点に配置されています。6か所すべてで最接近距離は0〜10pxです。この作品において、巣は目分量で配置されているわけではありません。


採集キャラクターはコードで構築されたモデルであり、手作業でのスカルプトもアセットストアの利用もない。スイングのサイクルはモーションキャプチャだが、単一のクリップからではない。スタジオが厳選したライブラリにはぶら下がる動作が一切なかったため、被写体番号を推測するのではなくCMUアーカイブ全体の説明インデックスを読み込み、被写体43番——「playground: grip bar, swing body」——を見つけ出した。リターゲットした上でフレームごとに計測(頭部の高さに対する手首の高さ、胴体の垂直性)したところ、そのクリップで使えるぶら下がり姿勢は181フレーム中わずか8フレームしかなく、120fpsでの隣接する8フレームは実質同じ絵であるため、それらから抽出したサイクルは隣接フレーム差分ゲートに正しく落ちてしまう。
そこでサイクルは合成して作られている。腕のチェーンはオーバーヘッドグリップの姿勢で固定し、脚と背骨は移動用クリップ(CMU 02_01)で駆動する——ただしベイクからは腕のFカーブを取り除いてある。キー付きボーンはフレームが変わるたびにそのアクションから再評価され、手で設定したポーズを黙って上書きしてしまうからだ。腕はラインに固定したまま、脚は前後にシザー運動をし、その上に作り込んだ腰の揺れとバウンスを加える——ブランコを漕ぐ動きとはこういうものだ。出荷されたシートは閾値4.0に対して6.17〜9.70で隣接フレームゲートを通過している——最初は3.81で不合格となり、その修正はゲートを下げることではなく、欠けていた動きを追加することだった。
顔は体のシートに焼き込まれていない。ニュートラル・まばたき・警戒・勝利・被弾という5状態を持つ独自のシートとしてレンダリングされ、パイプラインはすべてのボディフレームについて頭部ピボットをフレームピクセル単位で出力する。これによりエンジンはどのポーズにも顔を合成できる。だからこそキャラクターは数秒おきにまばたきをし、スイング中でも表情を変えられる——表情の数だけボディシートを増やす必要なしに。






このラボの成果物はゲームだけではない——数値とその根拠も含まれる。すべての定数は出荷されたシミュレーションに対してA/Bスイープされ、捨てられた値も断定ではなく計測によって決められた。以下は2つのスイープ例だ。
| ポンプの効き | 6秒後の最高速度 | 6秒間の方向転換回数 | 評価 |
|---|---|---|---|
| 700 px/s² | 1441 px/s | 4 | 動きが鈍い——どこかへたどり着くのに5秒近くかかる |
| 1150 px/s² — 採用値 | 1545 px/s | 5 | 振り子として自然に見える;全速まで3.5秒 |
| 1600 px/s² | 1972 px/s | 8 | ブランコというよりモーターのように見え始める |
| 2400 px/s² | 2363 px/s | 10 | 6秒で10回の方向転換——弧の動きが読み取れない |
方向転換の回数が読みやすさの指標だ:振り子は反転するが、モーターはしない。2つ目のスイープは私たちを驚かせたものだ——ラインを巻き取ると角運動量が保存されるため、弧の底でロープを引き上げると本当に速くなる、ただしそれにも限度がある。
| 巻き取り速度 | 最高速度 | 評価 |
|---|---|---|
| 0 px/s(ポンプのみ) | 1545 px/s | 基準値 |
| 330 px/s — 採用値 | 1840 px/s | ポンプのみと比べて+19% |
| 700 px/s | 1711 px/s | 悪化。ラインが最小値で底を打ち、スイングは飛び立つための弧を失った、タイトで速い円運動に潰れてしまう |
フレームコストは監査用ボックスからの数値です。GPUを搭載しない共有ホストで、ChromiumのソフトウェアCanvasレンダラーを使用しています。これは本作が経験しうる最悪のケースであり、印刷したくない数値も含めて、すべて実測値として報告しています。
| 測定 | 結果 | 条件 |
|---|---|---|
| 入力から応答まで | 0〜10.3 ms(8サンプル) | アーム済みプレス → ロープ拘束の適用、実際のキーボード経路 |
| ロープスナップからフィードバックまで | 32.3 ms | 予算 100 ms |
| 巣ピックアップからフィードバックまで | 25.5 ms | 予算 100 ms;意図的にヒットストップなし |
| カメラキックの収束 | 240 / 270 / 306 ms | 4 / 9 / 15 px の段階から0.4 px未満へ、オーバーシュートゼロ |
| ロープスナップのヒットストップ段階 | 26 / 54 / 84 ms | 放射状の収束速度 403 / 712 / 1034 px/s |
| 到達可能範囲 | リングより202〜558 px上 | 19リング × 90回のポンプ試行、出荷版step()を使用 |
| 巣の到達可能性 | 最接近0〜10 px、6/6 | すべての巣は、いずれかの試行が到達した軌道上に配置 |
| フレームコスト | 平均42.7 ms・p95 95.2 ms | ボット操作プレイ5回×10秒のベスト、生データ performance.now() 差分、ホスト負荷平均時 39.6 ——ソフトウェアキャンバス、GPUなし共有ボックス。すべての実行は audit/bench_runs.jsonl、負荷43で93msを記録したものも含みます。 |
| ペイロード | 初回フレームまで3.4 MB・合計5.5 MB | エンジン・スクリプト・シートを最初に読み込み、インストゥルメントサンプルは初回フレームの裏でストリーミング |
| アートの反復回数 | モデル4・小道具1・環境3・スプライト5・システム4 | モデル、小道具、環境、システムの監査 |
ありのままの行。この監査用ボックスでは60 fpsを示すことができません。GPUがないため、ChromiumはソフトウェアCanvasラスタライザーにフォールバックし、計測されるフレームコストはゲームそのものではなくラスタライズ処理が支配的になります。実機ではWebGLレンダラーで同じビルドが動作します。私たちは期待値ではなく実測値を報告します。
位置ベース、張力時のみ機能、反発係数ゼロ——たるんでいる状態から一気にスナップする。
角運動量保存則:ラインを短くするほど速くなる。
ラインを掴んでいる間、世界はあなたを1.26倍強く引っ張る。
ズームは速度に追従するが、位置追従よりも意図的に緩慢。
ロープ法線に沿って臨界減衰。平行移動のみ、回転は一切しない。
焼き込まれた頭部ピボット上の5つの状態——どんな体のポーズでも瞬きし、反応する。
アンビエンス素材はどこにもない:空気感はスコア内のボウド・パッドコードで作られている。
すべての収集アイテムは、シミュレーション試行が実際に到達した軌道上に配置。
2Dにおけるプラットフォームの新しいデフォルト。CanvasとWebGLの両方で23件中23件のAPIプローブが成功。