Win32でフ●ミコン程度のジョイスティックとキーボード入力

これもWindows環境前提。


キーボードとジョイスティックの入力

入力周りはDirectInputありますが、初期化だるいです(せいぜい行っても200Line程度なのですが)

とにかく早く入力周りほしいって人はGetAsyncKeyState使うのが良いです。
http://msdn.microsoft.com/ja-jp/library/cc364583.aspx

ジョイスティックでフ●ミコン程度なら、joyGetPosを使うのがお手軽。以下みたいに呼び出します。
正しく関数が終了したらJOYINFO構造体に詰まってくるので、中身を調べて各種処理をします。

#include <windows.h>

void poll_joy() {
  JOYINFO JoyInfo;
  //JOYSTICKID1は接続されてる一個目のジョイスティックのこと
  if(joyGetPos(JOYSTICKID1, &JoyInfo) == JOYERR_NOERROR) {
    //正しくジョイスティックの情報が取れたので、ここでJoyInfoの中身を調べて処理
  }

}

http://msdn.microsoft.com/ja-jp/library/cc410473.aspx

JOYINFOのwXpos(wYposも)はアナログ値です。
0x0000 - 0x8000(大体ニュートラル) - 0xFFFFと変化します(必ずしもそうでもないけど)
ある程度閾値決めて、それ以上なら左右押されてる、と判定するようにしましょう。
物によって正しく判定できないものもあるので、ここは調整になります。サンプルでは、0x3FFF(16k - 1)引いた値を閾値としました。
※あと、一部のジョイスティックでは、左右逆転するときもあるので注意。後々コンフィグできるように設計しないと詰みます。



サンプル

詰むとは言ったものの、さっさと入力がほしいので今は考えないことにします。
色々やり方ありますが、適当にマクロを切ってあげるのが良いです。
32bit環境でbit判定で入力取るなら以下みたいな感じになります。


//include
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>

#pragma comment(lib, "winmm.lib")
#pragma comment(lib, "user32.lib")

#define INPUT_UP         0x00000001
#define INPUT_DOWN       0x00000002
#define INPUT_LEFT       0x00000004
#define INPUT_RIGHT      0x00000008
#define INPUT_B0         0x00000100
#define INPUT_B1         0x00000200
#define INPUT_ESCAPE     0x80000000
#define INPUT_P          0xBFFF  //アナログパッドの閾値。適当
#define INPUT_N          0x3FFF  //アナログパッドの閾値。適当
#define INPUT_GET(x)     (GetAsyncKeyState(x) & 0x8000) //最上位bitが今押されてるかの判定
unsigned long input_state = 0;
unsigned long poll_input() {
  JOYINFO JoyInfo;
  input_state = 0;
  if(INPUT_GET(VK_ESCAPE)) input_state |= INPUT_ESCAPE;
  if(INPUT_GET(VK_LEFT)  ) input_state |= INPUT_LEFT;
  if(INPUT_GET(VK_RIGHT) ) input_state |= INPUT_RIGHT;
  if(INPUT_GET(VK_UP)    ) input_state |= INPUT_UP;
  if(INPUT_GET(VK_DOWN)  ) input_state |= INPUT_DOWN;
  if(INPUT_GET('Z')      ) input_state |= INPUT_B0;
  if(INPUT_GET('X')      ) input_state |= INPUT_B1;
  if ( joyGetPos(JOYSTICKID1, &JoyInfo) == JOYERR_NOERROR) {
    if(JoyInfo.wXpos    < INPUT_N)      input_state |= INPUT_LEFT;
    if(JoyInfo.wXpos    > INPUT_P)      input_state |= INPUT_RIGHT;
    if(JoyInfo.wYpos    < INPUT_N)      input_state |= INPUT_UP;
    if(JoyInfo.wYpos    > INPUT_P)      input_state |= INPUT_DOWN;
    if(JoyInfo.wButtons & JOY_BUTTON1)  input_state |= INPUT_B0;
    if(JoyInfo.wButtons & JOY_BUTTON2)  input_state |= INPUT_B1;
  }
  return input_state;
}

int main() {
  while(1) {
    poll_input();
    printf("input_state = %08X\n", input_state);
    Sleep(15);
  }
  return 0;
}

Win環境でライブラリ導入もかったるい人は上の一個作れば入力取れるんで便利。


Back

2010/08/30 Gyabo