用手把玩戰術卡牌遊戲:Ancient Duel 的手把支援是怎樣實作的
手把支援通常屬於講求移動和瞄準的遊戲。Ancient Duel 兩者皆無。它是一款卡牌遊戲:你看著棋盤,思考片刻,然後做出一個離散的選擇。
而這恰恰是手把適合它的原因。對決中的每一個動作都歸結為同一張短清單:哪張牌、哪個位置、哪個目標、確認、返回。這正是手把的母語,而對一台專長在於指向任意像素的裝置來說,這套詞彙反倒不甚合用。
手把不該假裝自己是滑鼠
最省事的捷徑是讓搖桿推著一個游標在螢幕上移動。這做起來快,用起來難受:你最終是在空蕩蕩的絨布桌面上駕馭一個指標,用模擬量的操作去完成一個數位化的選擇。
Ancient Duel 移動的是選擇本身。搖桿或方向鍵在真正有意義的東西之間跳轉——手牌中的一張牌、場上的一個單位、一個目標、一個按鈕、一個標籤頁——而「確認」則發動當前所選的任何東西。你從不瞄準。你只是在說「下一張牌」、「就這張」、「是」。
整個輸入層遵循一條我早早定下、從未打破的規則:它絕不重新實作任何遊戲動作。它只移動焦點,然後讓原本就在那裡的按鈕各司其職。自四月的一輪無障礙工作以來,遊戲早已可以完全用鍵盤操作,所以手把支援根本不需要觸碰遊戲邏輯。反過來也成立:鍵盤到不了的地方,手把同樣到不了。要讓某個東西可以被導覽,就是把它做成一個焦點停靠點,而不是寫新的輸入程式碼。
棋盤本來就是一張網格
在這一點上,卡牌遊戲有著 3D 世界所沒有的便利。Ancient Duel 的戰場是一個固定、有限的結構:每方四個單位位置、中間一個指揮官格、一排策略區、一手牌、兩個墓地、一個地形區。沒有任何需要穿越的連續空間。
於是視覺佈局本身就可以直接成為導覽。左右沿一行移動,上下在手牌與戰場之間切換,而肩鍵則整區整區地跳轉,不必逐個走過中間的一切。右搖桿負責滾動,Start 鍵開啟手把設定。
焦點就是游標
用滑鼠時,玩家永遠知道自己指著什麼,因為指向的動作是他們的手在做。拿掉指標,介面就必須隨時回答三個問題:現在選中的是什麼,「確認」會對它做什麼,「返回」又會撤銷什麼。
這聽起來顯而易見,而大部分瑣碎的工作正花在這裡。一個開啟時選擇落在關閉按鈕上的對話方塊,技術上可以導覽,實際上毫無用處:遊戲剛問你要丟棄哪張牌,反白卻停在 ✕ 上。如今對話方塊開啟時落在第一個真正的選項上;選擇目標的模式則把選擇直接放到第一個合法目標上,而不是僅僅把所有目標一併反白——那在有指標時沒問題,沒有指標就成了大海撈針。
好的手把支援,不是每個按鈕都能夠到的狀態,而是你不再去想怎麼夠到它們的狀態。
永遠不要相信按鈕索引
這是我嚴重低估了的部分。
一隻 PC 手把可以聲稱自己使用標準佈局,然後按韌體的心情隨意編號它的按鈕。我用來測試的那隻手把正是如此,更糟的是,它從頂部起順時針印著 1 / 2 / 3 / 4,而不是 A/B/X/Y。於是每一次按鍵背後都藏著三個彼此獨立的事實,而只有第一個真正可知:原始輸入、那顆按鈕在塑膠外殼上的物理位置、以及旁邊印著的標籤。一個把「確認」綁到「0 號按鈕」的遊戲,是在對三者中的兩個瞎猜。
因此 Ancient Duel 有一個校準嚮導,它從不根據索引推斷任何東西。它從你的手上學到物理位置,從你告訴它裝置上寫著什麼學到印刷標籤。標籤從清單中選取而非輸入,因為手把上沒有字母——而且這些標籤並非裝飾:如果你告訴遊戲你的下方按鈕寫著「B」、右方按鈕寫著「A」,那麼不管瀏覽器怎麼認為,你手裡拿的就是任天堂慣例的硬體,「確認」與「返回」也會隨之互換。
你跳過的控制會保持沉默。不存在退回到某個猜測索引的情況,因為一顆能確認投降的肩鍵,恰恰就是校準存在的意義所要防止的那種失誤。
不能要求滑鼠的校準
這裡埋著一個悖論。手把映射錯誤的玩家,正是最需要校準介面的玩家,也正是無法透過正常選單導覽到那裡的玩家。
所以整個設計遵循的規則是:你必須能夠在沒有滑鼠也沒有鍵盤的情況下校準、標註、儲存、重新開啟並修復一隻手把。在桌面上,滑鼠和鍵盤作為便利可以用;但任何環節都不得依賴它們。
實際上,這意味著嚮導以「按任意鍵開始」開啟,接受任何已連線手把上的任何原始按鈕,而這一按同時決定了哪隻手把擁有這次校準。接下來是確認與取消,二者不可跳過。從第三個問題起,你剛剛指認為右方按鈕的那顆鍵會帶你後退一步,所以按它足夠多次就能退出嚮導——這是唯一一條不需要指標的出路。每個採集步驟都自行推進,因為一個剛被告知「按下下方按鈕」的玩家,不可能同時再去按「下一步」。
為什麼它從不詢問搖桿
八個問題,每一個都是按鈕。方向相關的問題一個都沒有。
部分原因是方向本就是可靠的那一部分:在標準映射的手把上,左搖桿以前兩個軸到達,這讓方向輸入遠比廠商隨意編號的按鈕可預測。但主要原因,是我在看著它出錯之後才明白的一件事。一顆按鈕要麼按下,要麼沒有。而一根軸沒有有意義的「鬆開」狀態——磨損的搖桿會漂移,方向鍵的 hat 值會停在 3.29,扳機會停在 −1——其中任何一個都可能回答一個沒人問過的問題,或者出於螢幕上沒有任何東西能解釋的原因,拒絕讓某一步完成。不問,就消滅了一整類無法解釋的行為。
按住方向會重複觸發,速度可以自己設定;如果搖桿漂移,死區同樣可以調整。
沒有字母也要打字
然後你碰到一個文字方塊,而手把此時無能為力。登入、給牌組命名、搜尋卡池:所有這些都需要字元,而沒有任何手把上有字元。
所以在文字方塊上按「確認」會在螢幕上開啟一個完整的 QWERTY 鍵盤。它只是一個普通層裡的一組普通按鈕,這意味著同樣的導覽方式可以在上面移動,「返回」也像關閉其他任何東西一樣把它關掉。有實體鍵盤的玩家永遠不會看到它。
有一個我沒料到會重要的細節:這套佈局使用真實的物理錯位,與 ANSI 鍵盤相同的四分之一單位偏移。導覽讀取渲染出來的幾何來決定「上」去往哪裡,所以正是這個錯位把 W 放在了 A 和 S 之間的空隙上方。更整的數字反而會出錯——恰好半個單位的錯位會讓每個鍵到下方兩個鍵的距離完全相等,而平局就交給了標記語言恰好排成的順序。
手把在遊戲其他地方發現了什麼
這項工作最有用的一點是它暴露了什麼。滑鼠讓玩家可以直接指向想要的東西,從而掩蓋介面的問題。手把做不到,所以介面必須把這些關係明確表達出來——而有好幾個地方結果並沒有做到。
已儲存的牌組不是焦點停靠點,這意味著沒有滑鼠根本打不開牌組。墓地和地形也是一樣。組牌介面每當你加入一張牌就重建它的兩列,銷毀你剛按下的按鈕並丟掉你的位置;現在它會記住那張牌和那個操作,並重新找到它們。瀏覽器自帶的 confirm 和 alert 對話方塊完全在應用的焦點模型之外,於是被替換成頁面內的對話方塊,開啟時落在安全的那個答案上。
這些都不是手把的 bug。它們是介面的 bug,只是指標一直在悄悄地替它們補救;修好它們,讓遊戲對那些永遠不會碰手把的人也變得更好。
Steam、沙發與 Deck
同一套程式碼執行在瀏覽器裡、在用於 Steam 的 Windows 版本裡、也在 macOS 版本裡,三者使用同一個手把系統和同一套配置邏輯——不過設定本身儲存在裝置上,而不是你的帳號裡。
這換來的東西很簡單:PC 不再只是一張書桌。同一個版本可以在筆電上玩,在接電視的機器上玩,也可以坐在沙發上拿著手把玩。卡牌遊戲比大多數類型更適合這種方式,因為 Ancient Duel 的自然姿態是靠在椅背上思考,而不是前傾著點選。
對於 Steam Deck 這類掌機,誠實的說法是:地基已經打好,測試還沒有做。Steam Input 可以透過標準的 XInput 相容映射暴露手把輸入,所以已有的模型原則上是一個有用的基礎,而一款從不假設滑鼠存在的遊戲,是這類裝置的重要前提。我還沒有在真機上驗證過 Ancient Duel,所以不會宣稱它在那上面能用。另外還有一個電視模式,會加上一圈安全邊距,因為某些電視設定仍會應用過掃描、裁掉影像邊緣的一部分,這足以把投降按鈕擠出螢幕。
同樣的推理適用於任何未來的平台。主機版本需要的遠不止輸入方面的工作:SDK、認證、平台服務、打包、商店審核。但有一道障礙可以提前清除,而且它正是觸及每一個介面的那一道——遊戲不應假設滑鼠存在。這並不意味著任何東西已經為主機做好了準備。它只是讓一扇日後重開代價高昂的門保持敞開。
滑鼠並沒有被趕走
這一切不取代任何東西。滑鼠和鍵盤的用法與從前一模一樣,在桌面上它們依然更快。重點從來不是替玩家挑選輸入裝置。
用手把打的對決並不是另一場對決。選的是同一張牌,挑的是同一個目標,做出並承擔的是同一個決定。改變的只是這個選擇抵達遊戲的方式——而 Ancient Duel 對你手裡拿著什麼的假設越少,同一場對決就能在越多的地方進行。
Daniel Rusu
Ancient Duel 創作者兼開發者