我有这样的代码,可以在游戏中左右上下移动玩家:
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在这里帮不上忙。
发布于 2008-11-24 01:46:23
我不得不找到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();
}发布于 2009-12-09 00:12:41
另请注意,您使用keysHeld()来标识上一帧中“仍然按住”的关键点,而keysDown()通常用于帮助您标识“刚刚按下此帧的关键点”(即,在两次scanKeys()调用之间)。keysDownRepeat()显然对那些想要使用DPAD滚动列表的类似键盘行为的人很有用:您将在每个X帧中重复看到“再次向下”键。不过,无可否认,keysDownRepeat()的语义定义很差……
https://stackoverflow.com/questions/313253
复制相似问题