代码之家  ›  专栏  ›  技术社区  ›  Paige Ruten

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

  •  1
  • Paige Ruten  · 技术社区  · 15 年前

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

    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 回复  |  直到 14 年前
        1
  •  2
  •   Paige Ruten    15 年前

    我必须找到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();
    }
    
        2
  •  1
  •   PypeBros vinay hunachyal    14 年前

    还请注意,您有keys hold()来标识前一帧中“仍保持按住”的键,而keys down()通常用于帮助您识别“刚刚按下此帧的键”(即,在两次scankey()调用之间)。keysdownrepeat()显然对那些希望使用类似键盘的行为来使用dpad在列表中滚动的人很有用:您将在每个x帧中重复看到“down”键。 诚然,keysdownrepeat()的语义定义不好…

    推荐文章