1

我有这样的代码可以在我的游戏中向左、向右、向上和向下移动玩家:

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()(当然没有重复率)。文档在这里没有帮助。

4

2 回答 2

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();
}
于 2008-11-24T01:46:23.053 回答
1

Note also that you have keysHeld() to identify keys that are "still hold down" from the previous frame, while keysDown() is typically designed to help you identify "keys that have just beeing pressed this frame" (that is, between two calls of scanKeys()). keysDownRepeat() is obviously useful for people that wants keyboard-like behaviour for scrolling through lists with the DPAD: you'll repeatedly see the key "down again" every X frame. Admittedly, though, the semantic of keysDownRepeat() is poorly defined ...

于 2009-12-08T16:12:40.563 回答