Windows
Delphi
Pascal
WindowsAPI
objectpascal

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

More than 1 year has passed since last update.


はじめに

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