[POBIERZ] kod źródłowy i inne pliki potrzebne do uruchomienia gry  [POBIERZ] 

Zachęcam do komentowania :) Mile widziane sugestie i pytania, na które chętnie odpowiem

31 paź 2010

Menu w grze

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) 

1 komentarz:

  1. Uuu Seba, powinieneś dostać nagrodę za pisanie bardzo mało wydajnego kodu :P

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

    OdpowiedzUsuń