一款確定性的角度發射物理遊戲,會在拋射體發射的瞬間,以像素為單位求出完整的軌跡,沒有會漂移的動畫計時器,也沒有任何隨機因素會干擾練習。發射向量的設定方式,是往目標的反方向拖曳:從你想讓拋射體前進的方向拉開,放開之後,路徑就會在一個四秒的視窗內,計算成單一一條確定性的曲線。命中與未命中,是依照各次嘗試之間位置不會改變的固定目標來評分的,因此一次成功的發射,用同樣的拉法再做一次,結果依然會成功。Slingshot Launcher 把這個概念,變成一條五關的練習路線,每個成功清除的目標,都正好值 200 分,整條路線最終會停在固定的 1,000 分。遊戲場地尺寸為 640 乘 360 像素,重力數值設定為向下 180 像素單位,而計分規則,從第一次發射到最後一個目標,全程都保持可見。因為完整路徑是同步計算出來的,不論你是在前景分頁、背景分頁,還是速度較慢的瀏覽器中遊玩,結果都會相同。

五個固定目標背後、通往 1,000 分的終點
Slingshot Launcher 用一條固定的五關路線,取代了物理遊戲中常見的隨機性。每一關都會在 640 乘 360 的遊戲場地上,把一個圓形目標放在固定位置。命中會清除該關,並正好增加 200 分;清除全部五個目標,會得到滿分 1,000 分。沒有計時器驅動這個動畫,所以在安靜的桌上型電腦上會命中的一次拉法,在忙碌的筆電上也會同樣命中。這款遊戲是娛樂性的瞄準練習,而不是彈道計算機或安全工具。重力、速度縮放係數、發射點位置、目標中心點、目標半徑、拋射體半徑、四秒的路徑視窗,以及計分規則,全部都是以螢幕像素與遊戲秒數表示的原創產品設定值。當拋射體的路徑穿過目標區域時,就算是命中;碰撞判定使用的是目標與拋射體半徑的總和,並檢查目標中心到每一段相鄰軌跡線段之間的距離,這能避免一條快速路徑,在兩次取樣之間,在視覺上穿過目標卻沒有被判定到的情況。
發射角度背後、反向拖曳的操作機制
Slingshot Launcher 遵循熟悉的彈弓概念:拋射體會朝拖曳的反方向前進。放開時的拉動點,會從固定的發射點原點中被減去,接著這個向量會乘上一個產品自訂的速度縮放係數,來決定發射方向與速度。往左拉,會在螢幕 x 方向上產生正的水平速度。往下拉,會在螢幕 y 方向上產生負的垂直速度,而較小的 y 值,在畫面上的位置較高,所以往下拉的橡皮筋,會像真正的彈弓一樣,把拋射體往上彈射。允許的拉動長度有上限,讓指標裝置、觸控與鍵盤控制,都在相同的範圍內運作。當你想讓拋射體往右上方飛時,就要往左下方拖曳。當你想讓它朝一個低矮的目標陡峭下墜時,就要往上、遠離該目標中心的方向拉動。這個操作機制在每一關都保持一致:解讀每次試拉所產生的曲線路徑,然後不斷調整拉法,直到曲線穿過目標圓圈為止。
如何逐步遊玩 Slingshot Launcher
- 在發射點原點的拋射體上,用指標裝置或手指開始這一輪。
- 朝遠離目標的方向拖曳——這個方向就會變成相反的發射向量——並在拖曳距離超過上限拉動長度之前放開。
- 觀察遊戲在整個四秒視窗內畫出的虛線路徑;如果曲線沒有命中,就判斷該加長距離,還是改變角度。
- 透過再次拖曳來調整,或是把焦點移到這個範圍上,用方向鍵以五像素為單位逐步調整拉動位置,再按下 Space 或 Enter 發射。
- 命中目標會增加 200 分並進入下一關;如果出現第二個不同的未命中特徵,這場遊戲就會陷入死鎖,此時 Restart 會是唯一能繼續遊玩的方式。
未命中之後,如何解讀虛線路徑
一次發射之後,會出現兩條可見的曲線。虛線記錄的是上一次計算出來的軌跡,作為靜態參考;而一條較淺色的預覽線,則會隨著你拖曳或用鍵盤逐步調整目前的拉動而即時反應。碰撞判定使用的是目標與拋射體半徑的總和,並檢查目標中心到軌跡上每一段相鄰線段之間的距離,這代表一條在兩次取樣之間穿過目標的快速路徑,不會被悄悄漏判。當曲線落點不足時,你可以沿著同一條線加長拉動距離,或稍微旋轉角度;當曲線飛過目標上方時,就縮短拉動距離,或讓角度更陡。第二次重複完全相同的拉法,會產生一模一樣的虛線路徑,所以如果某個長度下、經過正規化的未命中,沒有到達那個圓圈,用同一個方向、拉得更長一些,會比亂猜一個新角度更乾淨俐落。一次成功的命中,會在下一個目標出現之前,清除該關的失敗特徵記錄,因此在新目標上出現的全新未命中,會重新開始各自的特徵計數。
指標裝置、觸控與鍵盤輸入的比較
同一個上限拉動範圍,支援三種不同的方式來設定發射向量,下表彙整了每種方法在遊戲場地上實際的作用。
| 輸入方式 | 如何開始拉動 | 如何發射 | 備註 |
|---|---|---|---|
| 指標裝置(滑鼠、觸控板、觸控筆) | 按住拋射體 | 朝遠離目標的方向拖曳並放開 | 使用 Pointer Events;拉動範圍受限於預先設定的上限 |
| 觸控(手機、平板) | 點按並按住拋射體 | 朝遠離目標的方向拖曳並放開 | 與觸控筆使用相同的 Pointer Events 介面 |
| 鍵盤(免用滑鼠) | 把焦點移到這個範圍上 | 方向鍵以五像素為單位移動拉動點,接著按 Space 或 Enter 發射 | 鍵盤操作僅限於目前取得焦點的範圍 |
Launch aimed shot 按鈕,提供了另一個明確的觸發方式,效果與鍵盤發射相同,而且這個按鈕不會改變該範圍目前已經設定好的任何拉動狀態。
軌跡運算內部的數學原理
有一個典型的代入範例,展示了這款遊戲所使用的分量形式。以起始 y 值為 200、初始 y 方向速度為負 40(在螢幕座標系中代表向上的速度)、向下的重力為每遊戲秒平方 180 像素單位,時間為 1 個遊戲秒為例,t = 1 時的 y 位置為 y = 200 + (-40)(1) + 0.5 × 180 × 1² = 200 - 40 + 90 = 250。水平位置則遵循同樣的分量形式,但沒有平方項:x = x0 + vx × t。支撐這兩條方程式的等加速度分解方式,記載於 OpenStax 拋體運動章節中,而同樣的水平與垂直分解方式,也在 Boston University Physics 的拋體運動參考資料中獨立獲得交叉核對。這些常數沒有一個是依照地球重力、真實彈弓、彈性橡皮筋、拋射體質量、空氣阻力、風力,或真實距離校準的;每個參數,都是為了遊戲手感、而不是為了物理真實性所選定的自訂像素單位設定值。
確定性、死鎖,以及 Restart 會重設什麼
因為完整結果是同步計算出來的,路徑中的任何內容,都不取決於分頁是否可見,或畫面更新率是否穩定。失敗的發射,會被正規化成一個五像素的拉動特徵並去除重複:重複同一個已正規化的未命中,不會消耗一次全新的錯誤次數,因為它沒有提供任何新的嘗試模式。第二個不同的失敗特徵,會鎖定這場遊戲,並要求你按下 Restart。一次成功的命中,會在下一個目標出現之前,清除該關的失敗特徵記錄。已完成與已死鎖的狀態,都會凍結發射邏輯,而無效、非有限數值、過短,或過長的拉動,都不會改變目前的狀態。一次完整的初始狀態 Restart,會清除目前的拉動狀態、上一次計算出的路徑、該關的失敗特徵記錄,以及任何發射邏輯的凍結狀態,同時保留先前已清除目標所賺得的分數。所有遊戲邏輯都在瀏覽器本機執行;只有在儲存空間可用時,才會在裝置上保留已完成的最佳分數,而私密瀏覽或被封鎖的儲存空間,只會停用這項便利功能,而不會阻擋遊玩。
讓 Slingshot Launcher 感覺起來像一款值得練習的角度發射物理遊戲的原因,正是讓它可以被計分的同一個原因:每一次發射只讀取一次,每一條路徑只計算一次,而每個目標都待在固定位置,直到被命中為止。這套機制保持簡單,數學運算保持可見,而從第一次拉動到完整 1,000 分終點的整條路線,每一次遊玩都保持相同。用任何現代瀏覽器開啟Slingshot Launcher,從第一關開始,在你第一次放開之後解讀曲線路徑,並依你的角度判讀能力,盡量少靠死鎖重來,一路闖過這五個固定目標。
相關閱讀:3D Memory Game: Track One Point Across Five Rounds。
相關閱讀:Brick Builder Studio Rules: 5 Milestones to 1,000 Points。