[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

2 wrz 2010

Bronie w grze Cz.2

Jak obiecałem teraz czas na kolizję:
O kolizji napisałem na początku bloga. Teraz bardziej się rozpiszę. Kolizję wziąłem ze strony easykodera:
http://www.easykoder.vot.pl/ 

bool kolizja(int x1,int y1,int s1,int w1,int x2,int y2,int s2,int w2)
{
   if( x2<=x1+s1 && x2>x1 && y2>=y1 && y2<=y1+w1) return true; else
   if( x2<=x1+s1 && x2>x1 && y2+w2>=y1 && y2+w2<=y1+w1) return true; else
   if( x2+s2<=x1+s1 && x2+s2>x1 && y2>=y1 && y2<=y1+w1) return true; else
   if( x2+s2<=x1+s1 && x2+s2>x1 && y2+w2>=y1 && y2+w2<=y1+w1) return true;
   else return false;
};


x1 - współrzędna x lewego górnego rogu naszego prostokąta.
y1 - współrzędna y lewego górnego rogu naszego prostokąta.
w1 - wysokość pierwszego prostokąta.
s1 - szerokość pierwszego prostokąta.
 i analogicznie z x2,y2,w2,s2


Teraz wykorzystujemy kolizję dla 4 rozdzji broni tzn. jeżeli pocisk wystrzelony z jednej z 4 broni trafi wrog'a to wrog znika i pojawia się losowo na pozycji x od 0 do 550 i y=0. Także wtedy zmieniamy pozycję pocisku na y=-40 aby można było go znowu wystrzelić(pisałem o tym wcześniej) jak narazie pociski lasera i miotacza ognia przelatują przez wrog'a :P

if( kolizja(enemy.pozwro_x,enemy.pozwro_y,wrog->w,wrog->w,strzal_bazooka.pozpoc_x,strzal_bazooka.pozpoc_y,pocisk->w,pocisk->w) )
{
   enemy.pozwro_x=rand()%550;
   enemy.pozwro_y=0;
   
strzal_bazooka.pozpoc_y=-40;
}

else if( kolizja(enemy.pozwro_x,enemy.pozwro_y,wrog->w,wrog->w,
strzal_machinegun.pozpoc_x,strzal_machinegun.pozpoc_y,mach_gun->w,mach_gun->w) )
{
   enemy.pozwro_x=rand()%550;
   enemy.pozwro_y=0;
 
 strzal_machinegun.pozpoc_y=-30;
}

else if( kolizja(enemy.pozwro_x,enemy.pozwro_y,wrog->w,wrog->w,
strzal_laser.pozpoc_x,strzal_laser.pozpoc_y,laser->w,laser->w) )
{
   enemy.pozwro_x=rand()%550;
   enemy.pozwro_y=0;

}

else if( kolizja(enemy.pozwro_x,enemy.pozwro_y,wrog->w,wrog->w,
strzal_flamethrower.pozpoc_x,strzal_flamethrower.pozpoc_y,flame->w,flame->w) )
{
   enemy.pozwro_x=rand()%550;
   enemy.pozwro_y=0;
}



Tutaj mamy kolizję pociku wroga z naszym robocikiem, pocisk trafiony w robocika traci nam 3% zyc 

if( kolizja(ludek.pozs_x,ludek.pozs_y,statek->w,statek->h,enemy.pozpocwro_x,enemy.pozpocwro_y,pociskwroga->w,pociskwroga->h) ) 
{
   enemy.pozpocwro_x=enemy.pozwro_x+7;
   enemy.pozpocwro_y=enemy.pozwro_y+25;
   ycia=zycia-3;
}
Tutaj mamy kolizję wroga z naszym robocikiem, zetknięcie wroga z robocikiem traci nam 5% zyc 
 


if( kolizja(ludek.pozs_x,ludek.pozs_y,statek->w,statek->h,enemy.pozwro_x,enemy.pozwro_y,wrog->w,wrog->h) )
{
   enemy.pozwro_x=rand()%550;
   enemy.pozwro_y=0;
   zycia=zycia-5;

}

Szczerze mówiąc te kolizje nie zabardzo mi się podobają :/, ponieważ zaczynam się powoli gubić w main(), za dużo if-ów... ale jeszcze się uczę(obiektowości i allegro naraz) i niedługo mam zamiar upchnąć wszystko do klas żeby to jakoś lepiej wyglądało i działało... Do pobrania kod wraz z plikami potrzebnymi do uruchomienia gry ver.1.03

2 komentarze:

  1. Przejrzałem kod, który umieściłeś na Google Code i radzę Ci jak najszybciej zrobić porządek w pliku klasy.h. Jeśli będziesz z tym długo zwlekał to potem będzie coraz trudniej.

    Każdej klasie powinna odpowiadać para plików NazwaKlasy.h i NazwaKlasy.cpp, dzięki temu łatwiej będzie się odnaleźć.

    Ujednoliciłbym także nazwy w każdej klasie dotyczące położenia, przez co można by było znacznie uprościć wywołania funkcji kolizja. A już całkiem super byłoby skorzystać z dziedziczenia.
    Stworzyć bazową klasę obiektu, który może być wyświetlany, dodać mu właściwości takie jak pozycja_x, pozycja_y, wskaźnik do bitmapy oraz funkcję do wyświetlania na podstawie przekazanego bufora. Klasy Cpostac, Cwrog itd mogłyby po niej dziedziczyć i dodawać nowe funkcjonalności. Wtedy wyświetlenie wszystkich obrazków i wykrywanie kolizji byłoby dziecinnie proste.

    Piszesz, że dopiero uczysz się jak pisać obiektowo, ale jak tylko dowiesz się co nieco o obiektach i dziedziczeniu powinieneś mocno przeorganizować kod. Owocnej nauki, bo programowanie obiektowe znacznie ułatwia życie programisty.

    OdpowiedzUsuń
  2. Dzięki za pomysł :) napewno z niego skorzystam, a szczególnie z przenoszenia metod do pliku .cpp. Szczerze mówiąc niedawno zrobiłem kilka plików nagłówkowych .h ale bez .cpp tzn wszystko upychałem do .h i przez to klasa nie była czytelna. Dzięki za radę.
    Ciekaw jestem czy kod w finalnej wersji projektu chociaż trochę będzie przypominał w wersji początkowej :P

    OdpowiedzUsuń