2013-06-22 3 views
0

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

 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(); 

    } 

ответ

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(); 

} 
+0

Я попробовал этот метод, но проблема в том, что он отображает только нажатое изображение курсора на секунду, и когда я меняю положение мыши, не отпуская кнопку, он снова отображает снятое изображение ... – Sam379

+0

@ Sam379 Мой код не РЕШИТ, но пример того, как более правильно структурировать ваши события. В этом случае вы должны внести переменную 'change'' static'. –

+0

Хорошо, спасибо вам большое – Sam379