LoginSignup
6
3

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-01-29

はじめに

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

6
3
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
3