0

我正在使用 ncurses.h 为游戏构建菜单。在这一部分中,我希望屏幕上出现一个闪烁的文本,并且只有在用户按下任意键时才退出该循环。在 conio.h 中,我使用了这个(不完美):

void start()
{
    int i;

    for (i = 0; i < 10; i++)
    {
        gotoxy(32, 18 - i);
        printf("1024");
        Sleep(200);
        clrscr();
    }

    gotoxy(32, 8);
    printf("1024");
    gotoxy (35, 18);

    while (!kbhit())            

    {
        textcolor(15);          
        gotoxy (15, 15);
        printf("Press any key to continue...");

        if (kbhit() != 0)                                   

        Sleep(1000);
        textcolor(0);           
        gotoxy (15, 15);
        printf("Aperte qualquer tecla para continuar...");

        if (kbhit() != 0)
            break;

        Sleep(500);

        if (kbhit() != 0)
            break;

    }

    textcolor(15);
    fflush(stdin);
    clrscr();

}

在 ncurses.h 中,我正在尝试做同样的事情,但 getch() 似乎在等待用户输入,因此“暂停”执行。

void start()
{
    int i, ch = 0;

    for (i = 0; i < 10; i++)
    {
        attron(COLOR_PAIR(2));
        move(18 - i, 32);
        printw("1024");
        refresh();
        usleep(200 * 1000);
        clear();
        refresh();
    }

    move(18, 35);

    while (1)
    {
        if (getch() != 0)
            break;

        attron(COLOR_PAIR(2));
        move(15, 15);

        printw("Aperte qualquer tecla para continuar...");
        refresh();

        usleep(1000 * 1000);
        clear();
        refresh();
        move(15, 15);
        printw("Aperte qualquer tecla para continuar...");

        usleep(500 * 1000);

    }

    attroff(COLOR_PAIR(2));
    system("clear");

}

解决方案?谢谢!

4

1 回答 1

0

使用 ncurses(任何 curses 实现),您可以通过在初始化期间调用来获得单字符输入cbreak(请参阅Initialization的手册页部分)。

另外,我会使用napms而不是usleep.

由于您的程序正在使用getch,期望只是轮询,您可能希望使用timeoutnodelay忽略getch返回的情况ERR。例如

cbreak();    /* control/C will kill the program */
timeout(10); /* 10 milliseconds is a good compromise */
while (1)
{
    if (getch() == ERR)
        continue;  /* ignore, timeout expired with nothing read */
于 2017-07-22T15:03:48.153 回答