[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

12 lis 2010

Animacja wybuchu i zmiana GUI

Tak, nie pomyliliście się... to jest blog o grze Space destroyer ;p
Wiem wiem menu, jak i interfejs gry w porównaniu do poprzednich postów, a nawet tego ostatniego diametralnie się zmienił na lepsze. Gra odstraszała(-ła mam nadzieję :p) grafiką juz od jej samego uruchomienia i ukazania się menu. Teraz GUI w grze przeszło rewolucję i ładniej i czytelniej wygląda dzięki mojemu koledze Lopezowi za co serdeczne dzięki :) 
Poprzedniego posta nazwałem "menu- wersja finalna" i niestety wychodzi na to, że jestem niesłowny... Tak bywa przy pracy nad grą, kiedy to 1 element będzie -n razy modyfikowany. Jeżeli ktoś śledzi mojego bloga od początku to wie, ile razy było wszystko zmieniane począwszy na kodzie, a skończywszy na elementach graficznych.
No dobra już pokazuję nowe GUI :)

Główne menu: 

Menu pomoc: 



Wrzucam także screena z nowym, o wiele lepszym interfejsem, wpadającym w klimat tej gry. Screen ukazuje także wybuch czyli moment zestrzelenia wroga. 


Teraz przejdźmy do kodu... Najpierw pokażę funkcję, która wyświetla wybuch

funkcje.h
void animacjawybuchu(int x, int y)
  {  
      if( (frame2>=0) && (frame2<=13) ) 
     {  
          draw_sprite(bufor, wybuch0, x, y); 
     }  
     // frame od 14 do 65
    else if( (frame2>=66) && (frame2<=80) )  
    {
         draw_sprite(bufor, wybuch5, x, y);  
    }
    frame2--;
}
Funkcja przyjmuje 2 parametry-współrzędne x i y i na ich podstawie wyświetla poszczególne bitmapy wybuchu. Poszczególne, bo wybuch złożony jest z 6 bitmap, które są wyświetlane w zależności od wartości frame2. Już tłumaczę po co ta zmienna skoro istnieje frame.
Podczas wywołanie tej funkcji frame może mieć różną wartość np. 35 czyli animacja wybuchu zaczęła się od wybuch3.BMP, a nie od początku czyli  wybuch0.BMP. zmienną frame2 możemy sobie manipulować jak chcemy bo nie ma większych powiązań z grą i: frame2 ustawiane jest na 80 czyli nasz wybuch zostanie wyświetlony w wymiarze 80 klatek(1 sekunda w grze) po czym jego wartość będzie równa 0, bo po każdym obiegu pętli jest dekrementacja.


W pliku wrog.h 
class Cwrog 
{
   //kod... 
    void Cwrog::poruszanie_wroga()
    {
              
//kod...
      animacjawybuchu(x, y); //wywołanie funkcji
      if(zycia<=0)
      {
          punktacja++;  
          play_sample(wybuch, 255,255,1000,0);
//odglos wybuchu
      }

      if( (pozwro_y>430) || (zycia<=0) )
      {
          frame2=80;  
//ustawienie frame na 80
          x=pozwro_x;
//przypisanie x-owi współrzędnej x wroga
          y=pozwro_y; 
//przypisanie y-kowi współrzędnej y wroga
         
zycia=3*mnoznik; //opiszę to niżej
          pozwro_x=rand()%740;
          pozwro_y=-70;
      }

    }
}; 
 

Przy każdej klasie wrogów dopisałem kilka linijek. Przy każdym obiegu pętli jest wywoływana funkcja animacjawybuchu(x, y); ,  jak pamiętamy aby wybuch się wyświetlił to frame2 musi być większe od 0.  Jeżeli zestrzelimy wroga to: frame2 ustawia się na 80 i przypisane zostają x-owi i y-kowi współrzędne zestrzelonego wroga. Te współrzędne przyjmuje funkcja animacjawybuchu(x, y); i na ich podstawie wyświetla w danym miejscu wybuch, aż frame2>0. 
Czemu nie dałem togo do warunku  if(zycia<=0)? dlatego, że brzydko to wygląda jak wróg wychodzi za planszę i momentalnie znika, a tak będzie wybuchał. Oczywiście za to nie dostajemy punktów... Odgłos wybuchu usłyszymy po zestrzeleniu wroga.

Zmodyfikowałem także funkcję wyświetlająca tło w grze, która przyjmuje wskaźnik do bitmapy zawierającej tło. Zrobiłem to, ponieważ w grze będą 3 tła zmieniane naprzemiennie co etap(nowe tło pokazane w screenie z gry).

void Cmenu::wyswietl_tlo(BITMAP *tlo)//owa funkcja
{

}

if(etap%3==0)  //jeżeli reszta z dzielenia wartości zmiennej etap wynosi 0
{
     menu.wyswietl_tlo(tlo);
}

else if(etap%3==1) //jeżeli reszta z dzielenia wartości zmiennej etap wynosi 1
{
     menu.wyswietl_tlo(tlo2);
}

else if(etap%3==2) //jeżeli reszta z dzielenia wartości zmiennej etap wynosi 2
{
     menu.wyswietl_tlo(tlo3);
}
 

Zrobiłem także 20 etapów w grze. W 10-ciu pierwszych wartość mnożnik=1; w następnych mnożnik=2; czyli wartość żyć wrogów zostaje zwiększona dwukrotnie.
Odpowiada za to linijka (zaznaczone na niebiesko plik wrog.h )
np:  zycia=6*mnoznik; 
Grę wrzucę w niedzielę. Wtedy zrobię podsumowanie całej swojej pracy nad projektem :)

Brak komentarzy:

Prześlij komentarz