Artykuł powstał na prośbę jednego z stałych gości naszego serwisu. Będzie krótki, ale powinien niektórym się przydać. Stworzymy animowaną jednostkę, która będzie poruszać się po arenie.
Na starszych komputerach arena może być niewidoczna, ponieważ ze względu na swój rozmiar(640×480) tekstura do niej będzie rozmiaru 1024×1024, a starsze karty graficzne obsługują tekstury o maksymalnym rozmiarze 256×256.
Na początek przygotujmy grafikę dla areny i animowanej jednostki. w naszym przypadku jednostka będzie składać się z czterech grafik, po dwie klatki każda. Na każdej grafice znajduje się jednostka odwrócona w inną stronę.
Mamy już przygotowaną grafikę, przejdźmy teraz do kodu. Na początku zadeklarujmy :
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 85 86 87 88 89 |
var Form1: TForm1; Arena : TAGFImage; Gracz : array[1..4] of TAGFImage; Biblioteka : TVTDb; Grajacy : record x : integer; y: integer; kierunek: byte; klatka: byte; end; Czasu : integer = 0;[delphi] Arena i Gracz to rysunki do których załadujemy grafikę. Biblioteka to obiekt TVTDb, do niego załadujemy plik grafika.vtd. Grajacy to record naszej jednostki. Przechowuje on pozycję (x,y), kierunek poruszania się i aktualną klatkę animacji. Czasu to zmienna, odpowiedzialna za prędkość animacji jednostki. Otwórz procedurę OnCreate Form1. Wstaw do niej poniższy kod : [delphi]procedure TForm1.FormCreate(Sender: TObject); var cos : integer; begin Ekran.Initialize; Ekran.InitDevice; Biblioteka := TVTDb.Create(Ekran); Biblioteka.FileName := 'grafika.vtd'; // Tło ekranu (Arena)) Arena := TAGFImage.Create(Ekran); Arena.LoadFromVTDb(Biblioteka,'arena',D3DFMT_A1R5G5B5); // Gracz -> w lewo Gracz[1] := TAGFImage.Create(Ekran); Gracz[1].LoadFromVTDb(Biblioteka,'j_gora',D3DFMT_A1R5G5B5); // Gracz -> w prawo Gracz[2] := TAGFImage.Create(Ekran); Gracz[2].LoadFromVTDb(Biblioteka,'j_dol',D3DFMT_A1R5G5B5); // Gracz -> w górę Gracz[3] := TAGFImage.Create(Ekran); Gracz[3].LoadFromVTDb(Biblioteka,'j_lewo',D3DFMT_A1R5G5B5); // Gracz -> w dół Gracz[4] := TAGFImage.Create(Ekran); Gracz[4].LoadFromVTDb(Biblioteka,'j_prawo',D3DFMT_A1R5G5B5); Grajacy.x := 320; Grajacy.y := 240; Grajacy.kierunek := 1; Grajacy.klatka := 0; end; |
Powyższe polecenia omawialiśmy w poprzednich artykułach. Wszystkie funkcje ruchowe będziemy wykonywać w procedurze OnKeyDown. Nałożymy ograniczenie poruszania się tylko w obszarze, przesuniemy jednostkę oraz ustalimy kierunek dla zmiany rysunku. Oto ta procedura:
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 |
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin // w górę If grajacy.y > 35 then If key=VK_UP then begin dec(Grajacy.Y,5); grajacy.kierunek := 1; end; // w dół If grajacy.y < 405 then If key=VK_DOWN then begin inc(Grajacy.Y,5); grajacy.kierunek := 2; end; //w lewo If grajacy.x > 35 then If key=VK_LEFT then begin dec(Grajacy.X,5); grajacy.kierunek := 3; end; //w prawo If grajacy.x < 565 then If key=VK_RIGHT then begin inc(Grajacy.X,5); grajacy.kierunek := 4; end; end; |
Na zakończenie ostatnia procedura rysująca naszą jednostkę o kierunku zależnym od zmiennej kierunek. W niej również będziemy animować jednostkę.
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 |
procedure TForm1.CzasRender(Sender: TObject); begin // Animacja jednostki inc(Czasu); If Czasu = 30 then begin If Grajacy.klatka = 0 then grajacy.klatka := 1 else grajacy.klatka := 0; Czasu :=0; end; Ekran.beginScene; // Rysowanie areny Ekran.RenderEffect(Arena,0,0,0,EffectNone); // Rysowanie jednostki Ekran.RenderEffect(Gracz[grajacy.kierunek],grajacy.x,grajacy.y, grajacy.klatka,EffectSrcAlpha); Ekran.endScene; Ekran.Present; end; |
W ten sposób dotarliśmy do końca 🙂