Nanashi-soft○プログラマ専用○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 |
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 |
←↓ |