Podczas tworzenia kodu do tego tutoriala nieźle się na stresowałem przez własną głupotę:) przy zabijaniu wrogów, w złym miejscu zdeklarowałem zmienna na podstawie, której ich tworzyłem. Zdeklarowałem ją jako zmienną globalną, zamiast lokalną w konstruktorze. Ale wszystko jest już Oki, więc zabrałem się za napisanie tego tekstu.
Na początek bierzemy kod z poprzedniej lekcji. Piszemy kod klasy dla wroga, u mnie nazywa się ona TWrog.
1 2 3 4 5 6 7 8 9 |
TWrog = class(TSprite) public procedure tworz_wroga; procedure OnCollision(const Sprite: TSprite; const colX, colY: Integer); override; end; |
Jak widzimy TWrog jest klasą pochodną od TSprite. Klasa TWrog posiada dwie procedury. Jedna z nich tworzy nowego wroga (tworz_wroga), a druga odpowiedzialna jest za wydarzenie podczas kolizji z innym obiektem typu Sprite (OnCollission).
Kod procedury tworzącej wroga będzie podobny do tej, która tworzyła gracza.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
procedure TWrog.tworz_wroga; var wrog : TWrog; i : integer; begin for i:=1 to 5 do begin Wrog := TWrog.Create(form1.Omspr); Wrog.Width := form1.Omil.ImageList.Items[2].ImageWidth; Wrog.Height := form1.Omil.ImageList.Items[2].ImageHeight; Wrog.X := (100 * i) + 50; Wrog.Y := 20; Wrog.Image := form1.Omil.ImageList.Items[2]; Wrog.DoCollision := True; Wrog.DoPixelCheck := True; end; end; |
Jak już pisałem wcześniej idea tej procedury jest taka jak dla tworzenia gracza. Jedyny wyjątek to ten, że wrogów tworzymy w pętli (to znaczy, że chcemy mieć kilku wrogów, bo jednym to się nie nacieszymy ).
Może zauważyliście, że w stosunku do poprzedniego artu wprowadziłem małą zmianę jeśli chodzi o ustalanie rozmiarów obiektów. W poprzedniej części rozmiary wpisywałem na „sztywno”, jest to sposób dość nie uniwersalny (wystarczy, że zmienimy rysunek dla np.: gracza i musimy znowu wpisywać rozmiary). Teraz te rozmiary są pobierane automatycznie przez funkcje za to odpowiedzialne. W przypadku wroga:
1 2 3 |
Wrog.Width := form1.Omil.ImageList.Items[2].ImageWidth; Wrog.Height := form1.Omil.ImageList.Items[2].ImageHeight; |
Aby móc tworzyć wroga musimy zdeklarować zmienna globalną typu TWrog (ja nazwałem ją Obcy). Jest nam potrzebna do wywołania procedury tworzącej wrogów.
Przy tej okazji możemy zdefiniować także zmienną „punkty” typu np.: integer – wiadomo do czego 😉
Mając prawie gotowego wroga należy się przygotować na atak, czyli strzelanie.
Definiujemy klasę Kula pochodną oczywiście od TSprite:
1 2 3 4 5 6 7 8 9 |
TKula = class(TSprite) public predkosc : Integer; procedure Move(const MoveCount: Single); override; end; |
Teraz należałoby wykorzystać tą klasę i zacząć jej używać w praktyce. Aby to zrobić musimy w procedurze TGracz.Move zadeklarować zmienną Kula : TKula oraz dopisać taki kod tworzący i rysujący kulę w tej procedurze.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
if oisButton1 in form1.Omin.Keyboard.StatesClicked then begin Kula := TKula.Create(form1.Omspr); Kula.predkosc := -4; Kula.Width := form1.Omil.ImageList.Items[1].ImageWidth; Kula.Height := form1.Omil.ImageList.Items[1].ImageHeight; Kula.X := gracz.X + (gracz.Width div 2) - (kula.Width div 2); Kula.Y := gracz.Y - 16; Kula.Image := form1.Omil.ImageList.Items[1]; Kula.DoCollision := True; Kula.DoPixelCheck := True; end; |
oisButton1 to nazwa spacji w OmegaInput. Pozostałą część chyba nie muszę tłumaczyć. Podobna sprawa jest przy graczu i wrogach.
No dobra w tej chwili jesteśmy wstanie narysować wrogów na ekranie (i co z tego, my chcemy do nich strzelać, zabijać i dostawać punkty 🙂 Do tego jest właśnie potrzebna procedura OnCollission.
Podczas kolizji określamy z jakim Spritem wróg może się zderzyć i co ma się stać.
Chcemy, aby nasz wróg podczas zderzenia z kulą znikał, znikła także kula, która go uderzyła i oczywiście, aby dodały nam się punkty.
To jest kod procedurki kolizji dla wroga:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
procedure TWrog.OnCollision(const Sprite: TSprite; const colX, colY: Integer); begin if Sprite is TKula then // kolizja z wystrzeloną kulą begin Dead; // wróg gienie sprite.Dead; // gienie także kula punkty := punkty + 100; // dostajemy punkty za zabicie wroga end; end; |
Wroga mamy prawie gotowego 🙂
Teraz do procedury FormCreate dodajemy wywołanie procedury tworzącej wroga oraz zerujemy licznik punktów:
1 2 3 |
Obcy.tworz_wroga; // tworzymy wrogów Punkty := 0; // wiadomo |
Teraz zajmiemy się wprowadzaniem zmian w procedurze OnTimer dla Omti.
Dodajemy funkcje odpowiedzialne za obsługę Spritów:
1 2 3 4 5 |
omspr.Collision; // sprawdzanie czy nastąpiła kolizja omspr.Dead; // czy jakiś Sprite nie zginął omspr.Draw; // rysowanie Spritów |
Do szczęścia brakuje nam teraz tylko wyświetlanie punktów przez nas zdobytych. Realizujemy to przez dodanie lini:
1 |
omfo.Print(10, 40, 'Wynik: ' + inttostr (punkty)); |
Między omfo.BeginFont i omfo.EndFont;
To by było chyba na tyle. Mam nadzieje, że niczego nie pominąłem. Jak zwykle dołączam źródło.
Na koniec tego tutoriala mam do Was prośbę, a mianowicie moglibyście jakoś skomentować moje arty. Czy Wam się podobają czy nie?? Co chcielibyście w następnym arcie?? Bardzo by mi to pomogło. Na pewno dostosuje się do waszych komentarzy.
Z góry wielkie dzięki i do zobaczonka ( mam nadzieję, że niedługo 🙂
Autor: Goofyx