Allegro, вывод щелчка мышью

Я хочу распечатать координаты моей мыши в графическом окне, и когда пользователь щелкнет по ней, должно появиться сообщение «нажато». Но проблема в том, что когда пользователь нажимает на нее, вместо 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()

person RnD    schedule 05.01.2013    source источник


Ответы (2)


Сохраняет ли mouse_b состояние мыши? Если это так, он может выводить сообщения один раз в каждом кадре, пока ваша мышь не нажата.

Подобно тому, как вы обрабатываете x,y, сохраняете предыдущее состояние кнопки и отправляете сообщение только в случае изменения состояния, это должно дать вам только 1 сообщение.

person Karthik T    schedule 05.01.2013

Гораздо проще использовать события аллегро. Вот как вики allegro объясняет события.

Следующий код выполнит вашу задачу.

  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;
  }
person Jacob.Kincaid    schedule 26.02.2014