调用睡眠时NCURSES键盘输入

时间:2017-01-15 00:15:05

标签: c++ input sleep nonblocking ncurses

我尝试使用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的变化应用于当前位置。

1 个答案:

答案 0 :(得分:0)

您可以在flushinp上每次通话后致电getch,以忽略提前输入。

相关问题