[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

23 sie 2010

Interfejs w grze

Kolej na obiecany interfejs...
Napewno pamiętacie grę doom, gdzie głowa głównego bohatera po stracie n-% żyć pokrywała sięcoraz bardzierj krwią... Chcę uzyskać podobny efekt, lecz będzie to niestety "kulawe graficznie" ponieważ, nie jestem grafikiem... W grze po stracie kolejnych 10% żyć robocik będzie zamalowywany coraz bardziej kolorem czerwonym....
tak więc na początek deklarujemy sobie 11 bitmap:


BITMAP *Statek_HP100 = NULL;
BITMAP *Statek_HP90 = NULL;
BITMAP *Statek_HP80 = NULL;
BITMAP *Statek_HP70 = NULL;
BITMAP *Statek_HP60 = NULL;
BITMAP *Statek_HP50 = NULL;
BITMAP *Statek_HP40 = NULL;
BITMAP *Statek_HP30 = NULL; 
BITMAP *Statek_HP20 = NULL;
BITMAP *Statek_HP10 = NULL;
BITMAP *Statek_HP0 = NULL;


I dla Statek_HP100 bitmapa będzie wyglądała tak:


 

dla Statek_HP90



*
*

i w końcu dla Statek_HP0 


W tym celu stworzyłem klasę Cmenu, w której będę umieszczał poszczególne elementy interfejsu gry... Oto ona:


class Cmenu
{
 public:
 int pozstathp_x, pozstathp_y;
 int pozmenu_x, pozmenu_y;
 int pos;
 void wyswietl_obrazki();

 Cmenu::Cmenu()
 {
   pozmenu_x=0;
   pozmenu_y=480;
   pozstathp_x=10;
   pozstathp_y=515;
   pos=0;
 }
};



 
void Cmenu::wyswietl_obrazki() 
{
 
masked_blit( menudolne, bufor,0,0,pozmenu_x,pozmenu_y,menudolne->w, menudolne->h);
 
  textprintf_ex(bufor,font,2,488,makecol(0,200,200),-1,"stanzyc: %d%%",zycia);

 
  masked_blit( Statek_HP100, bufor, 0,0, pozstathp_x,pozstathp_y,Statek_HP100->w, Statek_HP100->h);

   if(czas_odt_muz >161)
   {
      czas_odt_muz=0;
   }

   if( frame>=40)
   {  
     masked_blit( Statek_HP100, bufor, 0,0,

     pozstathp_x,pozstathp_y,Statek_HP100->w,Statek_HP100->h);

     if( (zycia > 80) && (zycia<=90) )
     {
        masked_blit( Statek_HP90,bufor,0,0,

        pozstathp_x,pozstathp_y,Statek_HP100->w, Statek_HP100->h); 
     }

     else if( (zycia > 70) && (zycia<=80) )
     {  
         masked_blit( Statek_HP80, bufor, 0,0, 

         pozstathp_x,pozstathp_y,Statek_HP100->w, Statek_HP100->h);  
     }
/*

i tak dalej az do zycia <=0
*/
   
  else if (zycia <= 0)
     {  
        masked_blit( Statek_HP0, bufor, 0,0,

        pozstathp_x,pozstathp_y,Statek_HP100->w, Statek_HP100->h); 
     }
  }  
}

 


W funkcji wyswietl_obrazki() chodzi o to aby od frame=0 do frame=40 wyswietlało nie zamalowanego robocika, a od frame=41 do frame=80 robocika z zamalowana czescia na czerwony kolor. (Niby miał to wyjść efekt popsutej poszczególnej części ale niestety nie mam talentu i wyszło jak wyszło...) Efekt jest taki: jesli mamy mniej niz 91% zyc czerwone czesci robocika zaczynaja nam migac.

w konstruktorze podałem współrzędne elementów interfejsu gry. Żeby było jasne menu_dolne  ma wymiary 800*120 i w konstruktorze jego pozycja Y to pozmenu_y=480, bo Nasza gra ma rozdzielczość 600...  a menu_dolne wygląda tak:


 różowy kolor w bitmapie oznacza, że w grze będzie niewidoczny...

Skoro napisałem o deklarowaniu bitmap to napiszę jak wczytac taka bitmape do programu, a także o tym samym tylko dla dźwięku...

dla Statek_HP100:
podajemy nazwe wczesniej zadlklarowana czyli Statek_HP100 i za pomocą tej instrukcji w cudzyslowie "" podajemy ścieżkę do pliku

Statek_HP100=load_bmp("BMP/Statek_HP/Statek_HP100.bmp",default_palette); 

musimy także pamiętać aby na końcu programu zwolnić używaną pamięć przez bitmapę instrukcją: 

destroy_bitmap(Statek_HP100); 


Warto w programie dodać taką instrukcję, uchroni nas przed jakimś poważnym błędem, a nawet zawieszeniem systemu. Stanie siętak jeśli po uruchomieniu programu zabraknie takiego pliku o tej nazwie we wskazanym przez Nas katalogu :

  if (!Statek_HP100)
{
   set_gfx_mode(GFX_TEXT,0,0,0,0);
   allegro_message("brak pliku .bmp");
   allegro_exit();
   return 0;
}
 



i to by było na tyle. Teraz kolej na dźwięk deklarujemy go w ten sposob:

SAMPLE *dzwiek = NULL;  

definiujemy w podobny sposób jak bitmapy podając ścieżkę:

dzwiek = load_sample("wybuch.wav"); 


I teraz musimy zatrzymać ten dźwięk instrukcją:

 stop_sample(dzwiek); 


i zwolnić z pamięci:

destroy_sample(dzwiek); 

i analogicznie ja kw bitmapach warto dodać instrukcję:

if (!dzwiek)
{
   set_gfx_mode(GFX_TEXT,0,0,0,0);
   allegro_message("brak pliku .wav");
   allegro_exit();
   return 0;
}
 
 
Aha w klasie Cmenu są jeszcze wyświetlane życia za pomocą funkcji:

textprintf_ex(bufor,font,2,490,makecol(0,200,200),-1,"stan zyc: %d%%", zycia); 

1-arg jest to gdzie wyświetlamy ten napis czylu u nas w buforze
2- czcionka
3 i 4 współrzędne
 makecol(0,200,200) ustalamy kolor w systemie RGB
 i nasz tekst: "stan zyc: %d%%", gdzie %d  używamy z C :p i %% aby wyświetlić % (ponieważ % jest znakiem specjalnym i żeby go wyświetlićmusimy go powtórzyć)
-i na koniec zmienna integer u nas zycia



To by było na tyle. W porównaniu do wersji 1.00 zrezygnowałem z nieefektownego elementu wybuchu, w jakiejś wersji dopracuję i dodam ponownie :).  Do pobrania kod wraz z plikami potrzebnymi do uruchomienia gry ver.1.01
Jeżeli macie pytania, propozycje to piszcie w komentarzach, napewno odpowiem :) 
Gra na tym etapie wygląda następująco:



 

Brak komentarzy:

Prześlij komentarz