Как приостановить цикл в C/C++

Я пытаюсь сделать экран для автомобильной игры и заставить экран ждать, пока клавиша перейдет на следующий экран, дело в том, что с помощью этого кода он слишком быстро меняет цвета. Я уже пробовала delay() а также sleep() которые не сработали должным образом. Кроме того, после нажатия клавиши он закрывается и не ждет, пока я введу ключ. Я просто хочу, чтобы заголовок мигал между белым и красным до тех пор, пока не нажата клавиша, и узнал, почему она закрывается после нажатия клавиши.

Вот мой код:

#include <dos.h>
#include <graphics.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>

int main(void)
{
    int gdriver = DETECT, gmode, errorcode;
    initgraph(&gdriver, &gmode, "C|\\BORLANDC\\BGI");
    outtextxy(250,280,"POINTER DRIVER 1.0");
    outtextxy(250,290,"LCCM 10070249");
    do
    {
        setcolor(WHITE);
        outtextxy(250,380,"PRESS ANY KEY TO CONTINUE");
        // delay(10); nothing works here :(
        setcolor(RED);
        outtextxy(250,380,"PRESS ANY KEY TO CONTINUE");
    } while(!kbhit());
    cleardevice();
    outtextxy(250,290,"HELLO"); //here it draws mega fast and then exits
    getch();
    closegraph();
    return 0;
}

2 ответа

Решение

Вместо того, чтобы использовать delay(10), возможно, попробуйте использовать какую-то переменную таймера, чтобы сделать это. Попробуйте что-то вроде следующего (модификация вашего do-while петля):

unsigned flashTimer = 0;
unsigned flashInterval = 30; // Change this to vary flash speed
do
{
    if ( flashTimer > flashInterval )
        setcolor(RED);
    else
        setcolor(WHITE);

    outtextxy(250,380,"PRESS ANY KEY TO CONTINUE");

    ++flashTimer;
    if ( flashTimer > flashInterval * 2 )
        flashTimer = 0;

    // Remember to employ any required screen-sync routine here
} while(!kbhit());

kbhit() возвращается true если в буфере есть символ, но он не удаляется до его возврата. Как только вы достигнете getch() В строке требуется первая нажатая клавиша, чтобы выйти из цикла while.

Возможное решение: хотя это немного странно, добавив getch() сразу после вашего цикла while это, вероятно, исправит.

Могу ли я также предложить использовать ncurses вместо этих библиотек Borland?

Другие вопросы по тегам