Nanashi-softプログラマ専用Mac OS X gcc SDL


◇Mac OS Xでgcc+SDL -マウス/トラックパッドを使う-

マウスは何もしなくてもイベントが来ています
SDL_MOUSEMOTION時に、motion構造体に現状が
SDL_MOUSEBUTTONDOWN時に、ボタンを押した時の状態が、button構造体に
SDL_MOUSEBUTTONUP時に、ボタンを離した時の状態が、button構造体に
それぞれ返ってきます

これは実際にマウスを動かして、返って来る値を見たほうが早いです

ボタンを押した時、離した時の、それぞれの状況を取得するプログラム例

while(SDL_PollEvent(&event)){
  switch(event.type){
  case SDL_MOUSEBUTTONDOWN:
    if(event.button.button == SDL_BUTTON_LEFT){
      //左ボタンを押した
      printf("DOWN/LEFT:x=%d,y=%d\n", event.button.x,event.button.y);
    }
    else if(event.button.button == SDL_BUTTON_RIGHT){
      //右ボタン押した
      printf("DOWN/RIGHT:x=%d,y=%d\n", event.button.x,event.button.y);
    }
    break;
  case SDL_MOUSEBUTTONUP:
    if(event.button.button == SDL_BUTTON_LEFT){
      //左ボタンを離した
      printf("UP/LEFT:x=%d,y=%d\n", event.button.x,event.button.y);
    }
    else if(event.button.button == SDL_BUTTON_RIGHT){
      //右ボタン離した
      printf("UP/RIGHT:x=%d,y=%d\n", event.button.x,event.button.y);
    }
    break;
  }
}

SDLではダブルクリックの認識は自分で行わなければならないようです
ボタンを叩いた間隔とか測って判定するとか

SDLに限りませんがこの手のイベントで気をつけなければならないのは、必ず来るとは思わない事です
例えば、右ボタンを押した時に画像を変えて、離した時に画像を元に戻したいとします
押した→フラグを立てる→離した→フラグを落とす
などと単純にプログラミングすると、2回素早く叩いた際に、押した→離した→離した→押した。と入れ違ってメッセージが来たときに誤動作します

ゲームなどでは、1つにまとめた方が処理し易いかも知れません

while(SDL_PollEvent(&event)){
  switch(event.type){
  case SDL_MOUSEMOTION:
  case SDL_MOUSEBUTTONDOWN:
  case SDL_MOUSEBUTTONUP:
    if(event.button.button == SDL_BUTTON_LEFT && event.button.state == SDL_PRESSED){
      //左ボタンを押した
      printf("DOWN/LEFT:x=%d,y=%d\n", event.button.x,event.button.y && event.button.state == SDL_PRESSED);
    }
    else if(event.button.button == SDL_BUTTON_RIGHT && event.button.state == SDL_PRESSED){
      //右ボタン押した
      printf("DOWN/RIGHT:x=%d,y=%d\n", event.button.x,event.button.y);
    }
    else if(event.button.button == SDL_BUTTON_LEFT && event.button.state == SDL_RELEASED){
      //左ボタンを離した
      printf("UP/LEFT:x=%d,y=%d\n", event.button.x,event.button.y && event.button.state == SDL_PRESSED);
    }
    else if(event.button.button == SDL_BUTTON_RIGHT && event.button.state == SDL_RELEASED){
      //右ボタンを離した
      printf("UP/RIGHT:x=%d,y=%d\n", event.button.x,event.button.y);
    }
    else{
      //カーソルを動かした
      printf("MOVE:x=%d,y=%d\n", event.button.x,event.button.y);
    }
    break;
  }
}

○トラックパッド

MacBook Airは二本指で触れると画面スクロール、と言うように、1本指と2本指で別の機能になります
どのようなイベントが取得できるのか興味ありませんか?

2本指で上に移動すると4が、下に移動させると5が返りました
つまり、ホイールを上下に動かしたのと同じものが来るわけです

MacBook Airでのトラックパッド操作をまとめると
1:SDL_BUTTON_LEFT:ボタンを押す
2:SDL_BUTTON_MIDDLE:optionキーを押しながらボタンを押す
3:SDL_BUTTON_RIGHT:commandキーを押しながらボタンを押す
4:SDL_BUTTON_WHEELUP:2本指で上に
5:DL_BUTTON_WHEELDOWN:2本指で下に
※2本指で左右への移動は検知されませんでした
になります


TOPプログラマ専用Mac OS X gcc SDL