Magazyn komputerowy PTiKu╢
www.ptik.ivg.pl
#2 - Listopad

Piszemy grΩ - podstawy

Jest wiele metod pisania gier. Pisz▒c prost▒ grΩ nie trzeba siΩ bawiµ w obiekty i enginy ale je┐eli naszym celem jest bardziej z│o┐ony projekt musimy przybraµ inny styl. W│a╢nie engin jest czym╢ co u│atwia prace i zapobiega r≤┐nym wpadkom. Engine jest to w│a╢ciwie system, na kt≤rym opiera siΩ dzia│anie gry. Dzielimy go na mechanizm sprit≤w(lub logiczny jak to wolni), mechanizm mapy i inne mniej istotne rzeczy. W tym artykule znajdziecie informacje jak siΩ zabraµ do pisania enginu. W tek╢cie wystΩpuj▒ fragmenty kodu w jΩzyku Pascal(Delphi). Je┐eli w trakcie czytania stwierdzisz, ┐e nie czaisz o co chodzi to radzΩ przerwaµ i zaczerpn▒µ trochΩ informacji na temat Object Pascala.

Projekt

Pierwsz▒ rzecz▒ jak▒ trzeba zrobiµ jest uzmys│owienie sobie co chcemy tak naprawdΩ napisaµ. Trzeba przybraµ za│o┐enia odno╢nie mapy i postaci w grze. Co i jakie ma mieµ mo┐liwo╢ci. Za│≤┐my, ┐e chcemy napisaµ jak▒╢ prost▒ platform≤wkΩ. Pierwsza sprawa to mapa. Mape mo┐na opisaµ przy pomocy dwuwymiarowej tablicy(np. array of array of byte;). Na razie nie posuwamy siΩ dalej poniewa┐ trzeba ustaliµ kwestie postaci. Trzeba zaplanowaµ odpowiednie klasy np.:
 

TSprite=class
x,y:integer; // po│o┐enie na ekranie
alive:boolean; // czy ┐yje
// Kod procedur na razie sobie darujemy
end;
 

Przyda│ by siΩ jeszcze jaki╢ system zarz▒dzania tymi spritami(wykrywanie kolizji, sprawdzanie czy ┐yj▒, rysowanie itp.). Ta kwestia bΩdzie opisana w dalszej czΩ╢ci artyku│u, poniewa┐ ciΩ┐ko j▒ pokr≤tce wyt│umaczyµ.
Ka┐dy mechanizm powinien a nawet musi znajdowaµ siΩ w osobnym unicie(module) np. mapa.pas, sprites.pas itp. Warto wspomnieµ, ┐e jest co╢ takiego jak komunikacja pomiΩdzy mechanizmami. Najm▒drzejszym rozwi▒zaniem jest ustalenie jakiej╢ hierarchii... sprajty > mapa. Oznacza to, ┐e mechanizm sprajt≤w mo┐e pobieraµ i zapisywaµ dane z mechanizmu mapy. Mapa ma jedynie kontrolΩ nad sob▒.

Mapa

Implementacje proponujΩ zacz▒µ od mapy. Mapa powinna byµ klas▒(k│ania siΩ Object Pascal). Najprostsza deklaracja mo┐e wygl▒daµ tak:

TMapa=Class
Pola:array [1..5,1..50] of byte; // 0- pustka 1- sciana
procedure draw(canvas:TCanvas);
end;

Pomin▒│em wiele rzeczy(np. odczyt z pliku), poniewa┐ nie s▒ one na razie istotne. DziΩki tablicy pola ka┐dy sprajt bΩdzie wiedzia│ czy mo┐e wej╢µ na dane pole. Jako urozmaicenie(w│a╢ciwe niezbΩdnik) mo┐na dodaµ trzeci wymiar tej tablicy.
W jednej przestrzeni bΩd▒ zapisane informacje o polach a w drugiej informacje np. o reprezentuj▒cych je rysunkach( np. nr bitmapki).

Sprajty

Bazuj▒c na tym co ju┐ jest napisane mo┐na wzi▒µ siΩ za mechanizm sprajt≤w. Implementacje zaczynamy od deklaracji klas reprezentuj▒cych dany rodzaj postaci. Wygl▒da to tak, ┐e najpierw deklarujemy jak▒╢ klasΩ podstawow▒(np. TSprite) a p≤╝niej jej pochodne(np. TPlayer(TSprite) i TEnemy(TSprite)). Ka┐da z tych klas ma mieµ jedn▒ istotn▒ metodΩ. Jej dzia│anie polega na wywo│aniu procedur takich jak np. rysowanie, AI itd.(wszystkie procki tzw. cyklowe). Ja j▒ nazywam finalizuj▒ca dan▒ klasΩ. Mo┐e wyja╢niΩ to w inny spos≤b. Za│≤┐my, ┐e podczas ka┐dego cyklu(jakiej╢ pΩtli lub timera) napiszemy:
 

Sprajt.sprawdz_klawisze(klawisze);
Sprajt.move;
Sprajt.rysuj(canvas);

Procedure finalizuj▒ca wywo│a te wszystkie procedury. Teraz mo┐na siΩ zabraµ za mechanizm sprit≤w. Zazwyczaj jest on po prostu klas▒. Uproszczona deklaracja bΩdzie wygl▒da│a tak:
 

TPostac=record
name:string;
case rodzaj: (rEnemy,rPlayer) of
rEnemy:enemy:TEnemy;
rPlayer:player:TPlayer;
end;

TSpriteEngine=class
sprajty:array of TPostac;
procedure sprites; // finalizuje wszystkie postacie z tablicy
procedure add;
procedure delete;
procedure search;
end;


Tak to mniej wiΩcej wygl▒da. Nie przytaczam kodu procedure, gdy┐ zajΩ│o by to zbyt wiele miejsca

Komunikacja

Jak to jest z t▒ wspomnian▒ komunikacj▒? Przede wszystkim chodzi tu oto aby sprajty widzia│y siΩ na mapie. Np. Je┐eli dana postaµ jest kontrolowana przez gracza to wpisuje to tablicy z mapa np. -1 i wszyscy przeciwnicy wiedz▒ kogo maj▒ atakowaµ oraz gdzie on siΩ znajduje. Jest to bardzo proste rozwi▒zanie i bardzo polecam jego u┐ywanie.

Podsumowanie

R≤┐nie bywa z lud╝mi, kt≤rzy pisz▒ gry. Niekt≤rzy porzucaj▒ projekty, gdy┐ brak im wytrwa│o╢ci(np. trafili na jaki╢ problem). WiΩkszo╢µ problemu bierze siΩ z braku koncepcji. Na pocz▒tku zawsze pisze siΩ │atwo, dopiero p≤╝niej zaczynaj▒ siΩ schody. Mam nadzieje, ┐e to nad czym siΩ mΩczy│em przez 1,5h pomo┐e w rozwi▒zaniu problem≤w. Je┐eli macie jakie╢ uwagi lub pytania to walcie ╢mia│o na moj▒ skrzynkΩ.

GREG
warsztat@poczta.fm
http://www.warsztat.px.pl