Sprite - jest to animacja (bitmapa) 2D, poruszająca się :) - taka definicja wam wystarczy aby pojąć co to jest sprite.
Powiedzmy, że macie na jakiejś stronie banner - jest on animowany, tylko, że się nie porusza itp. :)
W tym opisie znajdziesz:
- rysowanie sprite'ów
- animacja sprite'ów
- pobieranie pozycji X, Y
- Poruszanie sprite'ami
Kolizję sprite'ów znajdziesz dopiero w dziale tworzenie gier.
Rysowanie sprite'ów
Po pierwsze umieść dxspriteengine na formatce i ustaw wartość DxDraw na DxDraw1 :), który umieściłeś wcześniej :P
Umieść też DxTimer ustaw wartość 'ActiveOnly':= false; następnie wartość interval := 1; potem w OnTimer umieść
begin
noxxdxmenu1.surface.Fill(0); //wyzerowanie ekranu
dxspriteengine1.Move(1); //Porusz :)
dxspriteengine1.Draw; //Rysuj do dxdraw
noxxdxmenu1.flip;
end;
Umieść na formatce komponęt noxxdxsprite
W sekcji var napisz:
opek : TAnimation; //nasz sprite :)
Następnie umieść dximagelist na formatce i walnij do niego jakiś rysunek (w pozycji [0] - item));
Ustaw wszędzie gdzie się da Wartość DxDraw (Imagelist i Spriteengine) i w form OnCreate wpisz;
begin
opek := TAnimation.Create(DxSpriteEngine1.Engine); //Tworzymy sprite'a
opek.x := 104; //pozycja x a niżej y
opek.y := 112;
opek.Image := dximagelist1.Items[0]; //Rysuneczek dla naszego sprite'a
end;
Teraz uruchom programik - jeżeli nie widzisz animacji na formatce to tylko i wyłącznie twoja wina!
Pamiętajcie jednak, że zawsze w Form1 OnClose macie dać kodzik: opek.free; !!!
Animacja Sprite'ów
Jest to łatwe tylko trzeba wiedzieć co zrobić :)
Dobra zrób to samo co w przykładzie wyżej podanym. Tylko że obrazkiem niech będzie:
Wszystko powinno się automtycznie zrobić na Transparent := true; i transparentcolor := clfuchsia;
Teraz do OnCreate (Form1):
[..]
opek := TAnimation.Create(DxSpriteEngine1.Engine); //stworzenie sprite'a
opek.Image := dximagelist1.Items[0];
opek.x := 104; //pozycja x a niżej y
opek.y := 112;
opek.AnimSpeed := 200/1000; //szybkość animacji
opek.AnimPos := 0; //pozycja animacji (początek to 0)
opek.AnimCount := opek.Image.PatternCount; //obszar, który wytniemy :)
opek.AnimLooped := true; //określa czy animacja ma być powtarzana czy tez nie
end;
Jak już umieściliście nowy image tam gdzie ma być to załączcie jeszcze raz dximagelist i wybierzcie (tylko raz kliknijcie) ten nasz obrazek.(na ten item)
W object inspector (w inspektorze obiektów) znajdźcie takie wartości jak Patternwidth i patternheight :) to nasz wycinek :) terazco t trzeba ustawić?? czytaj niżej :)
Musimy po pierwsze wiedzieć ile mamy obrazków na image, jaka jest jego szerokość oraz wysokość. W tym przypadku obrazek ma wymiary 100x23 pikseli (100 szerokości i 23 wysokości).
Obliczanie
Obliczyć szerokość wycinanej klatki jest łatwo wystarczy podzielić szerokość obrazka przez liczbę kaltek, czyli:
Mamy 2 klatki animacji i szerokość; szer - 100 a klatek - 2 więc 100/2 := 50; i w patternwidth wpisujemy "50", natomiast w patternheight wpisujemy rzeczywistą wysokość obrazka (w tym rpzypadku 23).
Sample znajduje się pod adresem: klik :P
Pobieranie pozycji x,y (integer)
Samo sprite.x to nie jest ta nasza wartość co nas interesuje (gdy ją mamy musimy uwzględnić 1/2 szerokości w przypdaku X)
Dlaczego? Ponieważ coś jest źle :P
I dlatego są bardzo proste funkcje do pobrania x, y: (w noxxdxsprite)
var
x, y : integer;
begin
get_sprite_x(sprite);get_sprite_y(sprite); //gdzie 'sprite' to nazwa naszego sprite'u :)
end;
Poruszanie sprite'ami
Tutaj nie ma co do gadania :P Napiszę tylko kod bo on nie wymaga niczego dodatkowego :) ('Sprite' to nazwa naszego sprite'u)
begin
sprite.x := sprite.x + 3; //idziemy w prawo
sprite.x := sprite.x - 3; //idziemy w lewo
sprite.y := sprite.y + 3; //idzemy w dół
sprite.y := sprite.y - 3; //idziemy w górę
end;
Możemy też za pomocą DirectInput (DxInput); do DxTimer OnTimer wpisujemy:
if (isleft in dxinput1.states) then sprite.x := sprite.x - 3; - w lewo
if (isright in dxinput1.states) then sprite.x:= sprite.x + 3; - w prawo
są jeszcze: isup - w górę, isdown - w dół. itp.