Swiftline

暮色正落在石灰岩峽谷之上,金絲燕正飛回巢中。拋出藤索、擺盪、把弧度盪起,並在對的時機放手,把動能帶到下一個圓環——要在天光耗盡前收集六個燕窩並抵達棲所。這是一款由 AI 智慧代理從頭到尾在 Phaser 4 上完整撰寫的動能穿越遊戲,物理系統全部手工編寫,確保每個數值都可被量測。

立即遊玩

按住 SPACE 拋出並抓住繩索‧A/D 擺盪‧W/S 收放‧觸控:按住右側、向左拖曳‧首個畫面僅 3.4 MB(隨後串流載入 3.7 MB 的樂器音效樣本)‧數秒內即可開始

▶ 開始遊玩

概念即契約

平台的概念圖服務本輪額度已用盡(credit_balance_exhausted,記錄於 concept/gen.log),因此三張概念圖改由實驗室內部繪製——結果反而成了更嚴謹的規範。圖上每種顏色都是具名的十六進位色碼,每個比例都是明確標註的數值,因此 Blender 建置與最終上線檔案都能以數值而非目測方式,逐項對照概念圖檢核。下方的峽谷概念圖確立了三層視差帶、霧氣分界線,以及「天空漸層即是時鐘」這條規則。

Swiftline 峽谷概念設定稿
概念圖 2/3——峽谷、其深度分層與暮色漸層
Swiftline 在遊戲引擎中的實際畫面
同一座峽谷,在 Phaser 4 中即時呈現於暮色 42%

先有灰盒,後有美術——關卡是依實測軌跡放置的

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

Swiftline 場景初版原型
灰盒原型:完整的手感層,尚無美術
Swiftline 在手機橫向畫面上的呈現
手機橫向——按住右半邊、拖曳左半邊

以程式在 Blender 中建模,以真實動作捕捉來製作動畫

採集者是以程式建構的模型——沒有手工雕塑,也沒有素材商店。擺盪循環來自動作捕捉,但並非單一片段。工作室既有的精選資料庫裡完全沒有懸吊動作,因此團隊改為直接讀取整個 CMU 資料庫本身的描述索引,而非猜測受試者編號——結果找到了 43 號受試者,「遊樂場:抓握單槓、擺盪身體」。經過重新對應並逐格量測(手腕高度對頭部高度、軀幹垂直度)後,那段片段在 181 格裡只有八格呈現可用的懸吊姿勢,而 120 fps 下相鄰的八格畫面幾乎一致:從中取樣的循環會被相鄰幀差異檢測正確地判定為不合格。

因此這段循環是拼接組成的。手臂鏈固定在過頭抓握姿勢,腿部與脊椎則由一段移動片段(CMU 02_01)驅動,並在烘焙時將手臂的 F 曲線移除——因為有關鍵影格的骨骼會在每次影格變化時依動作重新運算,悄悄覆蓋掉手動設定的姿勢。手臂固定在繩索上、雙腿前後如剪刀般擺動,再疊加上手工製作的髖部搖擺與起伏動作:這正是盪鞦韆時該有的樣子。最終呈現的動作表在相鄰幀差異檢測中得到 6.17–9.70 的數值,通過了 4.0 的門檻——它最初只有 3.81 未過關,而修正方式是補足缺少的動作,而非降低門檻。

臉部並未烘焙進身體動作表中。它以獨立的五狀態動作表呈現——中性、眨眼、警覺、勝利、受傷——而製作流程會為每一格身體動作輸出頭部軸點的像素座標,讓引擎能將臉部合成到任何姿勢上。這正是角色能每隔幾秒眨眼、並在擺盪途中切換表情,而不必把身體動作表乘上表情數量的原因。

採集者,工作室側面渲染圖
採集者——工作室端算圖,第 4 輪(共 4 輪)
角色概念設定稿
概念圖 1/3——算圖需依此契約取樣比對
最終上線版的八格擺盪動畫稿
最終上線的擺盪動作表——8 格、112 px,由動作捕捉驅動
五種表情狀態設定稿
五種臉部狀態,各自裁切並放大 11 倍——在實際發布尺寸下每個都只有幾個像素
手工打造的道具素材包
最終上線的道具組——概念圖上標註的每一項都是真實檔案
峽谷概念圖
……以及這些道具所依據製作的原始概念圖

手感研究

這間實驗室產出的不只是遊戲本身——還有背後的數據與理由。每個常數都經過 A/B 掃描測試,對照最終上線的模擬結果,而被捨棄的數值也是經過實測、而非憑空斷定的。以下是其中兩項掃描測試:

擺盪推力6 秒後的峰值速度6 秒內的方向反轉次數結論
700 px/s²1441 px/s4反應遲鈍——要花將近五秒才能有明顯移動
1150 px/s²——最終採用1545 px/s5感覺像鐘擺;3.5 秒達到全速
1600 px/s²1972 px/s8開始感覺像馬達,而不是鞦韆
2400 px/s²2363 px/s10六秒內反轉十次——弧線變得難以辨識

反轉次數就是可讀性的量測指標:鐘擺會反轉,馬達不會。第二項掃描測試才是真正讓我們意外的結果——收繩會保留角動量,因此在弧線最低點時把自己往上拉,確實能讓速度變快,但也只到某個限度為止。

收繩速率峰值速度結論
0 px/s(僅靠擺盪)1545 px/s基準值
330 px/s——最終採用1840 px/s比單靠擺盪快 19%
700 px/s1711 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 倍。

與速度連動的鏡頭

縮放跟隨速度,刻意比位置跟隨更慢。

方向性衝擊

沿繩索法線臨界阻尼。僅有平移,絕不旋轉。

會做出反應的臉

在固定的頭部樞紐上呈現五種狀態——無論身體姿勢為何,都能眨眼與反應。

編排出的氛圍

全程沒有環境音床:空氣感來自配樂中弓弦式和聲鋪底。

經過測量的關卡設計

每個收集物都放置在模擬試驗實際到達過的軌跡上。

Phaser 4.1.0

該平台在 2D 領域的新預設引擎;在 canvas 與 WebGL 上通過 23/23 項 API 測試。

幫浦 1150 像素/秒² 收線 330 像素/秒 G_swing 2120 / G_air 1680 彈性係數 0 繩長上限 470 像素 空中操控 700 像素/秒² 煞車加成 1.55× 命中停頓 26/54/84 毫秒 衝擊 4/9/15 像素 @ 19 弧度/秒 預判 0.28 秒,上限 265 像素 縮放 1.00→0.80 @ 2.2 秒⁻¹ 拖影閾值 880 像素/秒 黃昏 110 秒
由 BuildMidas Phaser 實驗室從頭到尾打造——由 AI 智慧代理進行構思、建模、動作捕捉動畫、調校、測量與驗證。同一套流程也驅動著 AI 遊戲建構器