2013-01-05 4 views
1

그래픽 창에서 마우스의 좌표를 인쇄하고 사용자가이를 클릭하면 "클릭 한"메시지가 나타납니다. 하지만 문제는 사용자가 1 개의 메시지 대신 5 ~ 10 개의 메시지를 클릭하는 것입니다. 아마 버튼을 놓는 속도가 빠르기 때문일 수도 있습니다. 한 번만 인쇄하는 방법이 있습니까?Allegro, 마우스 클릭 출력

#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 개만 표시됩니다.

0

알레그로 이벤트를 사용하는 것이 훨씬 쉽습니다. Here is how allegro wiki explains events.

다음 코드는 작업을 완료합니다.

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