¿Por qué parece que no funciona keysDownRepeat () en libnds cuando se llama varias veces?

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

  •  10-07-2019
  •  | 
  •  

Pregunta

Tengo un código como este para mover al jugador en mi juego hacia la izquierda, derecha, arriba y abajo:

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();
}

¿Por qué no se detectan las claves? Si reemplazo keysDownRepeat () con keysDown () funciona (sin la tasa de repetición, por supuesto). La documentación no es de ayuda aquí.

¿Fue útil?

Solución

Tuve que encontrar el código fuente de libnds para resolver esto. Mire la implementación de keysDownRepeat ():

uint32 keysDownRepeat(void) {
    uint32 tmp = keysrepeat;

    keysrepeat = 0;

    return tmp;
}

Realmente devuelve las claves y luego las restablece nuevamente a 0. Esto no fue documentado. Resolví esto almacenando el resultado de keysDownRepeat () en una variable y usando la variable para verificar las teclas:

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();
}

Otros consejos

Tenga en cuenta también que tiene keysHeld () para identificar las teclas que todavía se mantienen presionadas " del cuadro anterior, mientras que keysDown () está típicamente diseñado para ayudarlo a identificar "teclas que acaban de presionar este cuadro". (es decir, entre dos llamadas de scanKeys ()). keysDownRepeat () es obviamente útil para las personas que desean un comportamiento similar al del teclado para desplazarse por las listas con el DPAD: repetidamente verá la tecla "abajo otra vez". cada cuadro X Sin embargo, la semántica de keysDownRepeat () está mal definida ...

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top