【问题标题】:NCURSES keyboard input while calling sleep调用睡眠时 NCURSES 键盘输入
【发布时间】:2017-01-15 00:15:05
【问题描述】:

我正在尝试使用 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 是因为我注意到如果我使用超时,那么如果我按下一个键,帧速率就会改变。使用 sleep_for 可以创建一致的帧速率,但正如我解释的那样,输入在某种程度上是“粘性的”。我需要以某种方式解决这个问题。要么使用超时获得一致的帧速率,要么在使用 sleep_for 时“取消粘贴”输入。

player->advance(int, int) 将玩家向指定方向移动一步。方向指定为 x 的变化和 y 的变化以应用于当前位置。

【问题讨论】:

  • 请为您使用的语言添加正确的标签。看起来像c++

标签: c++ input sleep nonblocking ncurses


【解决方案1】:

您可以在每次调用 getch 后调用 flushinp,以忽略预先输入。

【讨论】:

    猜你喜欢
    • 2021-05-29
    • 2012-03-01
    • 1970-01-01
    • 2021-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多