2008-11-24 37 views
1

我有這樣的代碼移動到左,右,上在我的遊戲玩家,上下:爲什麼在調用多次時,libnds中的keysDownRepeat()似乎不起作用?

keysSetRepeat(20, 5); 

while (lives) { 
    scanKeys(); 

    if (keysDownRepeat() & (KEY_LEFT | KEY_RIGHT | KEY_UP | KEY_DOWN)) { 
     u8 new_x = x; 
     u8 new_y = y; 

     if (keysDownRepeat() & KEY_LEFT) { 
      new_x--; 
     } else if (keysDownRepeat() & KEY_RIGHT) { 
      new_x++; 
     } else if (keysDownRepeat() & KEY_DOWN) { 
      new_y++; 
     } else if (keysDownRepeat() & KEY_UP) { 
      new_y--; 
     } 

     // ... 
    } 

    // ... 

    swiWaitForVBlank(); 
} 

爲什麼沒有被檢測到的鑰匙?如果我用keysDown()代替keysDownRepeat()它可以工作(當然沒有重複率)。 documentation在這裏沒有幫助。

回答

2

我不得不找到libnds源代碼來解決這個問題。看看keysDownRepeat()的實現:

uint32 keysDownRepeat(void) { 
    uint32 tmp = keysrepeat; 

    keysrepeat = 0; 

    return tmp; 
} 

它實際上返回鍵然後重置回爲0,這並沒有記錄在案。

keysSetRepeat(20, 5); 

while (lives) { 
    scanKeys(); 
    u32 keys_down_repeat = keysDownRepeat(); 

    if (keys_down_repeat & (KEY_LEFT | KEY_RIGHT | KEY_UP | KEY_DOWN)) { 
     u8 new_x = x; 
     u8 new_y = y; 

     if (keys_down_repeat & KEY_LEFT) { 
      new_x--; 
     } else if (keys_down_repeat & KEY_RIGHT) { 
      new_x++; 
     } else if (keys_down_repeat & KEY_DOWN) { 
      new_y++; 
     } else if (keys_down_repeat & KEY_UP) { 
      new_y--; 
     } 

     // ... 
    } 

    // ... 

    swiWaitForVBlank(); 
} 
1

還要注意的是,你有keysHeld()從上一幀識別那些「仍然保持」鍵:I,通過keysDownRepeat()並將結果存儲到一個變量,使用變量來檢查鍵解決了這個,而keysDown()通常用於幫助您識別「剛剛按下此框架的鍵」(即,在scanKeys()的兩次調用之間)。 keysDownRepeat()對於需要像DPAD一樣滾動列表的類似鍵盤的行爲的人來說顯然是有用的:您將在每個X幀中反覆看到該鍵「再次下降」。不過,無可否認,keysDownRepeat()的語義定義不明確......