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;
}