Почему не работает keysDownRepeat () в libnds при многократном вызове?

StackOverflow https://stackoverflow.com/questions/313253

  •  10-07-2019
  •  | 
  •  

Вопрос

У меня есть такой код для перемещения игрока в моей игре влево, вправо, вверх и вниз:

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 () , это сработает (конечно, без частоты повторения). документация здесь не поможет.

Это было полезно?

Решение

Мне нужно было найти исходный код 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 () плохо определена ...

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top