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


◇Windowsで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;
  }
}



TOPプログラマ専用Windows gcc SDL