Zmiana wartości zmiennej wraz z czasem.

0

Witam. Piszę grę i chciałbym aby wynik zwiększał się wraz z czasem. Załóżmy co sekundę wynik zwiększa się o 10. Jak takie coś zrobić? Czytam u funkcjach biblioteki time.h ale jakoś nie mogę nic wymyślić. Na dole wklejam kod, ostrzegam dość długi. Jakby ktoś chciał kompilować to pisany w Allegro 5 ;p

#include <iostream>
#include <cstdio>
#include <allegro5/allegro.h>
#include <allegro5/allegro_primitives.h>
#include <allegro5/allegro_image.h>
#include <allegro5/allegro_font.h>
#include <allegro5/allegro_audio.h>
#include <allegro5/allegro_acodec.h>
#include <allegro5/allegro_ttf.h>
#include <windows.h>

using namespace std;

void CALLBACK TimerProc(HWND hWnd, UINT nMsg, UINT nIDEvent, DWORD dwTime);

bool initAllegro()
{
    if(!al_init())                          //inicjalizacja Allegro
        return false;
    if(!al_install_keyboard())              // instalacja klawiatury
        return false;
    if(!al_init_image_addon())              //inicjalizacja obs³ugi grafiki
        return false;
    if(!al_init_primitives_addon())         // inicjalizacja modu³u rysowania kszta³tów
        return false;
    if(!al_install_audio())                 //instalacja obs³ugi dŸwiêku
        return false;
    if(!al_init_acodec_addon())             //inicjalizacja dŸwiêku
        return false;
    if(!al_reserve_samples(3))              //zarezerwowanie mo¿liwoœci za³adowania 3 sampli
        return false;
    if(!al_init_ttf_addon())            //zarezerwowanie mo¿liwoœci za³adowania 3 sampli
        return false;
    return true;                            //jeœli funkcja dota³a do tego miejsca zwraca prawdê
}

int showOptionsList(ALLEGRO_DISPLAY *window, const char *options[], int nOptions, ALLEGRO_FONT *font, int x, int y, int width)
{
    int selected = 0;                                                                               //aktualnie wybrana pozycja z listy
    ALLEGRO_KEYBOARD_STATE keyboard;                                                                //stan klawiatury
    ALLEGRO_BITMAP *background = al_clone_bitmap(al_get_backbuffer(window));                        //skopiowanie t³¹

    int textHeight = al_get_font_line_height(font);                                                 //pobranie wysokoœci tekstu

    int i;
    double time = al_get_time();                                                                    //pobranie aktualnego czasu

    do
    {
        al_draw_bitmap(background, 0, 0, 0);                                                        //rysowanie t³a
        for(i=0; i<nOptions; ++i)                                                                   //przeœcie przez wszystkie opcje
        {
            if(i == selected)                                                                       //jeœli aktualna opcja jest zaznaczona, rysowane jest pod ni¹ t³o
                al_draw_filled_rectangle(x + 40, y + (textHeight * i), x + width - 40, y +(textHeight * (i + 1)), al_map_rgb(189, 199, 126));
            al_draw_text(font, al_map_rgb(34, 77, 93), (width / 2) + x, y + (textHeight * i), ALLEGRO_ALIGN_CENTER, options[i]);
        }                                                                                           //wypisanie opcji
        al_flip_display();                                                                          //odœwie¿enie obrazu

        al_get_keyboard_state(&keyboard);                                                           //pobranie stanu klawiatury
        if(al_get_time() > time + 0.1)                                                              //jeœli up³ynê³a odpowiedni iloœc czasu od ostatniej zmiany zaznaczenia
        {
            if(al_key_down(&keyboard, ALLEGRO_KEY_DOWN))                                            //jeœli wciœniêto strza³kê w dó³
            {
                selected++;                                                                         //zaznaczenie zmienia siê na pozycjê nastêpn¹
                if(selected == nOptions)                                                            //jeœli zanaczona by³a ostatnia pozycja na liœcie
                    selected = 0;                                                                   //zaznacznie pierwszej pozycji na liœcie
            }
            else if(al_key_down(&keyboard, ALLEGRO_KEY_UP))                                         //jeœli wciœniêto strza³kê do góry
            {
                selected--;                                                                         //zaznaczenie poprzedniej opcji
                if(selected < 0)                                                                    //jeœli zaznaczona by³a pierwsza opcja
                    selected = nOptions - 1;                                                        //zaznaczenie ostatniej opcji menu
            }
            time = al_get_time();
        }
    }
    while(!al_key_down(&keyboard, ALLEGRO_KEY_ENTER));                                              //pêtla powtarzana jest do czasu wciœniêcia ENTER (zatwierdzenia wyboru)
    al_destroy_bitmap(background);                                                                  //zwolnienie pamiêci
    return selected;                                                                                //zwrócenie wybranej opcji
}

int showPauseMenu(ALLEGRO_DISPLAY *window, ALLEGRO_FONT *fontText, ALLEGRO_FONT *fontScore, int score)
{
    int width = al_get_display_width(window);                                                       //szerokoϾ okna
    int height = al_get_display_height(window);                                                     //wysokoϾ okna

    int menuWidth = width / 2;                                                                      //szerokoϾ menu
    int menuHeight = height / 2;                                                                    //wysokoœc menu
    int menuPositionX = width / 4;                                                                  //pozycja X menu
    int menuPositionY = height / 4;                                                                 //pozycja Y menu

    ALLEGRO_BITMAP *background = al_clone_bitmap(al_get_backbuffer(window));                        //zapisanie obrazu przedstawiaj¹cego aktualny wygl¹d okna

    int i;
    for(i=0; i<=menuHeight; ++i)                                                                    //pêtla rozwijaj¹ca menu
    {
        al_draw_bitmap(background, 0, 0, 0);                                                        //rysowanie t³a
        al_draw_filled_rounded_rectangle(menuPositionX, menuPositionY, menuPositionX + menuWidth, menuPositionY + i, 20, 20, al_map_rgba(140, 255, 200, 100));
        //rysowanie t³a menu
        al_flip_display();                                                                          //odœwie¿enie obrazu
    }

    char textScore[10];                                                                             //tekst zawieraj¹cy informacjê o wyniku gracza
    //tekst zawieraj¹cy informacjê o aktualnym poziomie
    sprintf(textScore, "%d", score);


    int textHeight = al_get_font_line_height(fontText);                                             //pobranie wysokoœci tekstu
    //----Wypisanie tektu w menu:
    al_draw_text(fontText, al_map_rgb(34, 77, 93), width / 2, 10 + menuPositionY, ALLEGRO_ALIGN_CENTER, "PAUZA");
    al_draw_text(fontText, al_map_rgb(34, 77, 93), menuPositionX + 10, 10 + menuPositionY + textHeight, ALLEGRO_ALIGN_LEFT, "Aktualny wynik:");
    al_draw_text(fontScore, al_map_rgb(34, 77, 93), menuPositionX + menuWidth - 10, 10 + menuPositionY + textHeight, ALLEGRO_ALIGN_RIGHT, textScore);

    al_flip_display();                                                                              //odœwie¿enie obrazu

    int result;                                                                                     //zmienna przechowuj¹ca wybran¹ przez u¿ytkownika opcjê menu
    const char *options[3];                                                                         //tablica z opcjami do wyœwietlenia
    options[0] = "Kontynuuj";                                                                       //zapisanie opcji do tablicy
    options[1] = "Restart";
    options[2] = "Zamknij";
    result = showOptionsList(window, options, 3, fontText, menuPositionX, (menuPositionY + menuHeight) - 10 - (3 * textHeight), menuWidth);
    //pobranie wyboru gracza

    for(i=menuHeight; i>30; --i)                                                                    //pêtla zwijaj¹ca menu
    {
        al_draw_bitmap(background, 0, 0, 0);                                                        //wyœwietlenie t³a
        al_draw_filled_rounded_rectangle(menuPositionX, menuPositionY, menuPositionX + menuWidth, menuPositionY + i, 20, 20, al_map_rgba(140, 255, 200, 100));
        //wyœwietlenie t³a menu
        al_flip_display();                                                                          //odœwie¿enie obrazu
    }

    al_destroy_bitmap(background);                                                                  //zwolnienie pamiêci bitmapy
    return result;                                                                                  //zwrócenie wyboru gracza
}

int showNewGameMenu(ALLEGRO_DISPLAY *window,ALLEGRO_FONT *fontText, ALLEGRO_FONT *fontScore,int score)
{
    int width = al_get_display_width(window);                                                       //szerokoœc ekranu
    int height = al_get_display_height(window);                                                     //wysokoϾ ekranu

    int menuWidth = width / 2;                                                                      //szerokoϾ menu
    int menuHeight = height / 2;                                                                    //wysokoϾ menu
    int menuPositionX = width / 4;                                                                  //pozycja X menu
    int menuPositionY = height / 4;                                                                 //pozycja Y menu

    ALLEGRO_BITMAP *background = al_clone_bitmap(al_get_backbuffer(window));                        //aktualna zawartoϾ okna

    int i;
    for(i=0; i<=menuHeight; ++i)                                                                    //pêtla roziwjaj¹ca menu
    {
        al_draw_bitmap(background, 0, 0, 0);
        al_draw_filled_rounded_rectangle(menuPositionX, menuPositionY, menuPositionX + menuWidth, menuPositionY + i, 20, 20, al_map_rgba(140, 255, 200, 100));
        al_flip_display();
    }

    char textScore[10];                                                                             //aktualny wynik
    //aktualny poziom
    sprintf(textScore, "%d", score);

    int textHeight = al_get_font_line_height(fontText);                                             //wysokoϾ tekstu
    //---wypisanie tekstu manu:
    al_draw_text(fontText, al_map_rgb(34, 77, 93), width / 2, 10 + menuPositionY, ALLEGRO_ALIGN_CENTER, "KONIEC GRY");
    al_draw_text(fontText, al_map_rgb(34, 77, 93), menuPositionX + 10, 10 + menuPositionY + textHeight, ALLEGRO_ALIGN_LEFT, "Wynik:");
    al_draw_text(fontScore, al_map_rgb(34, 77, 93), menuPositionX + menuWidth - 10, 10 + menuPositionY + textHeight, ALLEGRO_ALIGN_RIGHT, textScore);
    al_flip_display();                                                                              //odœwie¿enie obrazu

    int result;
    const char *options[2];                                                                         //lista opcji
    options[0] = "Nowa gra";
    options[1] = "Zamknij";
    result = showOptionsList(window, options, 2, fontText, menuPositionX, (menuPositionY + menuHeight) - 10 - (2 * textHeight), menuWidth);
    //pobranie wyboru u¿ytkownika

    for(i=menuHeight; i>30; --i)                                                                    //pêtla zwijaj¹ca menu
    {
        al_draw_bitmap(background, 0, 0, 0);
        al_draw_filled_rounded_rectangle(menuPositionX, menuPositionY, menuPositionX + menuWidth, menuPositionY + i, 20, 20, al_map_rgba(140, 255, 200, 100));
        al_flip_display();
    }

    al_destroy_bitmap(background);                                                                  //zwolnienie pamiêci
    return result;
}

void drawScoreBoard(int score, ALLEGRO_FONT *fontText, ALLEGRO_FONT *fontScore)
{
    char textScore[10];                                                                                 //wynik gracza
    sprintf(textScore, "%d", score);


    al_draw_filled_rounded_rectangle(562, 42, 782, 257, 20, 20, al_map_rgba(145, 145, 119, 255));
    al_draw_filled_rounded_rectangle(560, 40, 780, 255, 20, 20, al_map_rgba(189, 199, 126, 255));

    al_draw_text(fontText, al_map_rgb(34, 77, 93), 570, 60, ALLEGRO_ALIGN_LEFT, "Wynik:");
    al_draw_text(fontScore, al_map_rgb(34, 77, 93), 770, 60, ALLEGRO_ALIGN_RIGHT, textScore);
}

int main (void)
{
    if(!initAllegro())                                          //sprawdzenie czy inicjalizacja siê powiod³a
        return -1;

    ALLEGRO_DISPLAY *mainWindow = al_create_display(800, 580);  //stworzenie okna programu
    al_set_window_title(mainWindow, "Samochody");                   //ustawienie tytu³u okna

    //game(mainWindow);

    ALLEGRO_FONT *fontPoints, *fontText;                                                                //czcionki
    ALLEGRO_BITMAP *postac, *tlo;

    //---wczytywanie potrzebnych zasobów i zakoñczenie funkcji w przypadku niepowodzenia

    fontPoints = al_load_ttf_font("resources/DJB.ttf", 24, 0);
    if(!fontPoints)
        return -1;
    fontText = al_load_ttf_font("resources/cm.ttf", 32, 0);
    if(!fontText)
        return -1;
    postac = al_load_bitmap("resources/postac.png");
    if(!postac)
        return -1;
    tlo = al_load_bitmap("resources/tlo.jpg");
    if(!tlo)
        return -1;

    ALLEGRO_KEYBOARD_STATE keyboard;                                                                    //stan klawiatury

    bool endGame = false;                                                                               //informacja, czy nale¿y zakoñczyæ program
    bool gameOver = false;
    //informacja, czy nale¿y zakoñczyæ aktualn¹ rozgrywkê
    bool restart = false;

    float x;
    float y;
    int wynik;

    while(!endGame)                                                                                     //powtarzane do momentu zakoñczenia programu
    {
        x=375;
        y=520;
        wynik=0;

        while(!gameOver)                                                                                //powtarzane do czasu zakoñczenie aktualnej rozgrywki (b³êdu gracza_
        {
            al_get_keyboard_state(&keyboard);
            al_draw_bitmap(tlo, 0, 0, 0);
            drawScoreBoard(wynik,  fontText, fontPoints);                                                              //rysowanie tablicy wyników

            al_draw_bitmap(postac, x, y, ALLEGRO_FLIP_HORIZONTAL);     
            al_flip_display();
            //odœwie¿enie ekranu

            if (al_key_down(&keyboard, ALLEGRO_KEY_UP) && y > 0)
                y-=0.15;
            if (al_key_down(&keyboard, ALLEGRO_KEY_DOWN) && y < 580 - 55)
                y+=0.15;
            if (al_key_down(&keyboard, ALLEGRO_KEY_LEFT) && x > 0 + 120)
            {
                x-=0.15;
            }

            if (al_key_down(&keyboard, ALLEGRO_KEY_RIGHT) && x < 800 - 170)
            {
                x+=0.15;
            }

            if (x==210)
            {
                gameOver = true; // tu beda warunki zakonczenia
            }

            if(al_key_down(&keyboard, ALLEGRO_KEY_ESCAPE))                                              //jeœli wciœniêto esc
            {
                int decision = showPauseMenu(mainWindow, fontText, fontPoints, wynik);           //wyœwietlenie menu pauzy i pobranie decyzji gracza
                if(decision == 1)                                                                       //jeœli wybrano restart
                {
                    gameOver = true;
                    restart = true;
                }
                else if(decision == 2)                                                                  //jeœli wybrano zakoñczenie gry
                {
                    gameOver = true;
                    endGame = true;
                }
            }
        }

        if(!endGame && !restart)                                                                        //jeœli gracz nie wybra³ opcji zakoñczenia gry, ani restartu
            if(showNewGameMenu(mainWindow, fontText, fontPoints, wynik) == 1)                    //wyœwietlenie menu nowej gry i sprawdzenie czy gracz wybra³ opcjê zakoñczenia gry
                endGame = true;
        gameOver = restart = false;
    }



    al_destroy_display(mainWindow);

    return 0;
}
0

Trochę toto długaśne, skoro już używasz allegro to najlepiej poczytaj o timerach z tej biblioteki: https://wiki.allegro.cc/index.php?title=Allegro_5_Tutorial/Timers. Po co kombinować z timer.h skoro możesz zmieniać wartości cyklicznie wraz z nadejściem komunikatu związanego z upłynięciem czasu np 1 sekundy, dzięki timerowi taki komunikat jest wysyłany co 1 sekunda, wystarczy w pętli odebrać odpowiedni komunikat.

1 użytkowników online, w tym zalogowanych: 0, gości: 1