Мне нужно было найти исходный код libnds, чтобы понять это. Посмотрите на реализацию keysDownRepeat ():
uint32 keysDownRepeat(void) {
uint32 tmp = keysrepeat;
keysrepeat = 0;
return tmp;
}
На самом деле он возвращает ключи, а затем сбрасывает их обратно на 0. Это не было задокументировано. Я решил это, сохранив результат keysDownRepeat()
в переменной и используя переменную для проверки ключей:
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();
}