Mając chwilę czasu poczytałem o Allegro GUI i uznałem, że jest trochę zagmatwane i nie ma sensu się tego uczyć. Menu zrobiłem(jeszcze nie dokończone) w Allegro w sprytny sposób... Otóż dzięki tej bibliotece możemy używać także myszy. Pozycje myszy to: mouse_x,mouse_y; mouse_b- oznacza stan myszy tzn zmienna ta przechowuje stan poszczególnego klikniętego przycisku np. lewy przycisk myszy: 1, prawy 2, obydwa naraz to 3 itd...
W grze posłużyłem się tylko przyciskiem lewym, którym będziemy wybierali poszczególną część menu. Obrazować je będą bitmapy wyświetlane na bitmapie startu gry menu : nowa gra, powrót do gry, pomoc i wyjście.
Samo kliknięcie nic nam nie da bez poznania współrzędnych myszy i współrzędnych np. nowa gra
jeżeli mamy już te współrzędne posłużymy się funkcją kolizja. Jeżeli nasz kursor znajduje się w obrębie owej bitmapy i klikniemy lewym przyciskiem myszy to aktywujemy "coś".
Standardowy kursor myszy zastąpiłem innym, ładniejszym :)
Oto funkcja, którą wywołuje się w main()
void gmenu()
{
unscare_mouse();
blit(spacedestroyermenu,bufor,0,0,0,0,spacedestroyermenu->w,spacedestroyermenu->h);
draw_sprite(bufor, nowagra, 200,100);
draw_sprite(bufor, powrotdogry, 200,200);
draw_sprite(bufor, pomoc, 200,300);
draw_sprite(bufor, wyjscie, 200,400);
if ( kolizja(200,200,powrotdogry->w,powrotdogry->h,mouse_x,mouse_y,kursor->w,kursor->h) ) //powrot do gry
{
draw_sprite(bufor, ramka, 191,191); //brązowa ramka, która jest rysowana jeżeli najedziemy myszką na poszczególne pole menu. Taki bajer ;p (aktywowana jest kolizja)
if (mouse_b==1) // lewy przycisk myszy
{
play_sample(klik, 255,255,1000,0); //dzwiek oddajacy klikniecie
gra=1;
}
}
if ( kolizja(200,100,nowagra->w,nowagra->h,mouse_x,mouse_y,kursor->w,kursor->h) ) // nowa gra
{
draw_sprite(bufor, ramka, 191,91);
if (mouse_b==1)
{
play_sample(klik, 255,255,1000,0);
punktacja=0;//nadajemy zmiennym poczatkowe wartosci
zycia=100;
ammo_bazo=100;
ammo_machgun=40;
ammo_laser=0;
ammo_flame=0;
gra=1; //powrot do gry z poczatkowym ustawieniem zmiennych czyli nowa gra :)
}
}
if ( kolizja(200,300,pomoc->w,pomoc->h,mouse_x,mouse_y,kursor->w,kursor->h) ) //pomoc
{
draw_sprite(bufor, ramka, 191,291);
if (mouse_b==1)
{
play_sample(klik, 255,255,1000,0);
}
}
if ( kolizja(200,400,powrotdogry->w,powrotdogry->h,mouse_x,mouse_y,kursor->w,kursor->h) ) //wyjscie
{
draw_sprite(bufor, ramka, 191,391);
if (mouse_b==1)
{
play_sample(klik, 255,255,1000,0);
gra=2; //jeżeli gra=2 to główna pętla gry zostaje zakończona i wychodzimy z gry
}
}
show_mouse(bufor);
}
W main wywołujemy ją:
// cos tam
while(gra!=2)
{
gmenu();
while(gra==1)
{
while( ( speed > 0) && ( zycia>0 && punktacja<992) )
{
//kod gry
}
blit( bufor, screen, 0,0,0,0, 800,600); // w grze wszystko rysujemy na buforze, po pełnym obiegu pętli wyświetlamy na screen
}
blit( bufor, screen, 0,0,0,0, 800,600); //wyświetlamy menu gry
}
oto screen menu: (tło jest tymczasowe dałem tymczasowe aby nie było szarego ekranu)
narazie działa nowa gra, powrót do gry i wyjście. W porownaniu do wersji demo dodane nowe ruchy wgoga v_hard Oczywiście dodaję cały kod i wszystkie pliki potrzebne do uruchomienia gry(ver.1.06)
Uuu Seba, powinieneś dostać nagrodę za pisanie bardzo mało wydajnego kodu :P
OdpowiedzUsuń3 zagnieżdżone pętle while :O Czemu nie zrobiłeś w main tak :
while(coś)
{
swith(gra)
{
i np.
pod case 0 : wyświetlanie menu
pod case 1 : wyświetlanie gry
i w case 1 na samym dole zrobić ifa, że jeśli życia <0 to ustawia gra na 0 , i przy następnym obrocie pętli wyświetli menu (jak się nie mylę, to jest ok 60 obrotów pętli na sekundę ? ) co niweluje użycie goto
pozdro ;)