Кнопка мыши Allegro отпущена

Я хочу сделать программу Allegro 5, в которой курсор должен изменить свой внешний вид при нажатии кнопки мыши. Насколько я понимаю, это утверждение events.type!=ALLEGRO_EVENT_MOUSE_BUTTON_UP никогда не становится ложным. Но я не могу понять, почему, потому что после отпускания кнопки цикл не останавливается. Можете ли вы сказать мне, где моя ошибка и есть ли лучший альтернативный способ?

        while(loop){
        al_clear_to_color(al_map_rgb(0,0,0));
        ALLEGRO_EVENT events;
        al_wait_for_event(event_queue, &events);
        if(events.type == ALLEGRO_EVENT_DISPLAY_CLOSE){
            loop=false;
        }
        if(events.type == ALLEGRO_EVENT_MOUSE_AXES ){
            x=events.mouse.x;
            y=events.mouse.y;
            buffer = released;
        }
        if( events.type==ALLEGRO_EVENT_MOUSE_BUTTON_DOWN)
            while (events.type!=ALLEGRO_EVENT_MOUSE_BUTTON_UP){
                x=events.mouse.x;
                y=events.mouse.y;
                al_draw_bitmap(pressed, x , y , NULL );
                al_flip_display();
                al_clear_to_color(al_map_rgb( 0 , 0 , 0));
            }

        al_draw_bitmap(released, x , y , NULL );
        al_flip_display();

    }

person Sam379    schedule 22.06.2013    source источник


Ответы (1)


Вы никогда не проверяете новое событие внутри цикла while (events.type!=ALLEGRO_EVENT_MOUSE_BUTTON_UP), и значение events.type никогда не может измениться.

Ваша программа уже работает в цикле (while(loop){), нет необходимости создавать еще один. Вы должны создать новую переменную, которая зависит от состояния ALLEGRO_EVENT_MOUSE_BUTTON_UP и изменяет положение вашей мыши и т.д...

Что-то вроде этого: (псевдокод!)

    while(loop){
    al_clear_to_color(al_map_rgb(0,0,0));
    ALLEGRO_EVENT events;

    _Bool change = false ;

    al_wait_for_event(event_queue, &events);
    if(events.type == ALLEGRO_EVENT_DISPLAY_CLOSE){
        loop=false;
    }
    if(events.type == ALLEGRO_EVENT_MOUSE_AXES ){
        x=events.mouse.x;
        y=events.mouse.y;
        buffer = released;
    }
    if( events.type==ALLEGRO_EVENT_MOUSE_BUTTON_DOWN)
        change = true ;
     if( events.type==ALLEGRO_EVENT_MOUSE_BUTTON_UP)
        change = false ;


    if( change )
        al_draw_bitmap(pressed, x , y , NULL );
    else
        al_draw_bitmap(released, x , y , NULL );

    al_clear_to_color(al_map_rgb( 0 , 0 , 0));
    al_flip_display();

}
person Community    schedule 22.06.2013
comment
Я пробовал этот метод, но проблема в том, что он показывает изображение нажатого курсора только на секунду, а когда я меняю положение мыши, не отпуская кнопку, он снова показывает отпущенное изображение... - person Sam379; 22.06.2013
comment
@Sam379 Sam379 Мой код - это не РЕШЕНИЕ, а пример того, как более правильно структурировать ваши события. В этом случае вы должны сделать переменную change static. - person ; 22.06.2013