Delphi でゲームコントローラーを扱う (Windows API)


はじめに

この記事は 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)? ...いえ、知らない子ですね。