Почему keysDownRepeat() в libnds не работает при его многократном вызове?
У меня есть такой код для перемещения игрока в моей игре влево, вправо, вверх и вниз:
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();
}
Почему ключи не обнаруживаются? Если я заменю keysDownRepeat()
с keysDown()
это работает (без частоты повторения, конечно). Документация здесь не поможет.
2 ответа
Я должен был найти исходный код 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();
}
Также обратите внимание, что у вас есть keysHeld () для определения клавиш, которые "все еще удерживаются" из предыдущего кадра, в то время как keysDown () обычно предназначен для того, чтобы помочь вам определить "клавиши, которые только что нажали этот кадр" (то есть между двумя вызовы scanKeys ()). keysDownRepeat(), очевидно, полезен для людей, которым требуется клавиатурное поведение для прокрутки списков с помощью DPAD: вы будете постоянно видеть клавишу "снова" в каждом X-кадре. Правда, семантика keysDownRepeat() плохо определена...