我尝试使用ncurses来制作游戏。我设置它以便角色通过箭头键输入移动,但是如果我按住箭头键一段时间然后松开,角色会在停止前继续移动一段时间。
这些是我的初始化:
initscr();
start_color();
cbreak();
noecho();
nodelay(stdscr,TRUE);
keypad(stdscr, TRUE);
这是我的主要循环:
while(1) {
...
if (key == (char)27) {
break;
}
else if (key == KEY_DOWN) {
key = 0;
player->advance(0, 1);
}
else if (key == KEY_UP) {
key = 0;
player->advance(0, -1);
}
else if (key == KEY_LEFT) {
key = 0;
player->advance(-1, 0);
}
else if (key == KEY_RIGHT) {
key = 0;
player->advance(1, 0);
}
else {
key = getch();
}
std::this_thread::sleep_for(std::chrono::milliseconds {1000/30});
}
我正在使用sleep_for,因为我注意到如果我使用超时,那么如果我按了一个键,那么framrate就会改变。使用sleep_for创建一致的帧速率,但输入是某种方式"粘性"正如我解释的那样我需要以某种方式解决这个问题。使用超时获得一致的framrate,或者" un-stick"使用sleep_for时的输入。
player-> advance(int,int)将玩家向指定方向移动一步。方向指定为x的变化,y的变化应用于当前位置。
答案 0 :(得分:0)
您可以在flushinp
上每次通话后致电getch
,以忽略提前输入。