Artykuł jest zestawieniem oraz podsumowaniem informacji zawartych w poprzednich lekcjach. Zapraszam do lektury.
1. Na początku utwórz nowy projekt. Umieść na formie komponenty :
Komponent – Proponowana nazwa
DXInput – Ruch
DXSpriteEngine – EngineGry
DXTimer – Czas (Interval 0)
DXDraw – Scena (Align alClient)
DXImageList – ListaGrafiki
Dla wszystkich komponentach w ObjectInspector ustaw DXDraw na Scena.
2. Teraz przejdź do komponentu czas. W ObjectInspector wejdź na zakładkę Events, a następnie kliknij dwa razy w OnTimer. Umieszczamy tam wszystko co ma być wykonywane bez przerwy np. rysowanie obiektów. Dobrze, ujrzałeś pustą procedurę. Wpisz :
1 |
Scena.Flip; // przerysowuje wszystko na ekran |
Przed poleceniem Scena.Flip umieszczamy wszystkie polecenia np. Aby wyświetlił jakiś tekst :
1 2 3 |
Scena.Surface.Fill(clBlack);// czyści ekran Scena.Surface.Canvas.TextOut(20,20, ' www.unit1.pl ' ); //wyświetla tekst Scena.Surface.Canvas.Release; //odświeża canvas |
Polecenie Release służy do odświeżenia sceny, trzeba je umieszczać po zakończeniu korzystania z canvas, w przeciwnym razie komputer się zawiesi ;). Oprócz tekstu można wyświetlić grafikę, jak, to opisałem w tutorialu 5. Po uruchomieniu powinniśmy zobaczyć tekst : www.unit1.pl.
3. Nadszedł czas, aby stworzyć obiekt, którym będziemy poruszać. Najpierw dodajmy grafikę do ListaGrafiki, obojętnie jaki obrazek, ja dodałem narysowane w Paint-cie kółko o rozmiarach 50 x 50, nie zapomnij ustawić w ObjectInspector transparent na True. Obiekt zadeklarujemy po tekście :
1 2 3 4 5 6 7 8 |
type TForm1 = class(TForm) //Oto nasz obiekt : type TObiekt = class(TImageSprite) public procedure DoMove(MoveCount: Integer); override; end; |
Stworzyliśmy Obiekt klasy TImageSprite, przejmujemy polecenie OnMove, które będzie odpowiedzialne za ruch naszego obiektu. Następnie zadeklarujmy nasz obiekt w standardowym var :
1 2 3 4 5 |
var Form1: TForm1; Obiekt : TObiekt; implementation |
Spróbujmy uruchomić nasze coś, musimy ustawić mu wartości początkowe, zrobimy to w OnCreate Form1. W ObiectInspector u góry z listy wybierz Form1, następnie przejdź na zakładkę Events, znajdź OnCreate i kliknij dwa razy, a pojawi Ci się procedura do której zapiszesz :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
procedure TForm1.FormCreate(Sender: TObject); begin Obiekt := TObiekt.Create(EngineGry.Engine); // Obiekt tworzymy jako część EngineGry.Engine, to ono będzie // odpowiedzialne za wyświetlanie grafiki obiektu Obiekt.Image := ListaGrafiki.Items[0]; // Przypisujemy mu pierwszy obrazek z naszej listy Obiekt.Width := ListaGrafiki.Items[0].Width; Obiekt.Height:= ListaGrafiki.Items[0].Height; //Długość i szerokość obiektu ma być taka sama jak rysunku Obiekt.X := 50; Obiekt.Y := 50; //Pozycja startowa end; |
W ten sposób utworzyliśmy obiekt, ale aby mógł się on przesuwać potrzebujemy procedury OnMove. Tworzymy ją po
1 2 3 |
implementation {$R *.dfm} |
A oto jej treść :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
procedure TObiekt.DoMove(MoveCount: Integer); begin Form1.Ruch.Update; If isLeft in Form1.Ruch.States Then X:= X-1; If isRight in Form1.Ruch.States Then X:= X+1; If isUp in Form1.Ruch.States Then Y:= Y-1; If isDown in Form1.Ruch.States Then Y:= Y+1; end; |
Czy wiesz już co wykonuje ta procedura ? Otóż sprawdza, jaki klawisz wybrałeś, jeśli w górę, to pozycję Y zmniejsza o 1, czyli obiekt idzie do góry, jeżeli w dół to obiekt w dół i dalej tak samo. Nie należy zapominać, że przed wykrywaniem kliknięć należy odświeżyć ich rejestrator ( Ruch : TDXInput).
Na zakończenie trzeba wydać polecenia, aby wszystkie obiekty z EngineGry zostały rysowane i wykonały funkcje z OnMove. W tym celu powróćmy do procedury Czas.OnTimer, przed tekstem i Scena.Flip wpisz :
1 2 3 |
EngineGry.Move(lagCount); //wykonuje funkcje OnMove EngineGry.Draw; //rysuje obiekty |
To już wszystko. Oto cały szablon programu :
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 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 |
unit szablon; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, DXInput, DXClass, DXSprite, DXDraws; type TObiekt = class(TImageSprite) public procedure DoMove(MoveCount: Integer); override; end; type TForm1 = class(TForm) ListaGrafiki: TDXImageList; Scena: TDXDraw; EngineGry: TDXSpriteEngine; Czas: TDXTimer; Ruch: TDXInput; procedure CzasTimer(Sender: TObject; LagCount: Integer); procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; Obiekt : Tobiekt; implementation {$R *.dfm} procedure TObiekt.DoMove(MoveCount: Integer); begin Form1.Ruch.Update; If isLeft in Form1.Ruch.States Then X:= X-1; If isRight in Form1.Ruch.States Then X:= X+1; If isUp in Form1.Ruch.States Then Y:= Y-1; If isDown in Form1.Ruch.States Then Y:= Y+1; end; procedure TForm1.CzasTimer(Sender: TObject; LagCount: Integer); begin Scena.Surface.Fill(clBlack); EngineGry.Move(lagCount); EngineGry.Draw; Scena.Surface.Canvas.TextOut(20,20, ' www.delphi.prv.pl ' ); Scena.Surface.Canvas.Release; Scena.Flip; end; procedure TForm1.FormCreate(Sender: TObject); begin Obiekt := TObiekt.Create(EngineGry.Engine); Obiekt.Image := ListaGrafiki.Items[0]; Obiekt.Width := ListaGrafiki.Items[0].Width; Obiekt.Height:= ListaGrafiki.Items[0].Height; Obiekt.X := 50; Obiekt.Y := 50; end; end. |
Autor: Nakiel