今年のゲームパッド対応

 HSPプログラムコンテスト2017が開催され、沢山のゲームが投稿されました。 ゲームなのにキーボード・マウス操作のみ対応でゲームパッド使えないという作品も多かったような気がします。 ジャンルにもよりますが、ゲームをするならゲームパッドがあると大変遊びやすくなります。Nキーロールオーバーの問題も解決しますしね。 出来ればゲーム作品は、ゲームパッド対応を当然のように考慮してほしいところです。

「そう言われてもどうすればいいんだ…プラグインどこにあるの?難しそう」

という方のために、少しだけ歴史を振り返りつつプラグイン・モジュールを紹介してみようと思います。

注意
 この文章は筆者の主観によるものです。なるべく客観的に書くように配慮してはいますが、事実関係は各自でよく確認、吟味してください。

HSP2時代

 HSP2の頃はまだWin32 APIの呼び出しが簡単ではありませんでした。 そのためゲームパッドの実装は、プラグイン形式が一般的でした。 現在でもまだ当時のプラグインを見つけることができます。

hspjsis.hpi(MIA さん)
http://hp.vector.co.jp/authors/VA003112/hsp2ex3.html#HSPJSIS
配布終了。
プラグイン。
ボタン割り当て機能あり。
JOYPAD.DLL(なかむら さん)
http://hp.vector.co.jp/authors/VA003112/hsp2ex3.html#JOYPAD
配布終了。
プラグイン。
ボタン割り当て機能あり。

 いずれもアナログスティック対応だったようです。しかしどっちも配布終了です。 また、現在でも入手可能なプラグインもあるようです。

hmm.dll(うにたま さん)
http://hsp.tv/make/tool3.html
プラグイン。
汎用プラグイン。HSP3でも使用可能。

 どれもHSP2当時からの古いものですが、HSP3でも使用可能なはずです。 もし動かない場合でもasファイルを修正すれば動作するようになる…はずです。確認したわけではないので確実なことは言えません。

資料
HSPからWindows API(Win32 API)関数の利用
http://www.geocities.co.jp/Playtown-Yoyo/6130/hsp/hsp-win32api.html

HSP3時代

 HSP3からはWin32 APIの呼び出しが容易になり、HSP用のDLLが無くても簡単にゲームパッドが実装できるようになりました。

 HSPでゲームパッドを使用するためには、Win32 API winmm.dllのjoyGetPosEx関数を呼び出します。 HSP3の登場後、これをモジュール化したものが登場しました。

mod_joystick.as(MIA さん)
http://www.onionsoft.net/hsp/v35/doclib/plugin.htm#mod_joystick
モジュール。
HSP3標準同梱。

 もちろん最大32ボタン、アナログスティック対応。POVスイッチも取得。
 モジュールであるため、配布時にDLLファイルの同梱が不要になりました。 このモジュールの登場によりHSP2時代から使用されていたプラグインのほとんどが必要なくなりました。

 しかしシンプルな命令しか用意されておらず、ボタン割り当て機能が実装されていませんでした。 そこでボタン割り当て機能を追加したモジュールも登場します。

PAD設定さん(GENKI さん)
http://mclab.uunyan.com/dl/dl11.htm
モジュール。
ボタン割り当て機能あり。割り当てツール同梱。
設定をファイルにして入出力できる。

 自演乙ってやつですね。それはおいておいて…。
 どちらもstick命令と置き換えて使用することを想定しているので、stick命令を使用しているゲームなら導入が簡単です。

 2つの使い分けはこのようになります。
 とりあえずゲームパッドに対応させたい場合は、「mod_joystick.as」を使う。
 物足りなくなって来たが、ボタン割り当ての機能の実装が面倒に感じたら「PAD設定さん」を使う。

入力値の取得だけであれば、この2つのモジュールのどちらかを選べば十分です。

フォースフィードバック

 元は操縦桿やハンドルへの抵抗力をコントローラー側に返す機能だったようですが、今はゲームパッドの振動機能として知られています。 (ハンドルコントローラーのFFBですか?実はハンコンって一般のご家庭には無いらしいんですよ。この文章は一般向けに書いています。ご了承ください。)

 家庭用ゲーム機ではNintendo64の「振動パック(1997年4月)」が最初だったようですね。 その後、プレイステーションの「デュアルショック(1997年11月)」が登場して一般化していったようです。

 あまり見かけませんがHSPもフォースフィードバック(振動させる機能)に対応できるプラグインが存在しています。 それもHSP2の頃から。とても有名です。

CK JOYFORCE DLL(CHOKKO さん)
http://www1.odn.ne.jp/chokko/
プラグイン。
フォースフィードバック対応。

 mod_joystick.asと同等の機能を持ちながら、フォースフィードバック対応のゲームパッドを振動させることができます。 振動機能を使いたいなら「CK JOYFORCE DLL」プラグインの一択です。
 逆を言うと、振動機能が必要ないならDLLファイルを同梱しなければならない「CK JOYFORCE DLL」を使うメリットはありません。

資料
振動機能を考える
http://tonbi.jp/Game/Essay/037/

その他のモジュール

 少し話がそれますが、今回たまたま見つけたものに面白そうなものがありましたので紹介しておきます。

xinput-hsp(mono さん)
https://github.com/mono0x/xinput-hsp
モジュール。
XInputのラッパー。
2011年の更新が最後。マニュアル類が整備されていない。ソースを見る限り、振動にも対応しているようだが…?

 XInputのHSP3用ラッパーのようで、スクリプトを見ると振動にも対応しているように見えます。
 試しに動かしてみたのですが、入力すら受け付けず…何か間違えてしまったようです。なんでだろう。(´・ω・`)
 XInput対応のゲームパッドじゃないとダメなのかもです。

ボタン配置と背景

ゲームパッドのボタン配置といえば今の主流はこんな感じでしょうか。
左が十字キー、右がひし形(十字?)に並んだ4ボタン
奥側側面(人差指と中指が当たる位置)に左右2個ずつトリガーボタン。
アナログスティックは親指が届く位置に左右1個ずつ。左右対称又は、左が奥側、右が手前側の非対称配置のどちらか。
最後にSTART/SELECTが親指が届くちょっと押しにくい位置に小さく配置。

 家庭用ゲーム機専用の標準ゲームパッドは全部このとおりですし、家電量販店で売っているPC用ゲームパッドもだいたいこのタイプばかりです。

 右手側が4ボタンなのは当たり前だと思うかもしれませんが、かつては6ボタンのゲームパッドも多く存在していました。 家庭用ゲーム機でもセガサターン(1994~2000年)やNINTENDO64(1996~2001年)は、右側6ボタン配置のゲームパッドが標準になっていました。 (調べてみるともっと昔には3ボタン(メガドライブ、3DO)もあったようなのですが、こちらは流行りませんでしたね。)

 ボタンが4個並んでても6個並んでても大して違いはないだろうと思うかもしれませんが、配置の違いは解釈の違いを生みます。
 例えば、6ボタンだと3つのボタンが2行に並んでいると捉える事ができます。4ボタンでも2行として捉えることもできますが、左手側の十字キーと同じようにボタンが十字に並んでいるとも解釈できますし、ハットスイッチと対応する形で円を描くように四角形を描いているという解釈もできます。
 どのように並んでいるかという解釈はゲームの操作方法にも影響してくる問題です。 この問題はどのゲーム機メーカーも大変悩んだようで、過去様々な解釈がなされてきました。 具体的にどのような解釈がされてきたのかを振り返るため、ボタンに刻印された文字とその配置を調べてみましたので御覧ください。

2ボタン

ファミリーコンピュータ(任天堂)
BA

PCエンジン(NEC)
21

4ボタン

スーパーファミコン、WiiU、SWITCH(任天堂)
YX
BA

ネオジオCD(SNK)
CD
AB

ピピンアットマーク(バンダイ)
43
21

ゲームキューブ(任天堂)
 Y
BAX

ドリームキャスト(セガ)、XBox(マイクロソフト)
XY
AB

プレイステーション(SONY)※十字の模様が入っていることから、十字配置という解釈が読み取れる。
□△
×○

6ボタン

セガサターン(セガ)
XYZ
ABC

NINTENDO64(任天堂)
B←↑
A↓→

 各社バラバラどころか、同じ任天堂でもゲームキューブとNINTENDO64のように迷走していたりします。まあ、あそこは時々Wiiリモコンなどのような変則的なコントローラー出すメーカーなので例外にしてしまっても良かったかもしれません。 と、極端な例は置いておいて…。
 基本的に同じメーカーなら過去の機種を踏襲した配置になっています。 例えばファミコンとスイッチ、ドリキャスとサターンです。 またプレステ1~4、XBoxシリーズに関しては登場時からコントローラのボタン配置が統一されています。 とはいえやっぱり各社統一されていないのが現実です。

 一方、PC用はと言うとゲーム機用を手本に作られたものがよく出回っていました。 無難な形状としてDHUALSHOCK型は今でもよく見かけます。ゲーム機向けとしての商品や、ゲーム機用をPCにつなげる変換器などもありましたね。
 市販ゲーム機が手本なので、ボタン配置もそれに習ったものになります。 今は4ボタンが主流なので、SWITCH、プレステ、XBoxあたりが手本になったものが出回っていると思います。(XBoxはやや事情が異なりますがここでは割愛。)
 この結果何が起きるのか…?

 PC用ゲームパッドの4ボタンの見た目の配置は同じなのに、ボタン1~4の割当(並び)が商品によって違うということが起きます。

 2つの異なるメーカーのゲームパッドを比較した時、見た目は同じ位置のボタンなのに、PC側では2台とも異なる位置のボタンとして認識されるということは実際よくあります。(例:一方ではボタン1と認識されるが、もう一方ではボタン2と認識される。)
 しかし大抵の市販PC用ゲームはボタン配置を変更できるので大きな問題にはなりません。 また多くのユーザーは、PC用ゲームパッドは1台しか持っていないため気づかれないというのもあるのでしょう。

ボタン配置がユーザーに与えるもの

 配置が違うくらい、慣れれば問題ないんじゃないの?と思う方もおられるかもしれません。 それはそうなのですが…では、配置の重要性について少し書いてみます。

例えばスーファミの配置。
YX
BA
スーファミではAが決定、Bがキャンセルボタンです。
例えばこれが、Aが決定、Xがキャンセルになっていたらどうでしょうか。
キャンセルする際に間違えて決定を押してしまう事故が起きるかもしれません。
物理的な親指の構造からくる制限です。

 また左右の違いはあれど、各社ともに決定/キャンセルは手前側のボタンを使用し、同じメーカーであれば同じボタンを決定/キャンセルボタンに統一してあります。
 統一して変更しないのは、ユーザーがその操作に「慣れ」ているためで、これを安易に変更してしまうとユーザーは変化に対応できずに「操作が難しい」と感じます。
 操作者による慣れから来る操作のしやすさ、また逆に難しさに繋がる原因です。

 4ボタンを十字キーに見立てて移動に使用するゲームを作った場合はどうでしょうか。
 上下左右が入れ替わるなどボタン配置が画面上の動きと一致しなければ、まともに操作するのも難しくなります。
 デバイスと操作結果の一致、直感的なUIである事は操作しやすさにつながり、無視すれば無用なストレスにつながります。

 このように配置には意味があり、ユーザーが普段どのタイプのゲームパッドを使用しているかによっても最適解は異なります。6ボタンのパッド使ってるかもしれませんしね。

 長くなりましたがようやく結論です。
 上記のような理由からゲームパッドを使用するゲームを作る場合は、ボタン配置変更機能(キーコンフィグ)はつけておくと大変親切です。 ただし使用ボタン数が少ない場合は、あまり意味が無いのでこの場合は必要ないでしょう。

どれを選べばいいのか

 ゲームパッドの状況、またそれに対するHSPの対応状況はおおよそお分かりいただけたでしょうか。 という事でまとめです。

 目的に合わせて次の3つから選択するといいと思います。
 入力がstick命令で作られているスクリプトなら、置き換えはそう難しくないはずです。

手軽にゲームパッドに対応させたいなら

mod_joystick.as(MIA さん)
http://www.onionsoft.net/hsp/v35/doclib/plugin.htm#mod_joystick
大抵の場合はこれ一つで十分。少し頑張ればボタン配置変更機能も自作できます。

ボタン割り当ての機能を付けたいなら

PAD設定さん(GENKI さん)
http://mclab.uunyan.com/dl/dl11.htm
mod_joystick.asに足したい機能を充実させてあります。
ボタン配置変更機能。ゲームパッドの商品差やID問題などにもある程度対処しています。

フォースフィードバックに対応させたいなら

CK JOYFORCE DLL(CHOKKO さん)
http://www1.odn.ne.jp/chokko/
振動させたいならこれ以外の選択肢がありません。

とは言え、もし使い慣れているプラグイン・モジュールがすでにあるのならそれを使うのが一番だと思います。

私のたった一つの望み

 他にも色々あるんですが、言い出すと自作モジュールの宣伝に終止してしまうので他に譲ることにします。 私が望むのはそれではないですから。
 mod_joystick.as があるのだからもっとゲームパッド対応作品が増えたらいいのに。
 CK JOYFORCE DLL があるのだからフォースフィードバックをゲームに活かしたゲームが遊びたい。
 やっぱりゲームはゲームパッドで遊びたいのですよ。