Witam w trzecim tutorialu,
w tej części opisze dwie sprawy, którymi na pewno jesteście zainteresowani :
wyświetlanie obrazków na ekranie oraz ruszanie nimi (w skrócie zalążki ruchu postaci w grze)
Do roboty….
Po pierwsze będzie nam potrzebny szablon przygotowany w poprzedniej części „Omega – Wyświetlanie tekstu (szablon)”.
Do szablonu dokładamy trzy komponenty (z zakładki Omega, oczywiście:)
Te komponenty to:
OmegaImageList:
– Name : Omil
– OmegaScreen : Omsc
OmegaSprite:
– Name : Omspr
OmegaInput:
– Name : Omin
Mając już te komponenty na formie możemy przystąpić do dalszej części.
Do Omil (OmegaImageList) dodajemy dwie pozycje i przyporządkowujemy im jakieś małe obrazki z dysku twardego. Mam nadzieje, że każdy to potrafi;) Przy dodawaniu obrazków do listy, zakładamy że na pozycji o indeksie 1 jest obrazek do wyświetlenia, a o indeksie 0 – ten którym chcemy poruszać 😉
Wyświetlanie obrazków jest analogiczne do wyświetlania tekstu. Dlaczego?? Ponieważ musimy rozpocząć i zakończyć rysowanie podobnie jak było przy tekście.
1 2 3 4 5 6 7 |
omil.BeginDraw; // rozpoczęcie rysowania obrazków omil.ImageList.Items[1].Draw(20,20,1); // wyświetlenie obrazka omil.ImageList.Items[1].Draw(50,50,1); // wyświetlenie obrazka po raz drugi omil.EndDraw; // zakończenie rysowania obrazków |
Taki fragment kodu wstawiamy oczywiście do zdarzenia OnTimer dla naszego Timera czyli Omti 🙂 Kompilujemy i widzimy w przy lewym górnym rogu wyświetlony podwójnie obrazek o indexie 1.
Teraz czas na coś ciekawszego (przynajmniej dla mnie, nareszcie coś zacznie się ruszać na ekranie).
Potrzebne do tego będzie zdeklarowanie nowej klasy, którą ja nazwałem TGracz (to na przyszłość:)
1 2 3 4 5 6 7 8 9 |
TGracz = class(TSprite) // klasa TGracz opiera sie na klasie TSprite public procedure tworz_gracza; //wiadomoJ tworzenie garacza procedure Move(const MoveCount: Single); override; // procedura klasowa odpowiedzialna za ruch end; |
Musimy dodać także zmienną korzystającą z tej klasy.
1 2 3 |
var Gracz : TGracz; |
No dobra, mamy gotowy szkielet klasy TGracz teraz dodajmy do tego trochę ciała (czytaj kodu:)
Pierwsza na celowniku jest procedura tworząca naszego gracza, która wygląda tak:
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 |
procedure TGracz.tworz_gracza; begin // tworzymy nowy obiekt, który jest Spritem czyli obiektem dynamicznym Gracz := TGracz.Create(Form1.Omspr); Gracz.Width := 145; // szerokość naszego gracza… Gracz.Height := 116; // Gracz teraz jego wysokość Gracz.X := Form1.Omsc.Width - Gracz.Width ; // określamy jego pozycje początkową… Gracz.Y := Form1.Omsc.Height - Gracz.Height ; // na ekranie // przypisujemy obrazek z listy jako jego widok Gracz.Image := Form1.Omil.ImageList.Items[0]; // teraz coś na przyszłość Gracz.DoCollision := True; // czy obiekt ma wchodzić w kolizje TRUE (czyli tak) Gracz.DoPixelCheck := True; // dokładne sprawdzanie przy ruchu i kolizji TRUE (jak wyżejJ end; |
Do wydarzenia Formy FormCreate dodajemy odwołanie do procedurki tworzącej gracza:
1 |
gracz.tworz_gracza; |
A do zdarzenia OnTimer naszego zegarka polecenie rysowania gracza:
1 |
gracz.Draw; |
No dobra teraz kompilujemy projekt w takiej postaci. Na ekranie powinien „pokazać” się teraz nasz gracz w prawym dolnym rogu. To połowa sukcesu.
Aby sukces odnieś w pełni sprawimy zaraz, że nasz gracz zacznie się poruszać.
Do tego będziemy potrzebować właśnie wcześniej dodanego na formę komponentu OmegaInput. Jak większość komponentów tej paczki musimy najpierw zainicjować go przy tworzeniu naszej formatki (w zdarzeniu FormCreate) poleceniem:
1 |
omin.Initialize; |
Przed napisaniem procedury, w której zdefiniujemy jak ma się poruszać gracz oraz na jakie klawisze ma reagować do zdarzenia OnTimer (dla Omti) wstawmy odwołanie do funkcji sprawdzającej stan kontrolerów gier (klawiatura, mysz, dżojstik).
1 |
omin.Update; |
No nareszcie jesteśmy gotowi na to ostatnie. Do boju… Oto kod całej procedury TGracz.Move (const MoveCount: Single) dla 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 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
if oisRight in Form1.Omin.Keyboard.States then begin X := X + 2; if X + Width > Form1.Omsc.Width then X := Form1.Omsc.Width - Width; end; if oisLeft in Form1.Omin.Keyboard.States then begin X := X - 2; if X < 0 then X := 0; end; if oisUp in Form1.Omin.Keyboard.States then begin Y := Y - 2; if Y < 0 then Y := 0; end; if oisDown in Form1.Omin.Keyboard.States then begin Y := Y + 2; if Y + Height > Form1.Omsc.Height then Y := Form1.Omsc.Height - Height; end; |
Sprawa jest chyba prosta. To znaczy:
-
- Sprawdzamy czy jakiś klawisz nie został naciśniety (Omin.Keyboard.States)
-
- Czy naciśnięty klawisz to ten na który oczekujemy (np.: oisUp, oisDown)
-
- Jeśli to oczekiwany przycisk jest wciśnięty to wykonuj operacje przesunięcia
(np.: Y := Y + 2)
- Jeśli to oczekiwany przycisk jest wciśnięty to wykonuj operacje przesunięcia
Na zakończenie bardzo ważna rzecz bez której nic nie będzie się poruszało. Do zdarzenia OnTimer dla Omti musimy dodać procedurę, która będzie pozwalała się ruszać wszystkim Spritą (w tym także naszemu graczowi):
1 |
omspr.Move(0); |
PS.: Na początek wydarzenia OnTimer dla Omti, możemy dla bezpieczeństwa dodać taką linijkę kodu:
1 2 3 |
if not omsc.CanDraw then Exit; |
To jest proste sprawdzenie czy można rysować po ekranie. Jeśli nie to aplikacja się wyłaczy. Jeśli tak to zaczyna się rysowanie.
Do zobaczenia w następnym arcie, w którym……
STRZELANIE oraz WROGOWIE (zabijasz wroga dostajesz punkty)
Autor: Goofyx