为什么libnds中的keysDownRepeat()在多次调用时似乎不起作用?
-
10-07-2019 - |
题
我有这样的代码可以左右,上下移动游戏:
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()
它可以工作(当然没有重复率)。 文档在这里没有帮助。
解决方案
我必须找到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();
}
其他提示
另请注意,您有keysHeld()来识别<!>的键仍然按住<!>“;从前一帧开始,而keysDown()通常用于帮助您识别刚刚按下此帧的<!>键; <!> (即两次调用scanKeys()之间)。 keysDownRepeat()对于想要使用DPAD滚动列表的类似键盘行为的人来说显然很有用:你会反复看到键<!>再次向下看<!>每X帧。 不可否认,keysDownRepeat()的语义定义不明确......
不隶属于 StackOverflow