はじめに
この記事は Delphi で...というより Windows API でゲームコントローラーを扱ってみるものです。
コード
uses に Winapi.MMSystem を追加しておくとゲームコントローラーを扱うコードを記述できます。
uses
..., Winapi.MMSystem;
joyGetPos()
簡単にゲームコントローラーを扱うには joyGetPos() を使います。タイマーでポーリングするとよいでしょう。
var
JoyInfo: TJoyInfo;
begin
if joyGetPos(JOYSTICKID1, @JoyInfo) <> JOYERR_NOERROR then
Exit;
// 処理
end;
joyGetPos() の最初の引数は以下の通りです。
定数 | 説明 |
---|---|
JOYSTICKID1 | ゲームコントローラー 1 |
JOYSTICKID2 | ゲームコントローラー 2 |
二番目の引数には状態を返す JOYINFO 構造体 へのポインタを渡します。
戻り値が JOYERR_NOERROR の場合には成功です。それ以外の値が返ってきた場合には指定されたゲームコントローラーが使えない事を意味しています。
JOYINFO 構造体 には以下の値が返ってきます。
wXpos | 位置 |
---|---|
0 | 左 |
32767 | 押されていない |
65535 | 右 |
wYpos | 位置 |
---|---|
0 | 上 |
32767 | 押されていない |
65535 | 下 |
wZpos も同様です。アナログスティックの場合、wXpos / wYpos / wZpos には 0 ~ 65535 でアナログ値が返ります。ニュートラル位置の値が 32767 だとは限りません。
wButtons には JOY_BUTTON1 / JOY_BUTTON2 / JOY_BUTTON3 / JOY_BUTTON4 のいずれか、またはその合計値が返ります。
joyGetPos() は 3 軸 4 ボタンまでのゲームコントローラーしか扱えないという制限があります。
joyGetPosEx()
もう少し高度にゲームコントローラーを扱う joyGetPosEx() もあります。こちらもタイマーでポーリングするとよいでしょう。
var
JoyInfoEx: TJoyInfoEx;
begin
JoyInfoEx.dwSize := SizeOf(JoyInfoEx);
JoyInfoEx.dwFlags := JOY_RETURNALL;
if joyGetPosEx(JOYSTICKID1, @JoyInfoEx) <> JOYERR_NOERROR then
Exit;
// 処理
end;
使い方は joyGetPos() とほぼ同じですが、JOYINFOEX 構造体 は初期化しておく必要があります。
joyGetPosEx() は 6 軸 32 ボタン + POV (Point Of View) のゲームコントローラーを扱えます。
おわりに
DirectInput? RawInput(WM_INPUT)? ...いえ、知らない子ですね。