Nanashi-softプログラマ専用Windows gcc SDL


◇PS3 Linux SDLでプログラミング -コントローラを使う(ボタンの押し具合を取得)-

SDL_JoystickNumAxes関数でコントローラの軸数が取得できるそうで、試してみると『28』と表示された
どういう時に、その値が変化するのか検証してみたところ、ボタンをどのぐらいの強さで押し込んできるのかが取得できる事がわかりました

○SDL_JoystickNumAxes番号表

0 左スティックの左右 -32767(左)〜32767(右)
1 左スティックの上下 -32767(上)〜32767(下)
2 右スティックの左右 -32767(左)〜32767(右)
3 右スティックの上下 -32767(上)〜32767(下)
8 -32767(放し)〜0(軽く押し)〜32767(強く押し込み)
9
10
11
12 L2
13 R2
14 L1
15 R1
16
17
18 ×
19
これ以外のあいている場所は何の為にあるのかわかりません
SELECT・START・L3・R3は取得できないようです

○軸の変化に対応するサンプルプログラム

#include "SDL.h"
int main(int args,char *argp[]){
  SDL_Joystick *joystick;
  int axes;
  int i;

  if(SDL_Init(SDL_INIT_VIDEO|SDL_INIT_JOYSTICK) < 0){
    return -1;
  }

  if(0 < SDL_NumJoysticks()){
    SDL_JoystickEventState(SDL_ENABLE);
    joystick = SDL_JoystickOpen(0);

    printf("JoystickName=%s\n", SDL_JoystickName(0));
    axes = SDL_JoystickNumAxes(joystick);
    printf("JoystickNumAxes=%d\n", axes);

    for (i=0; i < axes; i++){
      printf("JoystickGetAxis(%d)=%d\n", i, (int)SDL_JoystickGetAxis(joystick, i));
    }
  }

  int done=0;
  SDL_Event event;
  while(!done){
    if(SDL_PollEvent(&event)){
      //最初に常にシステム終了記述をする
      switch(event.type){
      case SDL_QUIT:
        done = 1;
        break;
      case SDL_KEYDOWN:
        if (event.key.keysym.sym == SDLK_ESCAPE){
          done = 1;
        }
        break;
      case SDL_JOYBUTTONDOWN:
        if(SDL_JoystickGetButton(joystick, 16)){ //PS
          done = 1;
        }
        break;
      case SDL_JOYAXISMOTION:
        //軸の変化を検出するとここに処理が来る
        for (i=0; i < axes; i++){
          printf("JoystickGetAxis(%d)=%d\n", i, (int)SDL_JoystickGetAxis(joystick, i));
        }
        break;
      }
    }
  }

  SDL_QuitSubSystem(SDL_INIT_VIDEO|SDL_INIT_JOYSTICK);
}



TOPプログラマ専用PS3 Linux SDL