HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2023
1017
buhio一般論として、ゲームパッドの挙動5解決


buhio

リンク

2023/10/17(Tue) 13:00:05|NO.100290

 みなさんコンニチワ

色々とゲームパッドに対応すべく、悪戦苦闘しています。
今後のために教えてください。

ワタシが最近奮発して買ったXBOX型コントローラー(サードパーティ製・turtlebeach?)というものなのですが、
調べた結果、LトリガーとRトリガーに、ボタンではなくアナログZ軸なるものが割り当てられており、両方を同時に完全に押し込んだ値と、両方を押していない値が同じアナログ中心値を返すということがわかりました。

値としては正しいのですが、これだと実際問題が出ます。離しているのか両方押しているのか判定できない。

結果的に、古い古いPS2変換パッドを引っ張り出し、テスト対応したのです。

こういうものって、仕方ないんですかね?割り当て変更できるかWindowsを探したけど設定項目もなく、
jstickやjoyGetPosEX命令では、どうにもできないという理解でいいんでしょうか。。。

ドライバからさわる必要ありだと、無理なんでそういうもんだと理解しようと思っています。



この記事に返信する


沢渡

リンク

2023/10/17(Tue) 16:31:59|NO.100292

X-Inputに対応しているコントローラーであれば、
私が過去に作ったX-Input用のモジュールで
左右のトリガーの状態を別々に取得できるかもしれません。
https://hsp.tv/play/pforum.php?mode=pastwch&num=97223

/* X-Input対応のジョイスティック状態を取得するモジュール ・joyGetPos_x_initを最初に実行しておく ・joyGetPos_x p1,p2,p3 p1には要素数8の整数配列を、p2にはコントローラーのインデックスを指定する(省略時は0)。 実行後、p1に指定した配列には以下の値が入る。 0 : ジョイスティックに入力があるたびに増加する値 1 : ボタンの入力状態(十字キーの状態もここに入る) 2 : 左トリガーの入力状態 3 : 右トリガーの入力状態 4 : 左スティックのX軸 5 : 左スティックのY軸 6 : 右スティックのX軸 7 : 右スティックのY軸 p3に0以外の値を指定した場合は、前回実行した時とジョイスティックの状態が変わらないのなら、配列の内容を変更しない。 (省略時は1) */ #uselib "Xinput1_4.dll" #func global XInputGetState "XInputGetState" int,int #module #deffunc joyGetPos_x_init //これを最初に実行する dim state,4 packet_old=-1 return #define global joyGetPos_x(%1,%2=0,%3=1) _joyGetPos_x %1,%2,%3 #deffunc _joyGetPos_x array out,int port,int flag XInputGetState port,varptr(state) if flag : if state(0)=packet_old : return packet_old=state(0) out(0)=state(0) out(1)=state(1)&0xFFFF out(2)=(state(1)>>16)&0xFF out(3)=(state(1)>>24)&0xFF out(4)=state(2)<<16>>16 out(5)=state(2)>>16 out(6)=state(3)<<16>>16 out(7)=state(3)>>16 return #global joyGetPos_x_init //以下、テスト用プログラム dim data,8 repeat joyGetPos_x data,0 redraw 0 color 255,255,255 : boxf : color 0,0,0 : pos 0,0 repeat 8 : mes data(cnt) : loop redraw 1 await 33 loop



buhio

リンク

2023/10/19(Thu) 12:39:43|NO.100305

残念ながら、いただいたスクリプトでは、ゲームパッドの入力に反応しませんでした。
X-input1_4.dllというのを、どっかからダウンロードしたんですが、やはり動きませんでした。

なんでだろ、、



usagi

リンク

2023/10/19(Thu) 15:30:37|NO.100306

こんにちわ

>どっかからダウンロード
XinputというのはMicrosoftの物でDirectXに含まれてます。
余り意識しなくてもWindows\System32フォルダにありますので("user32"みたいな感じ)
実行できるはずですが、おそらくお使いのPCには無かったのでしょう。
公式からダウンロードしないと、怪しい物もありますので、
一度、正しいものをインストールしてみてはと思いました。

また、XInputには 3 つのバージョンがあります
"Xinput1_4.dll","Xinput9_1_0.dll", "Xinputuap.dll"
既に正式にインストールされている物があるかもしれませんので、
スクリプトを書き換えてみてはいかがでしょうか?
※上記System32フォルダを一度見てみてください
※Xinputuapはありそうな気がします(振動使えませんが)


>jstickやjoyGetPosEX命令では、どうにもできない
古い"winmm.dll"というマルチメディア用のライブラリで動いてます。
XBoxコントローラとは企画が違うので正しく取得できません。


>一般論として、ゲームパッドの挙動
winmmのほかDirectInputというライブラリで認識できる物もあるのですが、
大抵のボタンは認識しますが、ボタンの役割が企画されていなかったので、
コントローラによって入力がバラバラでした。
ですから、ユーザーの方でキーアサインをする必要が出てきてしまいます。

そこでMicrosoftがXboxを出すときに企画化したのがXInputです。
仕様が決まってますから、ユーザーはキーアサインをする必要がありません。

お使いのコントローラは純正ではないですが、おそらく互換機かと思われますので、
Xinputを使用すれば情報が正しく取得出来るはずでございます。

コントローラによってはDirectInputとXInputを切り替えられるもの、
ゲームによってはどちらかを使うようにプログラムされている物があります。

ユーザーさんのハード環境はそれぞれなので、場合分けで対応するか。
"Xboxコントローラ対応"などどれかに絞るのが良いかと思いました。


※余談※
LT、RTはアナログ値と仕様が決まってます。
ボタンと違いはトリガーは新しいゲーム体験をもたらせるわけですね。

たとえば、FPSでエイムする時に浅く押すとゆっくり、
深く押すと素早く照準器を覗き込むなどです。あとカバーアクションとか

コンテストかなりの力作出されてますね。

MSDNに仕様かかれてるので、沢渡さんのスクリプトの関数名を見てみると、
色々と分かるかと思います。
https://learn.microsoft.com/ja-jp/windows/win32/api/xinput/nf-xinput-xinputgetstate



Ve

リンク

2023/10/20(Fri) 06:34:45|NO.100311

そもそもパッドって、共通の仕様がないから、別のパッドだと別の挙動するけど・・・



buhio

リンク

2023/10/20(Fri) 10:17:18|NO.100314

>沢渡さん >usagiさん

 アドバイス誠にありがとうございました。
 X-inputドライバはインストールされていました。
 ワイヤレスだと反応せず、USBで繋いだら見事に反応いたしました。
 jstickやX-Inputの概念がわかり、大変助かりました。

 実装としましては、以下のように構築できました。
 1.ゲームパッドを使用しない(キーボード指定)
 2.ゲームパッドを使用する(X-Input以外)
 3.X-Inputを使用する(デフォルト)
 ※ただし、ゲームパッドが認識できない場合はキーボードモード

 非常に時間がかかり、参りました。。。



記事削除

記事NO.パスワード
(質問が解決したスレッドは他の利用者に活用してもらうため、削除しないようお願いします)

NO.100290への返信

マスコット

好きなマスコットを選んでください。

名前

e-mail
HOME
  1. 初めて利用する方は、HSP3掲示板の使い方をお読みください。
  2. 不要部分の多い長いスクリプトの投稿は ご遠慮ください。
  3. 書き込みは自動改行されません。適度に改行を入れてください。
  4. スクリプトは小文字の<pre>〜</pre>で囲むと見やすく表示できます。

削除用パスワード

解決したら質問者本人がここをチェックしてください。

エラー発生時、再送信すると二重送信になることがあります。
回答が得られたら、お礼書き込み時に[解決]チェックしてください。
SPAM防止のためURLから始まる文章は投稿できません。
SPAM防止のため英文字のみの本文を投稿することはできません。

ONION software Copyright 1997-2023(c) All rights reserved.