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