Аллегро, вывод клика мышью

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

1

Решение

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

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

1

Другие решения

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

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

  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;
}
0