Nanashi-softプログラマ専用PS3 Linux SDL


◇PS3 Linux SDLでプログラミング -コントローラを使う-

ゲーム機なんだから、コントローラが使えなければ話にならないだろう
と言う訳で、まず最初にコントローラの使い方を説明します

○コントローラを認識する

SDL上ではジョイスティックとして認識されます
ジョイスティックって何? と言う人は、まずはググって調べてきて下さい。形状を知らなければ、APIリファレンス見ても意味不明になりますから

まず、ジョイスティックを使う事を SDL_Init時に宣言します
既に VIDEOを記述していると思いますので、「|」(or)演算します

SDL_Init(SDL_INIT_VIDEO|SDL_INIT_JOYSTICK)


次に、ジョイスティックが認識できたかどうかを調べます

if (SDL_NumJoysticks() == 0){
  //認識できなかった
}
else{
  //認識できた
}

PS3の場合、通常はワイヤレスなので、USB接続し忘れている事が多いのでちゃんと注意してあげましょう
ちゃんとエラー処理しておかないと、開発中に自分でハマる場合が多々あります(汗)

次に、ジョイスティックをオープンします
Linuxの基本なのですが、大抵何でもオープン→処理→クローズと言う実装になっています

SDL_Joystick *joystick;
SDL_JoystickEventState(SDL_ENABLE);
joystick = SDL_JoystickOpen(0);

これで、後はこの joystickに対して命令を出せば色々取得できます

ちなみに、クローズは SDL_Quitで一緒に行われるので、意識して行う必要はありません
ただ、エラーで終了する際に SDL_Quitを忘れていると、誤動作する場合があるようでした

※現状は、USBケーブルで接続した状態でなければ認識できません(2007/02現在)
※USBハブを経由して PS3コントローラを接続すると、うまく認識されない様子でした(2007/02現在)
※USB変換機を経由した PS2用コントローラも同様の方法で認識可能でした

○ボタンを認識する

キー入力待ちを行っている whileループ中で、どのボタンが押されているのかを取得できます

while(SDL_PollEvent(&event)){
  switch(event.type){
~ここにキーイベントとかが既にある
  case SDL_JOYBUTTONDOWN:
    //どれかのボタンが押された
    if(SDL_JoystickGetButton(joystick, 0){ //SELECT
      //SELECTボタンを押した時の処理
    }
    else if(SDL_JoystickGetButton(joystick, 3){ //START
      //STARTボタンを押した時の処理
    }
    break;
  }
}

これでボタンが押された時に反応できます

SDL_JoystickGetButton(「認識したジョイスティック」, 「ボタン番号」)

・PS3コントローラボタン番号表

0

SELECT

1

L3

2

R3

3

START

4

5

6

7

8

L2

9

R2

10

L1

11

R1

12

13

14

×

15

16

PS

○PS2コントローラに対応する

USB変換機などを通して、PS2コントローラを認識させる事ができました
認識する方法は同じなのですが、押されたボタンを判定する方法が異なります

まずは、コントローラの種類を判別します

char *joyname=(char *)SDL_JoystickName(0);

この戻ってくる文字列が問題で、実は変換機の名称が返ってきます
それでは数が多すぎて対応し切れないので、逆に PS3コントローラ名で無ければ PS2コントローラだと決め付けます

if (memcmp("Sony PLAYSTATION(R)3", joyname, 20){
  //PS3コントローラと認識
}
else{
  //PS2コントローラと認識
}


押されたボタンを判定する方法は、SDL_JoystickGetButtonで取得できるボタンは同じです
但し、ボタン番号が異なります

・PS2コントローラボタン番号表

0

1

2

×

3

4

L2

5

R2

6

L1

7

R1

8

START

9

SELECT

10

L3

11

R3


残るボタンの取得方法が異なります
ハットスイッチとして認識されている為、そちらのイベントで認識する必要があります

while(SDL_PollEvent(&event)){
  switch(event.type){
~ここにキーイベントとかが既にある
  case SDL_JOYBUTTONDOWN:
~ここにSDL_JoystickGetButtonの記述がある
  case SDL_JOYHATMOTION:
    int hat=SDL_JoystickGetHat(joystick, 0);
    switch(hat){
      case SDL_HAT_UP: //↑
        //↑ボタンを押した時の処理
      break;
    case SDL_HAT_DOWN: //↓
      //↓ボタンを押した時の処理
      break;
    }
    break;
  }
}

SDL_JoystickGetHat(「認識したジョイスティック」, 0);
2番目の引数は0に固定です

戻り値に、押されているボタンの状況が返ってきます

・PS2コントローラボタン番号表・その2

SDL_HAT_UP

SDL_HAT_RIGHT

SDL_HAT_DOWN

SDL_HAT_LEFT

SDL_HAT_RIGHTUP

→↑

SDL_HAT_RIGHTDOWN

→↓

SDL_HAT_LEFTUP

←↑

SDL_HAT_LEFTDOWN

←↓


斜め押しも用意されているので便利ですね


TOPプログラマ専用PS3 Linux SDL