Как приостановить цикл в C / C ++ - PullRequest
3 голосов
/ 04 марта 2012

Я пытаюсь сделать экран для автомобильной игры и заставить экран ждать, пока клавиша не перейдет на следующий экран, дело в том, что с помощью этого кода он слишком быстро меняет цвета.Я уже пробовал 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 ]

1 голос
/ 04 марта 2012

Вместо использования 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());
0 голосов
/ 04 марта 2012

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

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

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

...