筆者姑且算玩家,但幾乎只用滑鼠鍵盤。
某日逛3C店發現有賣福利品,直接敗下一把168的 PS3手把。
回家發現無法正常驅動!左搖桿能對應鼠標,其他全沒反應,按右板機還會鼠標狂衝!
如果這事發生在十年前還好說,但我早有印象現在的Linux核心對USB類的硬體驅動非常完善,Xbox/PS 系列的遊戲手把應該能隨插即用才是。
接著是一連串的除錯嘗試:
故大概不是驅動問題,我的Puppy Linux也早就有裝 xboxdrv
桌面輸入錯誤故且忽略,不論怎麼調整Steam設定,遊戲內按鍵輸入也是亂的⋯
這可真是詭異,網上明明都說設定PS3 Dualshock Controller 多容易可是我—
我包裝盒上寫的是Doubleshock III Controller!不是Dualshock!
我震驚個毛,便宜貨當然都是盜版/山寨貨。
努力去查型號,結果網路店家的資訊似乎也都是抄Dualshock的說明⋯
還附上一句「不適用於Steam」。
看來這山寨貨確實有 Dualshock零件才導致系統誤判,內部肯定東拼西奏,亂七八糟。
在微驅動灌的是PS3把手韌體。
但身為Linux使用者,自訂設定,天經地義。
今天區區一個顛三倒四、經脈錯亂的爛手把就想要老子投降,做夢!
而且退貨就輸了,這樣不就承認自己貪小便宜活該被騙嗎?
老樣子,root狀態開啟:
/usr/share/X11/xorg.conf.d/50-joystick.conf
修改內部的設定,就能自定義遊戲手把的輸出設定。(記得備份!)
原始內容大概是這樣
Section "InputClass"
Identifier "joystick catchall"
MatchIsJoystick "on"
MatchDevicePath "/dev/input/event*"
Driver "joystick"
Option "DebugLevel" "0"
Option "StartKeysEnabled" "True"
Option "StartMouseEnabled" "True"
Option "MapButton1" "button=1"
Option "MapButton2" "button=2"
Option "MapButton3" "button=3"
Option "MapButton4" "none"
Option "MapAxis1" "mode=relative axis=+1x deadzone=5000"
Option "MapAxis2" "mode=relative axis=+1y deadzone=5000"
Option "MapAxis3" "mode=relative axis=+1zx deadzone=5000"
Option "MapAxis4" "mode=relative axis=+1zy deadzone=5000"
Option "MapAxis5" "mode=accelerated axis=+1x deadzone=5000"
Option "MapAxis6" "mode=accelerated axis=+1y deadzone=5000"
Option "MapAxis7" "mode=none"
EndSection
(綠字部分可能你的設定檔沒有,但沒差,重點只在MapButton/MapAxis設定上)
當需要確定這把經脈錯亂山寨貨的按鈕對應表時,先前提的手把線上測驗就非常有用。
網站上的B0=MapButton1、AXIS0=MapAxis1 依此類推⋯
Option "MapButton#" 解說:
這手把有17個按鈕,我就可以在設定檔一路新增17個 Option "MapButton#(1-17)"後面的係數可以是 "button=#" 或 "key=#"
button=1 (滑鼠左鍵)
button=2 (滑鼠中鍵)
button=3 (滑鼠右鍵)
button=4 (滑鼠中鍵上滾)
button=5 (滑鼠中鍵下滾)
⋯如果你用多鍵滑鼠那你對應的鍵還可以繼續增加
"key=#"的對應部分比較麻煩,要鍵盤scancode,打開終端機輸入:
DISPLAY=:0 xmodmap -pk | more >all_keys.txt
這會在你的家目錄生成一份文字檔,寫滿你鍵盤的scancode。
我的鍵盤上下左右scancode是:111、116、113、114
手把左方十字鍵的對應MapButton是14、15、16、17
也就是:
~
Option "MapButton14" "key=111"
Option "MapButton15" "key=116"
Option "MapButton16" "key=113"
Option "MapButton17" "key=114"
~
如果要不只對應一個按鍵,只要
"key=#,#,#,#"
就好,最多同時四鍵,不需要空格。
Option "MapAxis#" 解說:
MapAxis 代表搖桿的訊號,在我的例子中:
MapAxis1:左搖桿左右
MapAxis2:左搖桿上下
mode=[none/relative/accelerated],代表搖桿的移動模式 [關閉/穩定/漸進加快]
後面係數 axis=+1x,代表游標X軸1位移,左右移動(若改成0.5,移動就慢一半)
反之對應搖桿上下的MapAxis2,axis=+1y,就是Y軸1位移,代表上下移動
注意搖桿底部也有按鈕,按壓左搖桿:MapButton12
另外 axis=+1zx / axis=+1zy 的係數;
基本上功能一樣,只是不會觸動滑鼠的游標。
keylow=# keyhigh=#
^讓你搖桿在兩個自訂按鍵之間切換。
MapAxis3/6 比較特別,是前方扣壓的「板機」,而不是按鈕。
如果要當按下去的按鈕,左右板機按鈕對應MapButton7/8
但如果要板機有按壓輕重的輸出,建議用 keylow=# keyhigh=#
注意在 MapAxis3/6的情況下, keylow是就算沒觸壓時也會持續輸入指令。
個人用不到這個板機,直接 "mode=none"停掉。
後面的deadzone(死區)參數代表搖桿的穩重感,越小越敏感,個人設為200
全部設定好存檔,重新登出後就可以測試客製化的手把設定。
挑戰Steam
經過一番努力後,原本經脈錯亂的山寨手把也能當另類鍵盤滑鼠用。
但還是有兩瓶頸,Steam客戶端的手把設定 + 遊戲內部手把設定。
不知為何Steam的搖桿設定都在Big picture mode
先前網路賣家聲明「不適用於Steam」,因為這山寨 Dualshock會讓 Steam誤判,必須先到設定裡面把所有關於遊戲手把的支援都關掉,不然 Steam大概會無視我嘔心歷血搞的手把設定,繼續用正版設定加註在我手上這把冒牌貨上導致錯亂。
經過漫漫長路,筆者終於可以用這山寨貨玩 Steam遊戲,但不是全部。
「理論上」只要一款遊戲能用鍵盤滑鼠玩,我就能用這手把玩;但有些遊戲對手把的設定是寫死的,玩家不能改。比如說,知名遊戲—死靈舞師,就有內建的遊戲手把偵測,也無法自訂操作。
另外許多遊戲偵測到手把時,右方的按鍵(OX☐∆)是改不了的,遊戲會照自己的預設值,也幸好我這山寨貨至少右按鍵的譜表跟遊戲認定的手把是一致的⋯
要不是這次貪小便宜買盜版貨,也不會有這趟 xorg 設定大冒險吧。
本文的方法應該適用任何遊戲手把,正版、盜版、山寨、罕見品牌。
既然這手把能當作鍵盤滑鼠了,我試試看能不能用來畫圖。
(很困難,搖桿比不上滑鼠!但或許該怪這貨太爛了 XD)
附上個人的設定,注意你的scancode很可能跟我的不一樣,key會對不上。
要是你覺得我的設置很怪⋯因為右方鍵、start、select等很多就算改了也不影響遊戲,我就把它換成我繪圖軟體常用的快捷鍵了。
Section "InputClass"
Identifier "joystick catchall"
MatchIsJoystick "on"
MatchDevicePath "/dev/input/event*"
Driver "joystick"
Option "DebugLevel" "0"
Option "StartKeysEnabled" "True"
Option "StartMouseEnabled" "True"
Option "MapButton1" "key=65" #Spacebar
Option "MapButton2" "key=30" #u
Option "MapButton3" "key=60" #.
Option "MapButton4" "key=59" #,
Option "MapButton5" "key=37" #Ctrl
Option "MapButton6" "button=1"
Option "MapButton7" "key=50" #Shift
Option "MapButton8" "button=3"
Option "MapButton9" "key=49" #`
Option "MapButton10" "key=119" #Delete
Option "MapButton11" "button=2"
Option "MapButton12" "key=104" #Enter
Option "MapButton13" "key=9" #ESC
Option "MapButton14" "key=111" #UP
Option "MapButton15" "key=116" #DOWN
Option "MapButton16" "key=113" #LEFT
Option "MapButton17" "key=114" #RIGHT
Option "MapAxis1" "mode=relative axis=+0.8x deadzone=200"
Option "MapAxis2" "mode=relative axis=+0.8y deadzone=200"
Option "MapAxis3" "mode=none"
Option "MapAxis4" "mode=accelerated axis=+0.5x deadzone=200"
Option "MapAxis5" "mode=accelerated axis=+0.5y deadzone=200"
Option "MapAxis6" "mode=none"
EndSection