1

グラフィカル ウィンドウでマウスの座標を出力したいのですが、ユーザーがマウスをクリックすると、「クリックされました」というメッセージが表示されます。しかし問題は、ユーザーがそれをクリックすると、メッセージが 1 つではなく、約 5 ~ 10 件のメッセージが表示されることです。おそらくボタンを離す速さのせいだと思います。一度だけ印刷する方法はありますか?

#include <allegro.h>
#include <iostream>

int main(){

    allegro_init();
    install_keyboard();
    install_mouse();
    set_color_depth(32);
    set_gfx_mode(GFX_AUTODETECT_WINDOWED, 640, 480, 0, 0);

    BITMAP *pic = load_bitmap("mouse.bmp",NULL);
    BITMAP *buffer = create_bitmap(640,480);

    int x = 0, y = 0;

    while(!key[KEY_ESC]){
        blit(buffer, screen, 0,0,0,0, buffer->w,buffer->h);

        draw_sprite(buffer, pic, mouse_x, mouse_y);
        blit(buffer, screen, 0,0,0,0, buffer->w, buffer->h);
        clear_bitmap(buffer);

        if(mouse_x!=x && mouse_y!=y){
            std::cout<<mouse_x<<":"<<mouse_y<<std::endl;
        }
        if(mouse_b&1){
            std::cout<<std::endl<<">>CLICKED<<"<<std::endl;
        }

        x=mouse_x, y=mouse_y;
    }

    destroy_bitmap(pic);
    destroy_bitmap(buffer);
    return 0;
}
END_OF_MAIN()
4

2 に答える 2

1

mouse_bマウスの状態を保持しますか?もしそうなら、マウスがどれだけ長く下がっていても、フレームごとに1回メッセージを出力している可能性があります。

処理方法と同様に、ボタンの以前の状態xy保存し、状態が変化した場合にのみメッセージを送信します。これにより、メッセージが1つだけ表示されます。

于 2013-01-05T15:52:51.850 に答える
0

allegro イベントを使用する方がはるかに簡単です。allegro wikiがイベントを説明する方法は次のとおりです。

次のコードは、タスクを達成します。

  if(ev.type == ALLEGRO_EVENT_MOUSE_BUTTON_DOWN) {
      std::cout<<std::endl<<">>CLICKED<<"<<std::endl;    
  }
  else if(ev.type == ALLEGRO_EVENT_MOUSE_AXES ||
          ev.type == ALLEGRO_EVENT_MOUSE_ENTER_DISPLAY) { 
        std::cout<<mouse_x<<":"<<mouse_y<<std::endl;
  }
于 2014-02-26T01:53:02.120 に答える