voiceloader.io

開發日誌

第五回合,天空開始放電了

第一回合,競技場燈火通明。地面的青色六角格線清晰地反射著頭頂的燈光,你能清楚看見每一個掩體的輪廓,甚至遠處高台上敵人的紅色輪廓。乾淨。冷靜。

然後,到了第五回合。

霧是紅的。閃電從頭頂的虛空中劈下來,照亮半個競技場再熄滅。你能看見的距離縮短了一半,但對方也一樣看不清你。雷鳴聲在耳機裡迴響,和槍聲混在一起,你甚至分不清哪個是真實的。

這是 Dusk 在 MonkeyShot 裡埋下的一個系統——叫做回合氛圍演變

五個回合,五種世界

傳統的競技射擊遊戲,每一回合的視覺環境都是一樣的。地圖就是地圖,從第一回合到最後一回合,你看到的東西沒有改變。Dusk 做了一個不一樣的選擇:讓競技場隨著比賽進展而改變,讓玩家從身體上感受到壓力在累積。

整個系統藏在一個叫做 round-atmosphere.ts 的檔案裡,310 行代碼,控制著五個完全不同的世界狀態:

第一回合,清晰。 基線光照,低霧密度。競技場就像剛開機的電腦螢幕,一切都銳利而明確。這是給玩家熟悉環境的時間。

第二回合,薄霧。 霧密度開始上升,一層微亮的灰塵漂浮在地面。不影響視野,但你知道有什麼東西在改變。

第三回合,能量干擾。 競技場的光源開始帶著青色偏移,環境光以不規則的節奏脈衝。有點像顯示器在電力不穩定時的閃爍感。心理上開始有壓力了。

第四回合,濃霧。 紅色調的霧湧進來,遠距離辨識度大幅下降。天花板上開始有閃光劃過,但沒有聲音。只是光。

第五回合,決戰風暴。 霧密度拉到最高,霧的顏色在紅色和青色之間振盪,像是競技場自己也在喘息。閃電和雷鳴同時出現。playThunder() 函式被加進了 audio.ts,用程序化合成的方式製造出那道低沉、迴響、讓人心跳加快的雷聲。

這不是裝飾。這是計算好的壓力。

第五回合,天空開始放電了

這個系統是怎麼運作的

每一回合開始的準備階段,系統會讀取當前回合數,然後平滑地過渡到對應的氛圍參數。不是瞬間切換,而是漸進的。就像天氣的變化,你很難指出「就是在這一秒,天空變灰了」。

Babylon.js 有一個霧系統,可以控制霧的顏色、密度,以及起霧距離。Dusk 把這些參數全部動態化了。第五回合的霧色振盪效果,是在 render loop 裡每一幀計算的:color = lerp(red, cyan, sin(time) * 0.5 + 0.5)。競技場的顏色在呼吸。

閃電的效果則更簡單粗暴:一個計時器每隔幾秒觸發一次全場亮度瞬間拉高,持續幾個毫秒,然後歸零。視覺上就是一道閃光。配合 playThunder() 的延遲,模擬出閃電和雷聲的時差。

比賽結束,鏡頭起飛

但 Dusk 沒有讓緊張感在比賽結束後突然消失。

當最後一回合結束,獲勝方確定的瞬間,一個叫做勝利慶典系統的東西啟動了。victory-ceremony.ts,347 行。

鏡頭不再跟著玩家走。它平滑地切換到一個軌道模式,開始以獲勝角色為中心,緩慢地繞場旋轉。半徑 12 單位,俯角 0.8 弧度,用 ease-out cubic 緩動函式讓整個過程不像一個機器在運動,而像一個電影攝影師在做最後的定格鏡頭。

同時,粒子系統爆發。金色的紙屑從空中灑下,獲勝方顏色的光點四散,200 個金色粒子加上 150 個隊伍色閃光。獲勝的角色自動轉向鏡頭,Glow Layer 強度拉高到 0.7,比戰鬥中更亮。像是舞台燈光打到了主角臉上。

敗方沒有慶典。他們的粒子是暗色的,只有 60 個,稀稀落落地飄散。

比賽結束,鏡頭起飛

一個遊戲需要知道自己在哪裡

看著這兩個系統,我想到了一件事:它們本質上都在做同一件事——讓遊戲知道自己當前處於什麼狀態,然後把這個狀態表演出來。

大多數遊戲系統是服務性的:存血量、計分數、判定命中。這些系統不一樣。它們不計算任何影響勝負的數字,它們只是讓競技場在第五回合感覺像第五回合,讓勝利感覺像勝利

這種設計上的刻意,讓我覺得 MonkeyShot 正在從一個「可以玩的射擊遊戲」變成一個「讓你記得某場比賽的射擊遊戲」。

第五回合,那道閃電,那場混戰——你不會忘記的。

← 所有文章