ゲームパッドをコマコンにしてみる

はじめに

コマコン作成のイメージ図

こんな感じです。

コマコンを作るきっかけ

きっかけは、steam版のブレイブルー(格闘ゲーム)を購入したことでした。
昔PS版で長いことプレイしていたのですが、当時理論上出せそうと思い、何かの間違いでもいいから一度だけでいいから出したい入力がありました。

ただ、技術的に難しい、というよりは人間的に入力できないコマンドでした。
コマコンなら試せるのになぁと思いつつ、それだけのためにコマコンを用意するのもめんどくさいと思って放置していたのです。

PCでできるとなれば仮想コマコンを作って夢のコマンド技が出せる気がしたので試してみました。

試したいコマンド

試すコマンドはブレイブルーのテイガーが使用する超必殺技ジェネシックエメラルドテイガーバスター(通称:GETB)です。
コマンドとしては2回転(左右どちらでも可)+Cです。
テンキーでの入力では4123698741236987+Cですが、ブレイブルーは簡易入力ができ、斜め入力が無くてもコマンドが成立する技があります。
GETBに関していうと最小ケースなら42684268+CでGETBが出せるはずなんです。

ただ、途中に上入力があるので生で出そうとするとどうしてもジャンプしてしまいます。
そのため、別の技の硬直中に上部分の入力を済ましてしまう方法や、ジャンプキャンセルキャンセル(通称:jcc)を利用して別の技を出し、その技の出始めをさらにキャンセルする入力方法がありました。
現実的なところでいうと「A or 2A>GETB」や「チャージキャンセルGETB」等ですね。

ただ、私はあくまで”生”で出したいんです。
最小ケースの入力をとんでもないスピードで入力できれば、ジャンプ移行フレームをキャンセルして生でGETBが出せるはずなのです。

仮想コマコンを作る流れ

開発言語の選定

今回はC#.NETで作成しました。

正直選定というほどのことは何もしてないです。
C#.NETでとりあえず作ってみて、処理速度とか足りなければC++で作ろう。くらいの感覚で選びました。

ゲームパッドの入力情報の取り込み

仮想ゲームパッドだけでも仮想コマコンを作れますが、現在接続しているゲームパッドの入力情報を仮想ゲームパッドにマッピングしてある程度外から入力できるようにします。
(マッピング無しだと、ゲーム内のメニュー画面やオプションの変更等をキーボードでやることになるので手元が忙しくなります。)

今回はPS4のコントローラーをPCに接続して仮想ゲームパッドのマッピング元とします。

NugetからSharpDX.DirectInputをインストール

DirectInputはマウス、キーボード、ゲームパッドの入力状態を取得するAPIです。
取得しかできないところがミソで、ここで入力を書き換えられればそのままゲームパッドをコマコン化することができましたが、現実はそんなにあまくなかったです。

ゲームパッドの取得

Nugetからのインストールが済んだらusingの記述をします。

接続されているデバイスを検索します。

デバイスが見つかった場合、先頭のゲームパッドを取得する。
複数のデバイスがある方はここ調整してください。

ゲームパッドの入力状態はGetCurrentStateで取得できます。

ViGEmをインストール

ViGEmは仮想ゲームパッドエミュレーターのフレームワークです。
下記よりダウンロードしてインストールしてください。

Readmeを見ると結構有名な企業も使用しているみたいですね!
よく聞く名前が連なってます!

ViGEmBus/README.md at master · ViGEm/ViGEmBus · GitHub

NugetからNefarius.ViGEm.Clientをインストール

ViGEmの.NET用のライブラリです。
非常に使いやすいライブラリなので使わない手はないです。

仮想ゲームパッドの作成

Nugetからのインストールが済んだらusingの記述をします。
2行目と3行目は作成したいゲームパッドにより適宜削除してください。※そのままでもいいです。

今回はPS4コントローラーを作成します。
以下のコードで、PS4コントローラーがPCに接続されたと思います。
簡単ですね、ライブラリばんざい(*´▽`*)

コード載せといてなんですが、今回は次に説明するコードを使用するので上記接続の処理は忘れてください。

仮想ゲームパッドの入力と物理ゲームパッドのマッピング

仮想ゲームパッドの接続や入力は以下で公開されているコードを使用して行います。
同階層にXbox360コントローラー用のコードも配置されていました。

上記コードから今回使用するのに不要な処理等を省いて物理ゲームパッドの入力マッピング関数を追加したものが以下となります。
マッピングは力業です。もっといい方法があるのかもしれません。

仮想ゲームパッドの入力テスト

テストはゲームパッドのテスト画面で行います。
L1が押下されていない場合はゲームパッドの状態を同期、L1を押下した時だけ○ボタンを押下状態に上書きして反映しています。
最後のDisconnectあたりにブレークポイントを置いたりしてテストしてみてください。

ボタン5(L1)が押下された際にボタン3(○)が押下されていますね。
これと同じボタン状態であれば成功です。

夢の生GETBを出してみる

無限ループのトリガー処理に42684268+Cの入力を設定して試してみます。
※実際には1つずつの処理が早すぎてゲーム側がゲームパッドの状態を取得しきれないので、適切な待ち時間を設定する必要があります。

 

できたぁ(*´▽`*)