Почему keysDownRepeat () в libnds не работает при его многократном вызове? - PullRequest
1 голос
/ 24 ноября 2008

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

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 ]

2 голосов
/ 24 ноября 2008

Мне нужно было найти исходный код 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();
}
1 голос
/ 08 декабря 2009

Обратите внимание, что у вас есть keysHeld () для идентификации клавиш, которые «все еще удерживаются» из предыдущего кадра, в то время как keysDown () обычно предназначена для того, чтобы помочь вам определить «клавиши, которые только что нажали этот кадр» (то есть между двумя вызовами scanKeys ()). keysDownRepeat (), очевидно, полезен для людей, которым требуется клавиатурное поведение для прокрутки списков с помощью DPAD: вы будете постоянно видеть клавишу «снова» в каждом X-кадре. Правда, семантика keysDownRepeat () плохо определена ...

...