即使没有按下按键,如何在屏幕上发生某些事情?

Use*_*754 1 c++ ncurses game-physics

我正在使用Ncurses库在C++中创建Pacman.我能够用我的代码移动吃豆子,但我想移动它,这样吃豆继续移动,即使我不按任何键,当我按下另一个方向键,它改变方向.现在,当我按一个键时,pacman只走了一步.另外,在pacman向那个方向移动之前,我必须按键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();
Run Code Online (Sandbox Code Playgroud)

循环在if条件下向右移动

up = getch();
Run Code Online (Sandbox Code Playgroud)

循环在if条件下向上移动

down = getch();
Run Code Online (Sandbox Code Playgroud)

oop在if条件下向下移动.

Ant*_*igh 5

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

在这么小的应用程序中,您可以使用非常简单的实现,而不是实现一个非常灵活的有限状态机:

enum PlayerState {
    Standing,
    MovingUp,
    MovingRight,
    MovingDown,
    MovingLeft,
    Dead
};
Run Code Online (Sandbox Code Playgroud)

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

switch(state) {
case Standing:
    break;
case MovingUp:
    player.PositionY += 1;
    break;
// ...
}
Run Code Online (Sandbox Code Playgroud)

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

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

你可以看到为什么在一个更大的项目中实现一个更灵活的有限状态机是很重要的,但希望这个例子给你一个易于理解的想法.