暮色正落在石灰岩峽谷之上,金絲燕正飛回巢中。拋出藤索、擺盪、把弧度盪起,並在對的時機放手,把動能帶到下一個圓環——要在天光耗盡前收集六個燕窩並抵達棲所。這是一款由 AI 智慧代理從頭到尾在 Phaser 4 上完整撰寫的動能穿越遊戲,物理系統全部手工編寫,確保每個數值都可被量測。
按住 SPACE 拋出並抓住繩索‧A/D 擺盪‧W/S 收放‧觸控:按住右側、向左拖曳‧首個畫面僅 3.4 MB(隨後串流載入 3.7 MB 的樂器音效樣本)‧數秒內即可開始
平台的概念圖服務本輪額度已用盡(credit_balance_exhausted,記錄於 concept/gen.log),因此三張概念圖改由實驗室內部繪製——結果反而成了更嚴謹的規範。圖上每種顏色都是具名的十六進位色碼,每個比例都是明確標註的數值,因此 Blender 建置與最終上線檔案都能以數值而非目測方式,逐項對照概念圖檢核。下方的峽谷概念圖確立了三層視差帶、霧氣分界線,以及「天空漸層即是時鐘」這條規則。


整座峽谷在任何美術資產完成之前,就已用灰盒方式跑通,並由自動化玩家完整走過一遍。手感層便是在此階段調校完成:繩索約束、幫浦、收線、雙重重力、與速度連動的鏡頭。接著,可達性探測驅動了最終上線的
step() 直接進行——數千次幫浦式擺盪釋放試驗,沒有渲染、沒有牆鐘時間——結果顯示,幫浦式擺盪者能躍升超過自身環圈上方 202–558 px,並向前攜帶最多 2353 px。此關卡中的每個巢穴與每個岩刺平台,都座落在某次試驗實際到達的位置上;六者的最近誤差皆為 0–10 px。這部作品中的巢穴並非憑肉眼放置。


採集者是以程式建構的模型——沒有手工雕塑,也沒有素材商店。擺盪循環來自動作捕捉,但並非單一片段。工作室既有的精選資料庫裡完全沒有懸吊動作,因此團隊改為直接讀取整個 CMU 資料庫本身的描述索引,而非猜測受試者編號——結果找到了 43 號受試者,「遊樂場:抓握單槓、擺盪身體」。經過重新對應並逐格量測(手腕高度對頭部高度、軀幹垂直度)後,那段片段在 181 格裡只有八格呈現可用的懸吊姿勢,而 120 fps 下相鄰的八格畫面幾乎一致:從中取樣的循環會被相鄰幀差異檢測正確地判定為不合格。
因此這段循環是拼接組成的。手臂鏈固定在過頭抓握姿勢,腿部與脊椎則由一段移動片段(CMU 02_01)驅動,並在烘焙時將手臂的 F 曲線移除——因為有關鍵影格的骨骼會在每次影格變化時依動作重新運算,悄悄覆蓋掉手動設定的姿勢。手臂固定在繩索上、雙腿前後如剪刀般擺動,再疊加上手工製作的髖部搖擺與起伏動作:這正是盪鞦韆時該有的樣子。最終呈現的動作表在相鄰幀差異檢測中得到 6.17–9.70 的數值,通過了 4.0 的門檻——它最初只有 3.81 未過關,而修正方式是補足缺少的動作,而非降低門檻。
臉部並未烘焙進身體動作表中。它以獨立的五狀態動作表呈現——中性、眨眼、警覺、勝利、受傷——而製作流程會為每一格身體動作輸出頭部軸點的像素座標,讓引擎能將臉部合成到任何姿勢上。這正是角色能每隔幾秒眨眼、並在擺盪途中切換表情,而不必把身體動作表乘上表情數量的原因。






這間實驗室產出的不只是遊戲本身——還有背後的數據與理由。每個常數都經過 A/B 掃描測試,對照最終上線的模擬結果,而被捨棄的數值也是經過實測、而非憑空斷定的。以下是其中兩項掃描測試:
| 擺盪推力 | 6 秒後的峰值速度 | 6 秒內的方向反轉次數 | 結論 |
|---|---|---|---|
| 700 px/s² | 1441 px/s | 4 | 反應遲鈍——要花將近五秒才能有明顯移動 |
| 1150 px/s²——最終採用 | 1545 px/s | 5 | 感覺像鐘擺;3.5 秒達到全速 |
| 1600 px/s² | 1972 px/s | 8 | 開始感覺像馬達,而不是鞦韆 |
| 2400 px/s² | 2363 px/s | 10 | 六秒內反轉十次——弧線變得難以辨識 |
反轉次數就是可讀性的量測指標:鐘擺會反轉,馬達不會。第二項掃描測試才是真正讓我們意外的結果——收繩會保留角動量,因此在弧線最低點時把自己往上拉,確實能讓速度變快,但也只到某個限度為止。
| 收繩速率 | 峰值速度 | 結論 |
|---|---|---|
| 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 毫秒(8 個樣本) | 按下抓握 → 套用繩索約束,真實鍵盤路徑 |
| 繩索繃緊到反饋 | 32.3 毫秒 | 預算 100 毫秒 |
| 巢穴拾取到反饋 | 25.5 毫秒 | 預算 100 毫秒;刻意零命中停頓 |
| 鏡頭衝擊回穩 | 240 / 270 / 306 毫秒 | 4 / 9 / 15 像素階層至 <0.4 像素,零過衝 |
| 繩索繃緊命中停頓階梯 | 26 / 54 / 84 毫秒 | 徑向收合速度 403 / 712 / 1034 像素/秒 |
| 可達範圍 | 環上方 202–558 像素 | 19 個環 × 90 次幫浦試驗,已上線的 step() |
| 巢穴可達性 | 最近距離 0–10 像素,6/6 | 每個巢穴都位於某次試驗實際到達過的軌跡上 |
| 每格成本 | 平均 42.7 毫秒 · p95 95.2 毫秒 | 5 次機器人操作實測中最佳的 10 秒,原始 performance.now() 差值,於主機平均負載 39.6 ——軟體畫布,無 GPU 共用主機。每次執行皆於 audit/bench_runs.jsonl,包括負載 43 時測得 93 毫秒的那幾次。 |
| 承載量 | 首格前 3.4 MB · 總計 5.5 MB | 引擎、腳本與素材表優先載入;樂器取樣在首格後串流補上 |
| 美術修訂輪次 | 模型 4 輪 · 道具 1 輪 · 場景 3 輪 · 精靈 5 輪 · 系統 4 輪 | 模型、道具、場景、系統審核 |
這一行並不好看。在這台審核機器上無法展示 60 fps:它沒有 GPU,因此 Chromium 退回軟體畫布光柵化,我們測得的每格成本主要來自光柵化,而非遊戲本身。在真實硬體上,同一份建置會使用 WebGL 渲染器運作。我們回報的是實測結果,而非預期表現。
以位置為基礎、僅在拉緊時作用、零彈性係數——鬆弛直到繃緊瞬間。
收線即幫浦
抓住繩索時,世界的引力拉力增強為 1.26 倍。
縮放跟隨速度,刻意比位置跟隨更慢。
沿繩索法線臨界阻尼。僅有平移,絕不旋轉。
在固定的頭部樞紐上呈現五種狀態——無論身體姿勢為何,都能眨眼與反應。
全程沒有環境音床:空氣感來自配樂中弓弦式和聲鋪底。
每個收集物都放置在模擬試驗實際到達過的軌跡上。
該平台在 2D 領域的新預設引擎;在 canvas 與 WebGL 上通過 23/23 項 API 測試。