c++ - 即使没有按下任何键,如何在屏幕上显示一些内容?

标签 c++ game-physics ncurses

我正在使用 Ncurses 库在 C++ 中制作 Pacman。我可以用我的代码移动吃 bean ,但我想移动它,这样即使我没有按任何键,吃 bean 也会继续移动,当我按下另一个方向键时,它会改变方向。现在,当我按下一个键时,吃 bean 人只会迈出一步。在吃 bean 朝那个方向移动之前,我还必须按一个键 2 或 3 次。

if (ch==KEY_LEFT)
{
    int b,row,column;
    getyx(stdscr,row,column);
    int h; 
    do    // do-whileloop to move the pacman left until it hits the wall
    {
        column-=1;
        mvprintw(row,column,">");  //print the ">" symbol
        refresh();
        waitf(0.1);      //this pauses the game for 0.1sec
        attron(COLOR_PAIR(1));      
        mvprintw(row,column,">");
        attroff(COLOR_PAIR(1));
        refresh();
        waitf(0.1);
        mvprintw(row,(b),"O");  //showing the open mouth of pacman
        refresh();
        waitf(0.1);
        attron(COLOR_PAIR(1));a
        mvprintw(row,column,"O");
        attroff(COLOR_PAIR(1));
        h = getch();
    }
    while(h == KEY_LEFT);
}

right = getch();

在if条件下循环向右移动

up = getch();

在if条件下循环向上移动

down = getch();

oop 在 if 条件下向下移动。

最佳答案

对此的标准解决方案是 finite-state machine .角色有六种左右可能的状态:站立、向上移动、向右移动、向下移动、向左移动、死亡。按键应该改变角色的状态,而不是直接移动角色。

在如此小的应用程序中,您可以使用非常简单的实现方式,而不是实现极其灵活的有限状态机:

enum PlayerState {
    Standing,
    MovingUp,
    MovingRight,
    MovingDown,
    MovingLeft,
    Dead
};

然后,在您的游戏循环中,您可以添加一个非常简单的状态检查,然后对帧采取适当的操作。

switch(state) {
case Standing:
    break;
case MovingUp:
    player.PositionY += 1;
    break;
// ...
}

最后一步是 Hook 输入,这取决于您检索输入的方法。使用回调,一个例子是:

void KeyDown(Key k) {
    switch(k) {
    case UpArrow:
        if(state != Dead)
            state = MovingUp;
        break;
    case RightArrow:
        if(state != Dead)
            state = MovingRight;
    // ...
    }
}

您会明白为什么在更大的项目中实现更灵活的有限状态机很重要,但希望这个示例能为您提供一个易于理解的想法。

关于c++ - 即使没有按下任何键,如何在屏幕上显示一些内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12568391/

相关文章:

c++ - window : Message-only window appears when I call back from native to managed code

c# - Unity3d 触摸滑动

java - java中的跳球物理,重力

java - 如何在不同的屏幕尺寸上实现相同的物理效果?

c - NCURSES 在 elementryOS 终端中不显示滚动条

c - Ncurses 和调整窗口大小

c++ - 为什么这会产生损坏的输出? (ncurses 菜单)

c++ - "pragma GCC diagnostic ignored"如果在 PCH 中定义就没有作用?

c++ - 井字棋的阶乘数组

c++ - 持有对多重嵌套 std::vector 的引用的正确内容是什么?