Próbuję zrobić ekran do gry samochodowej i sprawić, by ekran czekał na klucz, aby przejść do następnego ekranu, chodzi o to, że tym kodem zbyt szybko zmienia kolory. Próbowałem już delay() i sleep(), które nie działały prawidłowo. Poza tym po naciśnięciu klawisza zamyka się i nie czeka, aż wprowadzę klucz. Chcę tylko, aby tytuł migał między białym a czerwonym, dopóki nie zostanie naciśnięty klawisz, i dowiedz się, dlaczego kończy działanie po naciśnięciu klawisza.

Oto mój kod:

#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;
}
3
Luis Carlos Castillo 4 marzec 2012, 10:04

2 odpowiedzi

Najlepsza odpowiedź

Zamiast używać delay(10), może spróbuj użyć jakiejś zmiennej timera, aby to zrobić. Wypróbuj coś takiego (modyfikacja pętli 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());
1
Alex Z 4 marzec 2012, 10:18

kbhit() zwraca true, jeśli w buforze jest znak, ale nie usuwa znaku przed jego powrotem. Gdy dojdziesz do linii getch(), pierwszy klawisz, który naciśniesz, wyrwie się z pętli while.

Możliwe rozwiązanie: Chociaż jest to trochę dziwaczne, dodanie getch() zaraz po pętli while prawdopodobnie to naprawi.

Czy mogę również zasugerować użycie ncurses zamiast tych bibliotek Borland?

0
howardh 4 marzec 2012, 10:49