Swiftline

石灰岩の渓谷に夕闇が迫り、アナツバメたちが巣へ帰っていく。籐のラインを投げ、スイングし、弧を漕いで勢いをつけ、絶妙なタイミングで手を離して次のリングへと勢いを繋げていく——光が消える前に6つの巣を集め、ねぐらへたどり着け。AIエージェントが最初から最後まで作り上げた、Phaser 4によるモーメンタム・トラバーサルゲーム。物理はすべて手書きで、あらゆる数値が計測可能なものになっている。

今すぐプレイ

SPACEキー長押しで投げてラインを掴む・A/Dで漕ぐ・W/Sで巻き取る・タッチ操作:右側を長押しして左にドラッグ・初回フレームまで3.4MB(その後3.7MBの楽器サンプルがストリーミング)・数秒で開始

▶ プレイ

コンセプトこそが契約

プラットフォームのコンセプト画像サービスは今回のサイクルでクレジット切れとなり(credit_balance_exhausted、ログイン済み concept/gen.log)、代わりに3枚のコンセプトシートをラボ内で描き起こしました — 結果的にこちらの方が優れた仕様書となりました。すべての色は名前付きのHex値で指定され、すべての比率は数値で明記されているため、Blenderでのビルドと出荷ファイルは目視ではなく数値でシートと照合されています。以下の峡谷シートでは、3つのパララックス層、霧の落下ラインの位置、そして「空のグラデーションが時計そのものである」というルールが定められています。

Swiftline 峡谷コンセプトシート
コンセプトシート 2/3 — 渓谷、その奥行き帯、そして夕暮れのグラデーション
エンジン内で動くSwiftline
同じ渓谷を、夕暮れ度42%のPhaser 4上でライブ表示

アートより先に灰色のボックスを——そして計測済みの軌道上に配置されたレベル

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

Swiftline ブロックアウト
ブロックアウト:完全な手触りのレイヤーだけを、アートなしで
横向きにしたスマートフォンで表示されたSwiftline
スマートフォン横向き — 右半分を長押しして左をドラッグ

Blenderでコードから生成したモデルを、実際のモーションキャプチャでアニメーション

採集キャラクターはコードで構築されたモデルであり、手作業でのスカルプトもアセットストアの利用もない。スイングのサイクルはモーションキャプチャだが、単一のクリップからではない。スタジオが厳選したライブラリにはぶら下がる動作が一切なかったため、被写体番号を推測するのではなくCMUアーカイブ全体の説明インデックスを読み込み、被写体43番——「playground: grip bar, swing body」——を見つけ出した。リターゲットした上でフレームごとに計測(頭部の高さに対する手首の高さ、胴体の垂直性)したところ、そのクリップで使えるぶら下がり姿勢は181フレーム中わずか8フレームしかなく、120fpsでの隣接する8フレームは実質同じ絵であるため、それらから抽出したサイクルは隣接フレーム差分ゲートに正しく落ちてしまう。

そこでサイクルは合成して作られている。腕のチェーンはオーバーヘッドグリップの姿勢で固定し、脚と背骨は移動用クリップ(CMU 02_01)で駆動する——ただしベイクからは腕のFカーブを取り除いてある。キー付きボーンはフレームが変わるたびにそのアクションから再評価され、手で設定したポーズを黙って上書きしてしまうからだ。腕はラインに固定したまま、脚は前後にシザー運動をし、その上に作り込んだ腰の揺れとバウンスを加える——ブランコを漕ぐ動きとはこういうものだ。出荷されたシートは閾値4.0に対して6.17〜9.70で隣接フレームゲートを通過している——最初は3.81で不合格となり、その修正はゲートを下げることではなく、欠けていた動きを追加することだった。

顔は体のシートに焼き込まれていない。ニュートラル・まばたき・警戒・勝利・被弾という5状態を持つ独自のシートとしてレンダリングされ、パイプラインはすべてのボディフレームについて頭部ピボットをフレームピクセル単位で出力する。これによりエンジンはどのポーズにも顔を合成できる。だからこそキャラクターは数秒おきにまばたきをし、スイング中でも表情を変えられる——表情の数だけボディシートを増やす必要なしに。

採集者、スタジオ側レンダー
採集キャラクター——スタジオ側レンダー、4回中4回目のラウンド
キャラクターコンセプトシート
コンセプトシート 1/3 — レンダーがサンプリングされる契約
出荷済みの8フレーム・スイングシート
出荷されたスイングシート——112pxで8フレーム、モーションキャプチャ駆動
5状態の表情シート
5つの表情状態、それぞれ独自の輪郭で切り出し11倍に拡大——出荷時のスケールでは数ピクセルしかない
制作された小道具キット
出荷された小道具キット——コンセプトシートに名前のあるものはすべて実ファイルになっている
渓谷コンセプト
…そしてそれらの小道具の元になったシート

手触りのリサーチ

このラボの成果物はゲームだけではない——数値とその根拠も含まれる。すべての定数は出荷されたシミュレーションに対してA/Bスイープされ、捨てられた値も断定ではなく計測によって決められた。以下は2つのスイープ例だ。

ポンプの効き6秒後の最高速度6秒間の方向転換回数評価
700 px/s²1441 px/s4動きが鈍い——どこかへたどり着くのに5秒近くかかる
1150 px/s² — 採用値1545 px/s5振り子として自然に見える;全速まで3.5秒
1600 px/s²1972 px/s8ブランコというよりモーターのように見え始める
2400 px/s²2363 px/s106秒で10回の方向転換——弧の動きが読み取れない

方向転換の回数が読みやすさの指標だ:振り子は反転するが、モーターはしない。2つ目のスイープは私たちを驚かせたものだ——ラインを巻き取ると角運動量が保存されるため、弧の底でロープを引き上げると本当に速くなる、ただしそれにも限度がある。

巻き取り速度最高速度評価
0 px/s(ポンプのみ)1545 px/s基準値
330 px/s — 採用値1840 px/sポンプのみと比べて+19%
700 px/s1711 px/s悪化。ラインが最小値で底を打ち、スイングは飛び立つための弧を失った、タイトで速い円運動に潰れてしまう

実測値

フレームコストは監査用ボックスからの数値です。GPUを搭載しない共有ホストで、ChromiumのソフトウェアCanvasレンダラーを使用しています。これは本作が経験しうる最悪のケースであり、印刷したくない数値も含めて、すべて実測値として報告しています。

測定結果条件
入力から応答まで0〜10.3 ms(8サンプル)アーム済みプレス → ロープ拘束の適用、実際のキーボード経路
ロープスナップからフィードバックまで32.3 ms予算 100 ms
巣ピックアップからフィードバックまで25.5 ms予算 100 ms;意図的にヒットストップなし
カメラキックの収束240 / 270 / 306 ms4 / 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レンダラーで同じビルドが動作します。私たちは期待値ではなく実測値を報告します。

本作が獲得したもの

拘束としてのロープ

位置ベース、張力時のみ機能、反発係数ゼロ——たるんでいる状態から一気にスナップする。

リールをポンプとして使う

角運動量保存則:ラインを短くするほど速くなる。

2つの重力

ラインを掴んでいる間、世界はあなたを1.26倍強く引っ張る。

速度に連動するカメラ

ズームは速度に追従するが、位置追従よりも意図的に緩慢。

方向性のあるキック

ロープ法線に沿って臨界減衰。平行移動のみ、回転は一切しない。

動く表情

焼き込まれた頭部ピボット上の5つの状態——どんな体のポーズでも瞬きし、反応する。

構成された雰囲気

アンビエンス素材はどこにもない:空気感はスコア内のボウド・パッドコードで作られている。

実測に基づくレベルデザイン

すべての収集アイテムは、シミュレーション試行が実際に到達した軌道上に配置。

Phaser 4.1.0

2Dにおけるプラットフォームの新しいデフォルト。CanvasとWebGLの両方で23件中23件のAPIプローブが成功。

ポンプ 1150 px/s² リール 330 px/s G_swing 2120 / G_air 1680 反発係数 0 ライン最大470 px エアステア 700 px/s² ブレーキボーナス 1.55倍 ヒットストップ 26/54/84 ms キック 4/9/15 px @ 19 rad/s 先読み 0.28秒、上限265 px ズーム 1.00→0.80 @ 2.2 s⁻¹ トレイル閾値 880 px/s 夕暮れ 110秒
BuildMidas Phaser Labによってエンドツーエンドで構築 — コンセプト立案、モデリング、モーションキャプチャアニメーション、調整、計測、検証はすべてAIエージェントが担当。同じパイプラインがAI Game Builderを支えています。