Booking.com

上一篇文章講解了使用 Dolphin 模擬器在 PC 玩 Wii 遊戲的設定方法。既然 Wiimote 可以跟 PC 連線,那麼這支雙節棍能夠在 PC 上玩點什麼其他花樣也說不定。於是上網看看能否找到什麼好玩的點子,結果在 Youtube 找到這條三年前一位外國朋友上載的片段,片段中他以兩支 Wiimote 在一台 PC 上玩雙槍街機射擊遊戲,看來相當有趣。於是跟著這位朋友留下的方法試作,結果發現這個玩意真的相當不錯。今次便給大家講解一下如何用 Wiimote 回味這些經典的街機光槍射擊遊戲。首先給大家看看在 PC 開打這些街機光槍遊戲的實況。



在 PC 玩這些上世紀的街機遊戲系統配置上的要求要遠比玩 Dolphin 為低。我用一台 Core2Duo T3200 筆記本電腦玩 Dolphin 時很多遊戲也不能滿幀運行;但在一台 Pentium D 電腦上用 MAME 模擬器玩大部份的街機遊戲已經卓卓有餘。除了 PC 的配置外,這玩意還需以下的配件:



這玩意當然需要一支 Wiimote 手掣。因為遊戲的按鍵是由你自己決定的,所以你可以選擇 Wiimote 要不要連上 Nunchuk 控制器。我見過的代用 Wiimote 都是跟 Nunchuk 一套售賣的,價錢約 HK$ 135,這樣可以配合長槍或 Wii Zapper 類型的槍架。你亦可選購原裝不連 Nunchuk 的 Wiimote 手掣,價錢約 HK$ 250 一套,這樣 Wiimote 亦可配套手槍型的槍架。不論你喜歡拿長槍還是手槍,一般的代用槍架大約 HK$ 30 - 40 便有交易。

Wiimote 要經藍芽無線連接到電腦主機;如果你使用的電腦沒有內置藍芽連線設備的話,你便要找一支藍芽 USB 手指插在電腦的一個 USB 端口以提供藍芽連線。這些藍芽手指在一般電腦用品店的售價約 HK$ 60-70。

上圖那支黑色一條的通常人們叫它做感應棒 (Sensor Bar),但實際上它是沒有任何感應功能的。這支感應棒的功用是從棒子的兩端發射紅外線。將感應棒放在顯示屏前面,Wiimote 便能從感應棒兩端發放的紅外線得知本身指向顯示屏的坐標,這樣你便可用 Wiimote 指著顯示屏瞄準射擊敵人了。隨 Wii 主機附送的感應棒是經電線從主機取電的,在 PC 玩模擬器的話可以使用一支代用無線感應棒,一支約 HK$ 70,感應棒使用四枚 AA 電芯供電。

1. Wiimote 連線

整個設定的重點是讓 Wiimote 操控電腦的一支虛擬搖杆 (Virtual Joystick),再設定 MAME 使用這支虛擬搖杆作為光槍來進行遊戲。首先看看怎樣建立這支虛擬搖杆。

先到這個網址下載並安裝一個叫 PPJoy 的免費軟件,軟件安裝後可在桌面的開始功能表或控制台中的 Parallel Port Joystick 選項打開 PPJoy 的使用者介面。如下圖般按 Add...,在彈出視窗的 Parallel Port 選項選 Virtual Port,按 Add,再按 Done。



這時 Windows 應該會偵測到新硬體,並且顯示 "尋找新增硬體精靈" 視窗,選取 "不,現在不要";



按 "下一步",再選 "自動安裝軟體" 便可以了。



這個網址下載 Glovepie (without Emotiv support 版本)。解壓縮下載回來的檔案,直接執行裡面的 GlovePie.exe。

/* Daws Wimote IR to Joystick v.1.0
In MAME:
Set the joystick dead zone to 0, in controlloer option.
In "input: this game" option, set the lightgun axies to use the Joystick.
Set INC/DEC axies to NONE.
*/

// set cursor speed speed, slower< 1 >quick
// if use nunchuk, must reconnect nunchuk ingame or wiimote cannot aim
var.speed = 0.9

// customized buttons
ppjoy1.Digital0 = nunchuk1.Z
ppjoy1.Digital1 = wiimote1.A
ppjoy1.Digital2 = wiimote1.B
ppjoy1.Digital3 = wiimote1.One
ppjoy1.Digital4 = wiimote1.Two
ppjoy1.Digital5 = wiimote1.Minus
ppjoy1.Digital6 = wiimote1.Plus
ppjoy1.Digital7 = wiimote1.Up
ppjoy1.Digital8 = wiimote1.Down
ppjoy1.Digital9 = wiimote1.Left
ppjoy1.Digital10 = wiimote1.Right

//Keyboard.Up = wiimote1.Up
//Keyboard.Down = wiimote1.Down
//Keyboard.Left = wiimote1.Left
//Keyboard.Right = wiimote1.Right

if wiimote1.dot1vis=true and wiimote1.dot2vis=true // check for visible dot
var.Mx=(wiimote1.dot1x+wiimote1.dot2x)/2 // medium dot X
var.My=(wiimote1.dot1y+wiimote1.dot2y)/2 // medium dot Y
var.dx=(wiimote1.dot2x-wiimote1.dot1x)/2 // distance of gost dot
var.dy=(wiimote1.dot2y-wiimote1.dot1y)/2 // distance of gost dot
elseif wiimote1.dot1vis=false and wiimote1.dot2vis=true // border
var.mx=wiimote1.dot2x-var.dx
var.my=wiimote1.dot2y-var.dy
elseif wiimote1.dot1vis=true and wiimote1.dot2vis=false // border
var.Mx=wiimote1.dot1x+var.dx
var.My=wiimote1.dot1y+var.dy
endif

if wiimote1.dot1vis=true or wiimote1.dot2vis=true // at least 1 dot visible
ppjoy1.Analog0 = MapRange(var.mx,1/var.speed*1024,1024-1/var.speed*1024,-1,1)
ppjoy1.Analog1 = MapRange(var.my,1/var.speed*768,768-1/var.speed*768,1,-1)
endif

// customized buttons
ppjoy2.Digital0 = wiimote2.B
ppjoy2.Digital1 = wiimote2.one
ppjoy2.Digital2 = wiimote2.A
ppjoy2.Digital3 = wiimote2.two
ppjoy2.Digital4 = wiimote2.Plus
ppjoy2.Digital5 = wiimote2.Minus
ppjoy2.Digital6 = wiimote2.Home
ppjoy2.Digital7 = wiimote2.Up
ppjoy2.Digital8 = wiimote2.Down
ppjoy2.Digital9 = wiimote2.Left
ppjoy2.Digital10 = wiimote2.Right

//Keyboard.Up = wiimote2.Up
//Keyboard.Down = wiimote2.Down
//Keyboard.Left = wiimote2.Left
//Keyboard.Right = wiimote2.Right

if wiimote2.dot1vis=true and wiimote2.dot2vis=true // check for visible dot
var.Mx=(wiimote2.dot1x+wiimote2.dot2x)/2 // medium dot X
var.My=(wiimote2.dot1y+wiimote2.dot2y)/2 // medium dot Y
var.dx=(wiimote2.dot2x-wiimote2.dot1x)/2 // distance of gost dot
var.dy=(wiimote2.dot2y-wiimote2.dot1y)/2 // distance of gost dot
elseif wiimote2.dot1vis=false and wiimote2.dot2vis=true // border
var.mx=wiimote2.dot2x-var.dx
var.my=wiimote2.dot2y-var.dy
elseif wiimote2.dot1vis=true and wiimote2.dot2vis=false // border
var.Mx=wiimote2.dot1x+var.dx
var.My=wiimote2.dot1y+var.dy
endif

if wiimote2.dot1vis=true or wiimote2.dot2vis=true // at least 1 dot visible
ppjoy2.Analog0 = MapRange(var.mx,1/var.speed*1024,1024-1/var.speed*1024,-1,1)
ppjoy2.Analog1 = MapRange(var.my,1/var.speed*768,768-1/var.speed*768,1,-1)
endif

wiimote1.Leds = 1
wiimote2.Leds = 1


將上面一段 Glovepie script 複製並貼上 Glovepie 的使用者介面,如下圖。這段 script 可支援兩支 Wiimote 手掣。



你可能需要修改 ppjoyX.Digital0 至 ppjoyX.Digital10 對應 Wiimote 和 Nunchuk 的按鍵。以上例子中我將其中一個 ppjoy1 的按鍵改為對應 Nunchuk 的 Z 鍵。那個 PPJoy 鍵對應那個 Wiimote 鍵並不重要,因為之後會再設定 PPJoy 鍵和遊戲按鍵的對應;你只要將所有需要用到的 Wiimote 鍵都對應一個 PPJoy 鍵便可以。另外亦要注意 script 中 // 之後的都是 Glovepie 忽略的備註。例如 //Keyboard.Up = wiimote1.Up 那一行,Glovepie 並不會因為看到這一行而將鍵盤的向上鍵對應到 Wiimote 的向上鍵,留下這行的原因只是讓你知道設定鍵盤鍵的語法罷了。

你可按 File => Save As 將 Glovepie script 存檔以備日後使用。按 File => Open 便可載入之前存檔的 script。將 Glovepie script 修改妥當後便可按 Run 鍵。

如果你之前曾經設定過 Wiimote 跟電腦的藍芽連線,此時只需確認藍芽手指已經插在電腦的 USB 端口,並重覆按 Wiimote 的 1、2 鍵,你會在桌面右下角看到電腦正在搜尋和安裝藍芽裝置,完成後你的 Wiimote 手掣應該只有最左邊的一棧 LED 燈亮著 (這是因為以上 Glovepie script 中最尾兩行 wiimoteX.Leds = 1 找到並正在操控 Wiimote 手掣的原故)。

但如果你的電腦之前從未跟 Wiimote 手掣連線,或當你按下 Glovepie 介面的 Run 鍵並重覆按下 Wiimote 手掣的 1、2 鍵 Wiimote 手掣亦看似毫無反應,那便要試試再設定 Wiimote 跟電腦的藍芽連線。

保持 Glovepie 的 Run 鍵在按下的狀態,確認藍芽手指已經插在電腦的 USB 端口。點選電腦右下角的藍芽圖示 (如下圖),再選 Add a Bluetooth Device。



當下圖的視窗顯示後,重覆按著 Wiimote 的 1、2 鍵,約數秒後下圖的 Nintendo RVL-CNT-01 設備便會在選單中顯示。點選這個設備,再按 "下一步"。



選擇 Pair without using a code。



按 "Close" 完成連線設定。成功連線的話 Wiimote 手掣應該只有最左邊的一棧 LED 燈是亮著的。



如果想更清楚確認 Wiimote 跟 Glovepie 已經連線,你亦可在電腦桌面按開始 => 控制台 => 遊戲控制器,選 PPJoy Virtual joystick X,按內容。



開著感應棒並在感應棒前面約 3 呎以上的距離搖恍 Wiimote,如果看到測試頁 "軸" 方格中的十字游標正在移動,這樣即代表 Wiimote 跟 Glovepie 連線成功。最理想的情況是你可以恍動手上的 Wiimote 控制十字游標沿著方格四邊移動,而十字游標不會不規則的跳動。你可以點選 "設定值" 頁面,按 "校正" 執行搖杆校正精靈嘗試調校虛擬搖杆。但我嘗試過比較理想的 Wiimote 設定是當我的 Wiimote 跟 Nunchuk 連接,並使用預設值 (設定值頁面 => 按 "重設成預設值")。



2. MAME 設定

接著便是設定 MAME 模擬器了。MAME 應該是目前最流行的街機模擬器。有關 MAME 的設定方法在網上應該可以找到很多教學文章,為免把這篇文章寫得太長,這裡只簡單講講設定這個模擬器的重點。我比較慣用 MAMEUI32 版本的模擬器。到這個網站下載適合的版本並解壓縮,自己想想辦法找一個 MAME 專用的 Bios Pack (一個約內含 30 多個 zip 檔案的東東);將 Bios Pack 內的 zip 檔案抄到 MAMEUI 目錄裡的 roms 目錄,遊戲 rom 的 zip 檔亦是存到這個目錄裡。執行 MAMEUI32.exe 並點選載入遊戲 rom 檔案。以下的設定步驟是基於 MAMEUI32 的介面,開始以下設定之前你得先想辦法在 MAMEUI 跑動一個光槍射擊遊戲。

準備好你的光槍遊戲後便可以開始針對 Wiimote 的光槍設定了。首先在 MAMEUI 的主介面選 Options => Interface Options,取消剔選 Allow game selection by a joystick (requires restart)。按 File => Exit 關閉 MAMEUI 後再重新啟動 MAMEUI。



如果不作以上設定,當 Wiimote 跟 Glovepie 連線後你會發現遊戲列表會經常上下左右的自動捲動,點選遊戲項目時就會變得非常不便。再啟動 MAMEUI 後,用滑鼠點選並右按你將載入的遊戲,選 Properties。



在 Controllers 頁如下圖剔選 Enable joystick input,並將 Joystick deadzone 設定為 0.00。Controller Mapping 如下圖設定,特別注意將 Lightgun device 設定為 Joystick,完成後按確定離開遊戲設定選單。

 

先確定完成 [1. Wiimote] 連線中的所有步驟,Glovepie 正在運行並且 Run 鍵已經按下,Wiimote 正在跟 Glovepie 連線。一切準備就緒後便可以滑鼠雙擊遊戲項目進入遊戲畫面。



接著所講述的設定步驟可參考以下的 Youtube 片段。



首先要注意如果你的 Glovepie script 有使用 Nunchuk 按鍵的話,你必需在 MAME 載入遊戲後才將 Nunchuk 插到 Wiimote 的端口,否則 Wiimote 是無法在遊戲進行中正常運作的。
  • 進入遊戲畫面後按 tab 鍵打開遊戲主選單,再選 Input (this Game) 打開遊戲控制設定選單。
  • 按鍵盤上下鍵點選要配對的按鍵。按 Enter 鍵開始某一遊戲按鍵的配對,再按 Wiimote 或鍵盤鍵配對該遊戲按鍵。
  • 如果要將遊戲按鍵設定成 None,先按 Enter 鍵開始設定,再按 Esc 鍵將之設定成 None。
  • 注意一個已有配對的遊戲按鍵如果再配對另一按鍵,那麼原先和新設定的按鍵都會配對到該遊戲按鍵。如果只想改變某一遊戲按鍵的配對,要先將該按鍵設定為 None,然後再進行配對。
  • 一般情形下,應將 player 的 Start 鍵、其中一個 Coin 鍵、遊戲中所有用來開火、發射、移動等的按鍵配對一個 Wiimote 或 Nunchuk 的按鍵。

接著便是一個比較難搞的搖杆 XY 軸的設定。先在 player 的 Lightgun X Analog 項按 Enter 開始設定,然後用 Wiimote 在感應棒前輕輕左右揮動,如果動作正確的話,便會看到該項設定成 "Joy 1 X 軸"。因為不一定每次揮動 Wiimote 都可以準確水平地揮動,所以很多時設定會變成 "Joy 1 X 軸 Joy 1 Y 軸",這時你便要將項目先設定為 None,然後再嘗試設定。

Lightgun X Analog 項設定成功後再將 LightGun X Analog Dec 和 LightGun X Analog Inc 設定為 None。設定 LightGun Y Analog 便要將 Wiimote 上下揮動並嘗試將之設定為 Joy 1 Y 軸,最後將 LightGun Y Analog Dec 和 LightGun Y Analog Inc 設定為 None,整個設定便大功告成。下圖便是在 Zero Point 遊戲中 Player 1 的一個設定範例。



按 Esc 鍵回到主選單,一些遊戲的主選單可能有 Crosshair Options 之類的選項讓你設定每個 Player 的光槍游標。

以上例子中我是將 Joy 1 的按鍵和 XY 軸跟 MAME Player 1 的按鍵和光槍配對。但在你進行配對時你的 Wiimote 未必一定是對應到 MAME 的 Joy 1 搖杆的。因為電腦會將 Wiimote 辦認為遊戲手掣,如果你有一只 Wiimote 跟電腦連線,你的電腦便至少辦認到兩只搖杆,一只是你的 Wiimote,一只是 PPJoy Virtual Joystick 1,當你設定配對並按下 Wiimote 按鍵時你可能會看到 MAME 配對的是 Joy 2 的按鍵和 XY 軸。同樣道理如果你的電腦跟兩只 Wiimote 連線,你亦設定了兩只 PPJoy Virtual Joystick,MAME 配對的便可能是 Joy 1 至 Joy 4 其中一只搖杆。MAME 對應那只 Wiimote 辦認到那個 Joy # 你要在這個設定選單按下 Wiimote 按鍵時才能清楚知道。

如果你覺得揮動 Wiimote 設定 Lightgun X/ Y Analog 項目太困難,而你又懂得 XML 語法的話,你可以試試直接修改個別遊戲設定的 XML 檔案。在 MAMEUI 目錄下可找到一個名為 cfg 的子目錄,目錄裡每一個 cfg 檔案都以 XML 格式記錄了先前講解的控制設定。當你在遊戲載入後按 tab 鍵修改了某一項控制設定,之後關閉遊戲畫面,在 MAMEUI 主視窗按 File => Exit 後,曾經修改過的項目便會記錄到這些 cfg 檔案裡。以下便是在 Zero Point 遊戲中正確修改設定後得出的 zeropoint.cfg 的內容:

<?xml version="1.0"?>
<!-- This file is autogenerated; comments and unknown tags will be stripped -->
<mameconfig version="10">
<system name="zeropnt">
<counters>
<coins index="0" number="222" />
</counters>
<input>
<port tag="INPUTS" type="COIN1" mask="1" defvalue="0">
<newseq type="standard">
JOYCODE_1_BUTTON4
</newseq>
</port>
<port tag="INPUTS" type="COIN2" mask="2" defvalue="0">
<newseq type="standard">
KEYCODE_6
</newseq>
</port>
<port tag="INPUTS" type="START1" mask="16" defvalue="0">
<newseq type="standard">
JOYCODE_1_BUTTON2
</newseq>
</port>
<port tag="INPUTS" type="START2" mask="32" defvalue="0">
<newseq type="standard">
NONE
</newseq>
</port>
<port tag="INPUTS" type="P1_BUTTON1" mask="256" defvalue="256">
<newseq type="standard">
JOYCODE_1_BUTTON1
</newseq>
</port>
<port tag="INPUTS" type="P2_BUTTON1" mask="512" defvalue="512">
<newseq type="standard">
NONE
</newseq>
</port>
<port tag="Y0" type="P2_LIGHTGUN_Y" mask="255" defvalue="128">
<newseq type="standard">
NONE
</newseq>
<newseq type="decrement">
NONE
</newseq>
<newseq type="increment">
NONE
</newseq>
</port>
<port tag="X0" type="P2_LIGHTGUN_X" mask="255" defvalue="128">
<newseq type="standard">
NONE
</newseq>
<newseq type="decrement">
NONE
</newseq>
<newseq type="increment">
NONE
</newseq>
</port>
<port tag="Y1" type="P1_LIGHTGUN_Y" mask="255" defvalue="128">
<newseq type="standard">
JOYCODE_1_YAXIS
</newseq>
<newseq type="decrement">
NONE
</newseq>
<newseq type="increment">
NONE
</newseq>
</port>
<port tag="X1" type="P1_LIGHTGUN_X" mask="255" defvalue="128">
<newseq type="standard">
JOYCODE_1_XAXIS
</newseq>
<newseq type="decrement">
NONE
</newseq>
<newseq type="increment">
NONE
</newseq>
</port>
</input>
<crosshairs>
<crosshair player="0" mode="2" />
<crosshair player="1" mode="0" />
</crosshairs>
</system>
</mameconfig>


注意範例中紅色那兩組 <port /> tag。建議你可以如上文所述在遊戲畫面按 tab 鍵先設定所有按鍵,將所有 LightGun XY Analog, LightGun XY Analog Dec 和 LightGun XY Analog Inc 設定成 None,關閉 MAMEUI 後打開遊戲的 cfg 檔將 type = "P?_LIGHTGUN_?" 的 tag 像上面例子般設定 <newseq type="standard"> tag 為 JOYCODE_?_?AXIS (因應你要設定的 XY 軸和第幾個 Player,並要注意上文提到有關 MAME 怎樣辦認每支搖杆的 Joy #)。亦要注意每個遊戲 cfg 檔裡 <port /> tag 所用的 tag 標籤都是不同的,有時可能是 tag="X1",有時可能是 tag="ABCX1",因此你要將 LightGun XY Analog 的設定改變一次 (如改為 None) 讓 MAMEUI 將這些 <port /> tag 加到 cfg 檔後才再手動修改。

最後提提兩個和 MAME 光槍遊戲有關的設定。一些 MAME 光槍遊戲可能需要在遊戲進行前校準光槍游標,你可到這個網址查閱個別 MAME 遊戲的特別設定。

你可以將 MAME 預設的準星改成你喜歡的顏色和圖案。你可到這個網址下載一個 MAME 的 Crosshair Pack。設定準星的方法在不同版本的 MAME 會略有不同。例如 MAMEUI32 是先將 Crosshair Pack 內所有 png 檔解壓至 MAMEUI 目錄裡的 crosshair 子目錄,將 player 1 要使用的準星圖檔改名為 cross1.png,player 2 使用的準星圖檔便改名為 cross2.png,如此類推。

到這裡所有設定大功告成,終於可以拿起 Wiimote 瞄準敵人狂掃了 ... 殺呀 !!!!!