2014-10-07 42 views
0

在下面的代碼塊中,我試圖爲每次按鍵移動一次矩形,但矩形移動只要按住一個鍵。Allegro 5檢測長鍵按幾次按鍵

ALLEGRO_EVENT ev; 

    while(!done) 
    { 
     al_wait_for_event(event_queue, &ev); 

     if(ev.type == ALLEGRO_EVENT_KEY_DOWN) 
     { 
      switch(ev.keyboard.keycode) 
      { 
       case ALLEGRO_KEY_UP: 
        pos_y -= 10; 
        break; 
       case ALLEGRO_KEY_DOWN: 
        pos_y += 10; 
        break; 
       case ALLEGRO_KEY_RIGHT: 
        pos_x += 10; 
        break; 
       case ALLEGRO_KEY_LEFT: 
        pos_x -= 10; 
        break; 
      } 
     } 
     else if(ev.type == ALLEGRO_EVENT_KEY_UP) 
     { 
      if(ev.keyboard.keycode == ALLEGRO_KEY_ESCAPE) 
       done = true; 
     } 

     al_draw_filled_rectangle(pos_x, pos_y, pos_x + 30, pos_y + 30, al_map_rgb(255,0,255)); 
     al_flip_display(); 
     al_clear_to_color(al_map_rgb(0,0,0)); 
    } 

而且我注意到,al_wait_for_event是不是在按住一個關鍵的情況下等待新的事件,但實際上是在製造ALLEGRO_EVENT_KEY_CHAR類型的事件。雖然這不應該造成任何問題,但我想更多地瞭解它。

此外,上述代碼取自教程。它在那裏工作得很好。

+0

本教程是否碰巧調用了'void set_keyboard_rate(int delay,int repeat);'將延遲和重複設置爲零?參考:[鍵盤例程](http://alleg.sourceforge.net/stabledocs/en/alleg006.html)。 – 2014-10-07 10:12:03

+0

不,這裏是整個代碼的網址 - http://fixbyproximity.com/public_files/TextInput1.cpp – SaiSrini 2014-10-07 11:13:44

+0

我相信'set_keyboard_rate'不在5.0/5.1 API中 - 這取決於用戶設置重複率通過他們的系統。 – rcorre 2014-10-07 11:13:55

回答

0

要確保您的應用程序不會應用按鍵按鍵每次Key_Down事件定義一個布爾值,將其初始化爲false。將所有Key_Down事件置於If語句中,只有當Boolean == false且在其塊中立即設置Boolean = true時,纔會觸發事件,然後是每個事件只需要事件一次的事件。 然後,在相應的Key_Up事件集 布爾=假,你應該是金。

我還沒有測試過這個功能,但它應該可以工作,並且它可以幫助您將應用程序與任何客戶端計算機進行比較,無論他們的設備上是否有時髦的按鍵設置。