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

Posted

技术标签:

【中文标题】为啥 libnds 中的 keysDownRepeat() 在多次调用时似乎不起作用?【英文标题】:Why doesn't keysDownRepeat() in libnds seem to work when calling it multiple times?为什么 libnds 中的 keysDownRepeat() 在多次调用时似乎不起作用? 【发布时间】:2008-11-24 01:46:12 【问题描述】:

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

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

为什么没有检测到密钥?如果我用keysDown() 替换keysDownRepeat(),它就可以工作(当然,没有重复率)。 documentation 在这里没有帮助。

【问题讨论】:

【参考方案1】:

我必须找到 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】:

还请注意,您有 keysHeld() 来识别从前一帧“仍然按住”的键,而 keysDown() 通常旨在帮助您识别“刚刚被按下的键”(即, 在两次 scanKeys()) 调用之间。 keysDownRepeat() 对于希望使用 DPAD 滚动列表的类似键盘行为的人来说显然很有用:您将在每个 X 帧重复看到键“再次向下”。 诚然,keysDownRepeat() 的语义定义不明确......

【讨论】:

以上是关于为啥 libnds 中的 keysDownRepeat() 在多次调用时似乎不起作用?的主要内容,如果未能解决你的问题,请参考以下文章

将如何绘制到 ds 的子显示,就好像它是一个帧缓冲区一样?

为啥 CAP 定理中的 RDBMS 分区不能容忍,为啥它可用?

为啥火花中的一些音符工作得非常慢?为啥在同一情况下多次执行有不同的执行时间?

为啥 Swift 中的 FFT 与 Python 中的不同?

为啥自定义 SCNGeometry 中的黑色比 SCNSphere 中的浅

为啥 AppDelegate 中的窗口为零