为什么libnds中的keysDownRepeat()在多次调用时似乎不起作用?

时间:2008-11-24 01:46:13

标签: nintendo-ds 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()则可行(当然没有重复率)。 documentation在这里没有帮助。

2 个答案:

答案 0 :(得分: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();
}

答案 1 :(得分:1)

另请注意,您有keysHeld()来识别前一帧中“仍然按住”的键,而keysDown()通常用于帮助您识别“刚刚按下此帧的键”(即,两次调用scanKeys()之间。 keysDownRepeat()对于想要使用DPAD滚动列表的类似键盘行为的人来说显然很有用:你会在每个X帧重复看到“再次关闭”键。 不可否认,keysDownRepeat()的语义定义不明确......