Witam, tym razem zajmniemy się czymś bardziej złożonym, a dokładniej napiszemy grę przygodową o budowie zbliżonej do gry Mario. Nasze engine będzie uniwersalne i będzie je można wykorzystać w wielu projektach.

Nie jest ono przeznaczone tylko dla PowerDraw, aby ruszyło np. na DelphiX wystarczy zmienić jedno polecenie i grafiki przenieść do plików dxg.

1.Struktura mapy »
2.Struktura gry »
3.Struktura postaci »
4.Wykorzystanie struktur »

1. .: Struktura mapy :. 

Zapewne grając w Mario zauważyliście, że grafika całej gry składa się z kwadratowych grafik. Dzięki temu jedna runda może zajmować mniej niż 1 KB. W pliku umieszczamy jedynie tablicę z wartościami. Oto grafiki wykorzystane w naszej grze:

Po złożeniu:

rys. 1

Teraz nadszedł czas zadeklarować naszą planszę. Aby mieć porządek w grze utwórzmy nowy Unit i nazwijmy go zmienne.pas. Powinien on wyglądać mniej więcej tak:

Obiekt Tplik zawiera tablicę Plansza, która stanowi naszą mapę. Jak widać ma ona dwie zmienne. Mapa_w i Mapa_h określa nam ilość kwadratowych grafik przypadających na długość i szerokość mapy. W naszym przypadku każda kwadrat ma rozmiar 50×50. Co przy rozdzielczości 800×600 daje nam mapę długości 4 ekranów i szerokości 400px :

rys. 2

Znamy już budowę mapy. Czas przejść do następnej części.

2. .: Struktura gry :. 

Tworzymy nowy unit plik TGra.pas, w którym będziemy zapisywać wszystko co dotyczy tej struktury. Przedstawia się ona następująco :

Jak widzimy budowa nie jest wcale tak skomplikowana. Przejdźmy teraz do opisu każdej procedury. Zacznijmy do procedure Tworz; . Ustawiamy na początku pozycję startową mapy na 1 ( Mapa_X := 1 ). W dalszej części otwieramy i tworzymy potrzebne grafiki. Wygląda ona następująco:

Kolejną procedurą również bardzo prostą jest procedure OtworzPlansze(Nazwa : String);. Dodatkowego opisu chyba nie trzeba :

Podążamy dalej i trafiamy na procedure Rysuj;. Wykonuje ona dwie inne procedury odpowiedzialne za rysowanie. Jej istnienie pozwala na utrzymanie porządku w kodzie. Wszystko co ma coś rysować umieszczamy tutaj. A wygląda ona następująco :

No i następna procedure RysujPlansze. Jak sama nazwa mówi, jest ona odpowiedzialna za narysowanie naszej planszy według tablicy. Użyliśmy tutaj pętli for, która przesuwając się o jedno pole w poziomie rysuje 8 grafik w pionie. Przesuwa się od mapa_X, która jest pierwszą klatką do mapa_X+16, która stanowi ostatnią. Dlaczego 16 ? Otóż ekran ma długość 800, a klatka 50, więc 800 : 50 = 16. Przy pozycji Y dodajemy 100 aby plansza nie była rysowana od samej góry, tylko tak jak na rysunku numer 2.

Teraz zajmiemy się procedurami odpowiedzialnymi za przesuwanie mapy. Nie będę się rozpisywał. Pierwsza uruchamia przesuwanie i nadaje kierunek, który wcześniej ustawił gracz( ale to później), zaś druga wedle kierunku przesuwa mapę w lewo lub w prawo, zmniejszając lub zwiększając wartość zmiennej startowej rysowania Mapa_X. Jeśli ktoś ma ochotę może przekształcić tę procedurę, aby mapa się płynnie przesuwała, ale ja dla łatwego zrozumienia uprościłem to.

Następna procedura jest odpowiedzialna za rysowanie postaci w grze, ponieważ w naszym kodzie w tej części tutorialu znajduje się tylko jedna postać, to procedura jest bardzo prosta:

Została nam jeszcze tylko jedna procedura. Jaki jest sens jej tworzenia ? A to taki, że aby grę przenieść na DelphiX wystarczy w niej zamienić PD.RenderEffect na np. DXDraw.Draw…. Oczywiście, trzeba jeszcze przepakować grafikę z plików vtd na dxg i zadeklarować ją w grze, ale to chyba nie stanowi żadnego problemu.

3. .: Struktura postaci :. 

Podobnie jak przy głównej strukturze, dla tej tworzymy oddzielny plik np. plik TGracz.pas. A oto ona:

Przejdźmy do opisywania procedur. Jako pierwszą weźmiemy procedure Tworz;. Na początku otwieramy grafikę. W naszym przypadku jest to tylko rysunek postaci odwróconej w lewo i w prawo. Oczywiście można to rozbudować przypisując osobne grafiki dla skoku, strzelania, itp.

Zmienna Pozycja określa nam aktualną pozycję postaci na ekranie. Jako początkową pozycję wybrałem X= 200 a Y = 120. Oczywiście można je zmienić według uznania.

Zmienna maxSkok określa nam maksymalną wysokość o jaką może się przemieścić jednostka podczas skoku.

Skok – aktualna wartość skoku, ponieważ na początku postać się nie porusza, ustawiamy wartość na 0.

Predkosc – określa prędkość poruszania się postaci. Domyślnie ustawiłem 1. Później zrobimy, że postać zwiększy szybkość po wciśnięciu Shift, co da nam efekt biegania.

KierunekX, KierunekX_old – kierunek, w który odwrócona będzie jednostka podczas uruchomienia gry

Przechodzimy dalej, teraz zajmiemy się procedurą Rysuj. Rysuje ona nam postać odwróconą w kierunku zależnym o zmiennej KierunekX_old.

Kolejna opisywana procedura jest odpowiedzialna za to, co ma się dziać z naszą postacią niezależnie od nas.

Została nam jeszcze ostatnia procedura związana z postacią. Przechwyca ona wciśnięcie klawisza i wykonuje związane z nim polecenie. Poruszanie się w lewo lub prawo zachodzi po sprawdzeniu, czy nie ma na drodze przeszkody. Sprawdzanie następuje poprzez odwołanie się do tablicy z planszą.

Na zakończenie jeszcze raz plik Zmienne.pas. Oto jego cała zawartość:

4. .: Wykorzystanie struktur w grze :. 

Opuszczę opis przygotowania aplikacji do PD, ponieważ omawialiśmy już to wcześniej. Chciałbym się skupić na kilku poleceniach.

To już naprawdę koniec :). Patrząc na powyższe procedury widzimy, że wykonywanie całości gry może się odbywać niemal niezależnie od jednej aplikacji czy komponentu. Ten kod bez problemu można teraz przenieść na DelphiX, DirectX czy OpenGl. w najbliższym czasie pojawi się druga część tego tutorialu. Rozszerzymy wtedy możliwości naszej gry.

Załączniki