[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

15 sie 2010

biblioteka allegro i poczatki gry space destroyer

Na początku powinienem opisać biblioteczkę allegro lecz tego nie zrobię, ponieważ jest już kilka kursów i tutoriali.  Oto 2 z nich: http://kursy.ddt.pl/?TutorialId=7   lub http://www.gamedev.pl/tutorials.php
Opowiem o co w tym chodzi...

Z góry przepraszam za chaos jaki panuje w kodzie, ponieważ dopiero zaczynam uczyć się obiektowości i napiszę to jak umiem czyli strukturalnie. W następnym poście obiecuję zrobić porządek i zrobić jakieś klasy i pliki nagłówkowe...
Na początku tworzymy tak jakby "ćwiartkę układu współrzędnych" czyli taki prostokąt u mnie to
set_gfx_mode(GFX_AUTODETECT,600,480,0,0);
czyli 600:480.
Napisałem ćwiartkę, ponieważ utworzona przez Nas bitmapa w której wszystko będzie się działo dzieli się na 600 /480 pikseli, a lewy górny róg ma współrzędne x=0 y=0


0123
1000   ten punkt ma współrzędne: x=2, y=1
2000


Napiszę teraz o poruszaniu się po takim prostokącie czyli wyświetlaniu bitmap
mamy funkcję z biblioteki allegro:
draw_sprite(bufor, statek, statek_x, statek_y);
służy ona do rysowania na ekranie poszczególnych bitmap.
pierwszym argumentem jest bitmapa, na której będziemy wyświetlali nasze "obrazki", drugim "obrazek" który chcemy wyświetlić, trzeci to współrzędna x, czwarty współrzędna y.


Gra będzie działała w pętli  while( !key[KEY_ESC])  czyli dopóki nie naciśniemy escape.
Naszym głównym bohaterem będzie robocik :) Będziemy nim poruszać za pomocą strzałek:
na boki będzie chodził szybciej
if( key[KEY_LEFT]) {statek_x=statek_x-2;
if( key[KEY_RIGHT]) statek_x=statek_x+2;
 a w górę i w dół wolniej
if( key[KEY_UP]) statek_y--;
if( key[KEY_DOWN]) statek_y++;

potrzebne są jakieś ograniczniki aby postać nie wychodziła za bitmapę 600:480. Oto one:
 p.s. ograniczyłem także postaci zasięg poruszania siędo góry...
if(statek_y>410) { statek_y=410; }
if(statek_y<350) { statek_y=350; }
if(statek_x<0) { statek_x=0; }
if(statek_x>550) { statek_x=550; }


 A teraz o animacji...
Aby gra ładniej wyglądała potrzebna jest jakaś animacja czyli ruch postaci. Głupio jest jeździć robocikiem po ekranie, który nie rusza nogami, rekoma...
Na początek dzielimy nasz timer BPS_TO_TIMER(80) na 80 cyki w ciągu sekundy czyli: 80 frame;
 i sprawdzamy za pomocą: warunku if wartosc frame i wyswietlamy jakies poszczególne obrazki na bitmapie u Nas są 3 :
 statek; statek1, statek2

if( frame<20)
{
   draw_sprite(bufor, statek, statek_x, statek_y);   
}


else if( frame>=20 && frame<40)
{
  draw_sprite(bufor, statek1, statek_x, statek_y);  
}


else if( frame>=40 && frame<60)
{
  draw_sprite(bufor, statek2, statek_x, statek_y);
 }


else if( frame>=60 && frame<80)
{
  draw_sprite(bufor, statek1, statek_x, statek_y); 
}

Teraz jak już mamy Naszego robocika to przydało by się żeby strzelał :)
Nasz pocisk ja każdy obiekt musi posiadaćwspółrzędne x i y
int pocisk_x=0, pocisk_y=0;  
strzelać będziemy spacją:

if( key[KEY_SPACE])
{
   if((pocisk_y<0) || (pocisk_y==0) )
   {
     pocisk_x=statek_x+15, pocisk_y=statek_y-15; play_sample(dzwiek,255,10,1000,0);
   }

 
 ustawiamy pozycję początkową pocisku aby robocik nie strzelał z nóg tylko z głowy czyli  
x pocisk_x=statek_x+15 i y pocisk_y=statek_y-15

 aby nasz pocisk leciał to po każdym obiegu pętli musimy odjąć jakąś wartość
pocisk_y=pocisk_y-8; czyli po każdym obiegu pętli nasz pocisk leci do góry o 8 pikseli

zrobiłem także małe ograniczenie aby można było strzelić ponownie pocisk musi wylecieć za planszę lub miećpozycję y==0;
if((pocisk_y<0) || (pocisk_y==0) )

 Jak możemu już strzelać to przydał by się jakiś cel...
Tworzymy wroga i nadajemy mu współrzędne   int posw_x=200, posw_y=0;  i wprawiamy go w ruch czyli po każdym obiegu pętli leci w dół : posw_y++;

jeżeli nie ustrzelimy wroga i spadnie nam za ekran to musi mieć nowe współrzędne wyjaśnienie niżej...
if (posw_y>420) 
{
   posw_x=rand()%550;
   posw_y=0;
}



jak mamy już cel to musimy zrobić jakąśkolizję aby można było w ten cel trafić. Znalazłem u wujka google taką funkcję:


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

i wykorzystujemy ją w taki sposób:
-1argumentem jest pozycja x wroga
 -2argumentem jest pozycja y wroga
-3 argumentem jest "wskażnik do bitmapy" i jej długości pocisk->w
 -4 argumentem jest "wskażnik do bitmapy" i jej wysokości pocisk->h
reszta tak samo tylko mamy wtedy za obiekt pocisk...

 if(kolizja(posw_x, posw_y, pocisk->w, pocisk->h, pocisk_x, pocisk_y, pocisk->w, pocisk->h) == true)
 (jeżeli trafimy we wroga to w jego miejscu zrobiłem animację wybuchu)
 i nadajemy nowe wartości dla wrogra:
posw_x=rand()%550; - aby gra nie była przewidywalna losujemy z przedziału 0-550 liczbę x  współrzędną x
  posw_y=0;

 W grze musi być jeszcze jakaś muzyczka i odtwarzamy ją:
 play_sample(muza, 100,100,1000,1);
 parametry 2 i 3 określają głośność na lewy i prawy głośnik z przedziału 0-255
 4 oznacza prędkość z jaką odgrywany jest plik 1000 to prędkość normalna
i 5 oznacza ile razy ma być odgrywany. Wartość 1 oznacza replay non stop :P, 0 oznacza tylko 1 raz

Jeżeli są jakieś pytania lub jakieś uwagi, sugestie piszcie w komentarzach to wszystko wyjaśnię :)
Do ściągnięcia pełny kod gry(ver. 1.00) wraz z potrzebnymi plikami do uruchomienia gry :)
Oto screen do  (ver. 1.00) 

Brak komentarzy:

Prześlij komentarz