2018年4月23日月曜日

GamepadTokeybord公開

これは何?
ゲームパッド未対応のゲームを無理やりゲームパッドで動かすためのもの。
柔軟(無茶)なキーコンフィングしたいがために作成。
WASD移動、マウスカーソル移動どちらもOK

今後更新はこちらでします。

もちろん他のゲームにも使えます。大前提はAHKが使えること。AHKについてはググってください。ここでは説明しません。

(2018/05/18更新)
ダウンロードはこちら
 ダウンロード


こんな機能がほしい。という意見があればコメント欄に書いてください。
自分でも勝手に更新するのですが便利そうなアイディアも募集しています

どういったものかわかりやすくするため動画撮りました





このAHKの特徴
ジョイスティックの範囲を矩形ではなく半径と角度で判定するため入力がなめらか
Sleepやkeywaitを使用しないloop監視による高速認識
関数モジュール化による設計のしやすさとAHK由来の柔軟さと自由度
関数の判定そのものに式を用いれる
画像認識による操作の切り替え
座標認識によるアイテム配列などを十字キーで操作できる
マウスのサークル移動
上下左右を1か0判定に整形済み
DirectinputとXinput の雛形を用意していてどちらのコントローラーでも共通の動作が可能。
XinputのLRトリガー同時押し問題対応済み
ボタン長押しによる条件分岐
ジョイスティックの倒し具合によりマウスカーソルの速度変化
マウスカーソルの移動速度の固定化も可能
ニュートラル時のみ動作するトグル連打機能により操作を連打で阻害しない
連打機能はキーリピートチックで操作に優しい
LRのトリガーのソフトプル、フルプル認識
ソフトプル部分をスキップできるオプションあり
フルプル時にソフトプルを無視できるオプションあり
ズーム操作でもキャラクターを基準にサークル移動範囲を広げることが出来る
5分おきにゲームパッドの入力のスキを見てメモリを開放することによりメモリを食わない
プログラマブルにマクロを設計できる
ニュートラルかそうでないかをトリガーに出来る
デバッグモードではキーヒストリーと押したボタンの状態を認識、ゲームパッドの状態を監視できる
ジョイスティックを回すことでも条件付ができる。

更新内容
2018/04/17
ファイルを関数、ラベル部分と設定ファイルに分割。
式の一本化によりボタン、トリガー入力、十字キーの全てで連打、トグル連打が可能に。
キー入力の履歴追加。
十字キーとスティックの上下左右のキー入力の式を1と0にしてシンプル化。
デバッグモード1と2に分けて情報整理。Insertキーで切り替え。
関数のスマート化とゴチャってたところをわかりやすく。
バグ取り。

2018/04/18
LRトリガーのフルプルに対応。
バグ取り。

2018/04/19
十字キーの連打のバグ取り。

2018/04/20
不完全に残ったキーを掃除する関数を追加。
今送られているキーの可視化。キーログとは別。

2018/04/21
画像による分岐条件を拡充。
ソレに伴い。必須ファイルにGdip.ahk(ライブラリファイル)が必要に。
不都合のある押しっぱなしのキーを強制的に開放できる関数を作成。
マウスカーソル形状の変化で式が成り立つように。
画像判定のバグ取りと拡充。
その他バグ取り。

2018/04/23
画像認識機能のメモリリーク対応策として裏でこっそり再起動。
プレイ中でも隙きを見て再起動するので安心。(スマートではない)

2018/04/26
Joystickの左右を回転させると認識する関数を作りました(くるくる)
メニュー画面、インベントリ画面を十字キーで操作できる関数を作りました
関数の数が結構多くなったため整理と説明のため
サブルーチン&関数解説の.txt
を添付しました。実質ヘルプファイルです。
サンプルを増やしました。
InventoryMove.ahk
InventoryMoveChangesection.ahk

2018/04/30
マウス自由移動にブレーキ機能を追加
クルクルスティック判定を緩和化
その他バグ取り

 2018/05/03
 新関数を追加。PushCountOrder()とPushCountReversal()
 新しいカウント分岐。
 その他バグ取り

 2018/05/18
 スターバウンドのサンプルを新しく。
 アクティブウィンドウからマウスカーソルがはみ出さないようにする関数を追加(マウス操作時は無視されるが、ゲームパッド時に有効になる)
 スティックを弾く動作のサンプルを追加。スマブラのスマッシュ動作。

動作環境
コントローラーはデュアルショックコントローラー4。DS4windowsを導入済みの環境下で動いています。
(DS4windowsはDS4をXinputにしてXbox360コントローラーとして認識させ、さらにトラックパッドやジャイロ機能も有効化してくれるスグレモノです。気になったらググってみてください)

もちろんDS4をそのまま繋げるとDirectInputになるのでそれでも動作チェックしました。

必要なものは?
※まず大前提はAHK_L本体です※
※AHKの書き方を理解していることも重要です※
※Gdip.ahkが必須です※ (入っています。消さないでください。関数のライブラリファイルです)
※xinput1_3.dllが必須です※
※画像認識させるならそれらの画像も必要です※

xinput1_3.dllはDirectX入れてれば勝手に入ってるはず。なければダウンロードしてください。XboxコントローラーのLRトリガーを同時に押すために必要です。

Xbox360のLRのトリガー同時押しもAPIを叩くことで取得できました。

https://autohotkey.com/board/topic/35848-xinput-xbox-360-controller-api/

(振動も出来るらしいけどボタンに当てると不安定。どうやらチェック用の機能としてつけてるらしい。)

マウスカーソル判定こちらのものを使わせてもらいました。

https://autohotkey.com/board/topic/73686-compare-current-cursor-to-saved-image/

そして画像判定関数はこちらのライブラリになります膨大なのでahkファイルにしてインクルードしました。

https://autohotkey.com/board/topic/29449-gdi-standard-library-145-by-tic/

Lexikos氏、glucos氏、tic氏、chaidy氏に多大な感謝を

代表機能

ジョイスティックの状態で押すキーを柔軟に条件付けし、選択できる。

ジョイスティックの動きに合わせてマウスカーソルを移動させることが出来る。

押してる間連打 (実際のキーリピートのように動作する。最初の一打だけ遅く、あとは押してる間高速で連打される)

トグル連打 ※トグル連打は暴発を防ぐためニュートラル時のみ連打する※

修飾キーのディレイ。(シフトを押してから30ミリ秒後にクリックのような動作)

指定したボタンを連続入力(簡易マクロ。上記と機能自体は同じで応用)

押した最初だけ別の行動をさせる事が可能。(一度だけ通るなど)

LRトリガーのフルプル、ソフトプルの設定。(オプション次第で完全に別の動作させることも可能)

XinputコントローラーでのLRトリガー同時入力(他力本願)

マウスカーソルの変化を感知し、0か1を返す(他力本願)

Directinputに切り替えてもボタンや軸がずれないように軸とボタンを初期設定化。(スイッチフラグで切り替え)
エレコムなんかの多ボタンなどももちろん使えます。

多数の画像認識機能あり ※本スクリプトと同じ階層に認識させたい画像フォルダ作って入れてからパス指定してください※(サンプルスクリプト書き込んでます)

ボタンを押すと見つけた画像のところにマウスカーソルを持っていく処理。

ボタンを押した回数を記録。(同じボタンでも押すたびにA、B、C~順に巡ることが可能。一巡する回数は可変できます)

マウスホイールでズームしたとき、マウスの円移動の半径範囲を広げることが可能。(これによりマウスがキャラにかぶったりせず、動き回れる)

アイテムリストの場所を定義してやることで十字キーで操作できる

くるくるスティックを回すと有効になる関数の追加

マウス移動にブレーキ機能を追加(New)

キーボード操作
左Win+F5:scriptの再読込
Insert:デバッグ情報切り替え
pause:処理をポーズ状態に
PgUp:カーソル形状をbmpファイルで保存する。(マウスカーソルはスクリーンショットに現れないため)

画面上のボタンの切り抜き方法。簡単ですがもしものために。
1:まずゲームなりのSSを撮影。
2:ペイントソフトなどでほしい部分を切り抜き
3:bmpで保存。
4:ここにある画像ファイルであれこれ分岐させる。

!注意点!

SleepおよびKeywaitなどのスレッドを休憩させる処理は入れるのはおすすめしません。
なぜならloopでパッドの入力状態を監視しているのでその間次の処理に進みません。
具体的にはSleepを使うとマウスの移動が極端に遅くなる、Keywaitを使うとほかのボタンが押されても認識しない、などです。

できることならA_indexも使わないほうがいいでしょう。監視のためのloopでこの一文が入っても遅くなります。
処理を待たせたいならA_tickcountで現在の時間を指定してやるのが最善かと思います。
サンプルでそのあたりは詳しく書いておきますので参考にどうぞ。

:内容物:
Torchlight2Image(分岐に使う画像を入れておくフォルダ)
samplebox1.bpm(サンプル向け真っ黒画像)
samplebox2.bpm(サンプル向け真っ黒画像)
GamepadToKeybordFramework.ahk(関数ライブラリとキーラベル、gosubラベル。必須ファイル。本体)
Gdip.ahk(関数ライブラリ。必須ファイル)
Torchlight2.ahk(ゲーム向けサンプル。トーチライト2)
Starbound.ahk(ゲーム向けサンプル。スターバウンド新サンプル)
Starbound_Old.ahk(ゲーム向けサンプル。スターバウンド、旧サンプル)
GamepadMouse.ahk(常駐マウスサンプル。機能は適当)
InventoryMove.ahk(インベントリ内の十字キーサンプル)
InventoryMoveChangesection.ahk(インベントリのセクションを飛び越えるサンプル)
サブルーチン&関数解説.txt(実質ヘルプファイル)

GamepadMouse.ahkは常駐したマウス操作のサンプルです。 Torchlight2.ahkはトーチライト2向けゲームパッド設定。どんなゲームかは詳しくはこちら。↓

http://store.steampowered.com/app/200710/Torchlight_II/
https://www.youtube.com/watch?v=mfWMp33LlTo
今回のキーコンフィグの前提としてトーチライト2カメラMODを入れています。↓

http://torchlight2.wiki.fc2.com/wiki/%E3%82%B2%E3%83%BC%E3%83%A0%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0

※カメラMODは初期のマウスMボタンでは都合が悪いのでl(エル)に。リセットはBS(バックスペース)に設定しています※

Starbound.ahkは新たに追加したボタン設定です。wasd移動の参考にしてください。

Q:なんで今更トーチライト2?
A:ゲームパッド未対応でアクション性があるし、ちょうど今やってるゲームだから都合がよかった

Q:なんで今更スターバウンド?
A:ゲームパッド未対応でアクション性があるし、ちょうど今やってるゲームだから都合がよかった

Q:ほかのゲームには使えないの?
A:使えます。ahkファイルの書き換えが必要。なので基礎知識程度は必要です。
Torchlight2.ahk(サンプル)
GamepadMouse.ahk(サンプル)
Starbound.ahk(サンプル)
上記三種類のファイルを用意していますのでこれらをいじってください。
逆に↓これら二種類は根幹を成す部分です。触らないことをお勧めします。
GamepadToKeybordFramework.ahk
Gdip.ahk

Q:スチームのキーコンフィグやJTKじゃだめ?
A:それらではまだ満足できないという人向け。

Q:エクスプローラー上で使いたいんだけど?
A:GamepadMouse.ahkというサンプルファイルを同封しています。常駐します。これを参考にいじり倒してください。

2 件のコメント:

  1. aoto hot keyで検索してたどり着きました。
    いくつか質問させてください。
    白猫テニスというスマホゲームをbluestacksで操作してますが、
    マルチタップ非対応のゲームなので、以下のような動作はできますか?

    移動しながら攻撃ボタン押す(マルチタップ非対応なので移動キー離さないと攻撃ボタン反応しない)

    ⇒攻撃ボタンやほかのボタン押したと同時に移動キーを離したことになるようにしたい(押したボタンだけ有効になるようにしたい)

    よろしくお願いします。

    返信削除