XBoxコントローラーでLT/RTを取得する方法

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
furui

XBoxコントローラーでLT/RTを取得する方法

#1

投稿記事 by furui » 5年前

XBoxコントローラーに対応したゲームを作成しています。

GetJoypadXInputState関数を使用してコントローラーの入力を実装しているのですが、
LTとRTボタンの値の取得方法が分かりません。

ご存知の方いらっしゃいましたらご教示お願いいたします。

Math

Re: XBoxコントローラーでLT/RTを取得する方法

#2

投稿記事 by Math » 5年前

https://dxlib.xsrv.jp/function/dxfunc_input.html#R5N34

によると

int GetJoypadXInputState( int InputType, XINPUT_STATE *XInputState ) ;

XInput は DirectX の Xbox360コントローラを制御するための機能の名称で、DXライブラリも Xbox360コントローラについては XInput を使用して Xbox360コントローラの入力状態を取得しています。

 この関数は GetJoypadDirectInputState と同じように、XInput から取得できる生の情報を取得するための関数ですが、 Xbox360コントローラの入力情報も GetJoypadDirectInputState で取得することができます、 なのに何故 XInput の生の入力情報も取得できる関数があるのかと申しますと、 Xbox360コントローラの Lトリガーと Rトリガーの DirectInput での扱いが原因です。

 XInputから得られるゲームパッドの情報を代入する構造体 XINPUT_STATE は以下のようになっています。
struct XINPUT_STATE
{
unsigned char Buttons[ 16 ] ; // ボタン16個( 添字には XINPUT_BUTTON_DPAD_UP 等を使用する、
// 0:押されていない 1:押されている )
unsigned char LeftTrigger ; // 左トリガー( 0~255 )
unsigned char RightTrigger ; // 右トリガー( 0~255 )
short ThumbLX ; // 左スティックの横軸値( -32768 ~ 32767 )
short ThumbLY ; // 左スティックの縦軸値( -32768 ~ 32767 )
short ThumbRX ; // 右スティックの横軸値( -32768 ~ 32767 )
short ThumbRY ; // 右スティックの縦軸値( -32768 ~ 32767 )
} ;

// XInputボタン入力定義
#define XINPUT_BUTTON_DPAD_UP (0) // デジタル方向ボタン上
#define XINPUT_BUTTON_DPAD_DOWN (1) // デジタル方向ボタン下
#define XINPUT_BUTTON_DPAD_LEFT (2) // デジタル方向ボタン左
#define XINPUT_BUTTON_DPAD_RIGHT (3) // デジタル方向ボタン右
#define XINPUT_BUTTON_START (4) // STARTボタン
#define XINPUT_BUTTON_BACK (5) // BACKボタン
#define XINPUT_BUTTON_LEFT_THUMB (6) // 左スティック押し込み
#define XINPUT_BUTTON_RIGHT_THUMB (7) // 右スティック押し込み
#define XINPUT_BUTTON_LEFT_SHOULDER (8) // LBボタン
#define XINPUT_BUTTON_RIGHT_SHOULDER (9) // RBボタン
#define XINPUT_BUTTON_A (12) // Aボタン
#define XINPUT_BUTTON_B (13) // Bボタン
#define XINPUT_BUTTON_X (14) // Xボタン
#define XINPUT_BUTTON_Y (15) // Yボタン



 Xbox360コントローラに限定されているので DirectInput の情報よりシンプルです。
 そして左右スティックも左右トリガーも専用のメンバー変数が割り当てられています。

 このように XInput を使用することで問題なく状態が取得できる左右トリガーですが、 DirectInput では左トリガーも右トリガーも構造体 DINPUT_JOYSTATE のメンバー変数 Z に割り当てられています。
 どういうことかと言いますと、左トリガーを押し込んだときは Z の値がプラス方向に変化して、右トリガーを押し込んだときは Z の値がマイナス方向に変化するというものです。
 つまり、左右のトリガーを同時に押し込んだときは Z の値は 0 になり、即ち何もトリガーを押していないときと変わらず、押しているかどうかを判断することができません。

 何故そんな仕様にしたのかは不明ですが、それに対応するために正常な入力情報を取得するための関数 GetJoypadXInputState があります。

 尚、GetJoypadXInputState は Xbox360コントローラが接続されている場合のみ使用可能な関数で、 Xbox360コントローラ以外のゲームパッドが接続されていてもエラーとなり、戻り値は -1 になりますのでご注意ください。
ーーー

とあります。
詳しくは
https://dxlib.xsrv.jp/cgi/patiobbs/pati ... ew&no=3905
を参考に
その掲示板にといあわせると詳しく教えて下さるようですね。

furui

Re: XBoxコントローラーでLT/RTを取得する方法

#3

投稿記事 by furui » 5年前

Math さん

情報ありがとうございます。
LeftTrigger と RightTrigger を使用してやりたいことが出来ました。

掲示板が違うにもかかわらず親切にアドバイスいただきございました。

Math

Re: XBoxコントローラーでLT/RTを取得する方法

#4

投稿記事 by Math » 5年前

ここは元々 DXライブラリーでゲームを作っていた管理人さんの ページから派生しているので
***https://dixq.net/g/ ここのしたから飛んでくる

>掲示板が違うにもかかわらず親切にアドバイスいただきございました

訳ではありません。DXライブラリーが主ですが

https://dxlib.xsrv.jp/cgi/patiobbs/patio.cgi?

元祖 DXライブラリーを開発・管理されている方の掲示板ですよ(^^;

いまは アンドロイド対応版 もありますよ。

https://dxlib.xsrv.jp/dxinfo.html

返信

“C言語何でも質問掲示板” へ戻る