Animowane tło

załącznik
2005-10-22 19:36:00, wyświetleń: 6379 [ historia ]


Artykuł opisuje w jaki sposób korzystać z obiektów TBackgroundSprite umożliwiających tworzenie animowanego tła w grze.

1. Na początku wstawmy na formę odpowiednie komponenty :


Komponent Proponowana nazwa
DXSpriteEngine DXSpriteEngine1
DXTimer DXTimer1 (Interval 0)
DXDraw DXDraw1 (align alClient)
DXImageList DXImageList1


Dla DXImageList i DXSpriteEngine w polu DxDraw wybierzcie DxDraw1. W DXImageList dodajmy obrazek najlepiej jakiś nieduży sprit po np. 16x16 kazda klatka na, której może być np. jedna gwiazda. Nazwijmy ten obrazek poprostu obrazek :) a PatternWidth i PatternHeight ustawmy na rozmiar klatki czyli w naszym przypadku 16 i 16.

Teraz między uses a type wpiszmy:

Kod:
type TScrollBackground = class(TBackgroundSprite)
private
    FSpeed: Double;
public
    procedure DoMove(MoveCount: Integer); override;
end;

Nastepnie zadeklarujmy w var:

ScrollBackground:TScrollBackground;
Między implementation a end. wprowadźmy :

Kod:
procedure TScrollBackground.DoMove(MoveCount: Integer);
begin
  inherited DoMove(MoveCount);
  Y := Y + MoveCount*(60/1000)*FSpeed;
end;

To jest procedura ruchu naszego tła. W takiej postaci kodu tło będzie się przesuwać z góry na duł z prędkością 60/1000 Jeśli chcecie żeby przesuwało w drugą strone musicie zmienić znak + na -, a żeby przesuwało się poziomo nalerzy zmienić Y na X.

Teraz kliknijcie na DxTimer i na zakładke events a tam dwa razy na OnTimer i wpiszcie:

Kod:
DXDraw1.Surface.Fill(clBlack); // czyszczenie ekranu
DXSpriteEngine1.Move(lagCount); // wykonuje funkcje OnMove
DXSpriteEngine1.Draw; // rysuje tło
DXDraw1.Flip; // wyświetlanie wszystkiego na ekranie

W Form1.FormCreate umieśćmy kod :

Kod:
var
  i, j: Integer;
begin
  with TScrollBackground.Create(DXSpriteEngine1.Engine) do
  begin
    SetMapSize(200, 10);
    Image := DXImageList1.Items.Find('obrazek');
   // sprit z różnymi obrazkami np. z chmurkami, gwiazdkami itp.
    Y := 10;
    Z := -3;
    FSpeed := 0.25;// prędkość poruszania się tej warstwy
    Tile := True;

    for i:=0 to MapHeight-1 do
      for j:=0 to MapWidth-1 do
      begin
        Chips[j, i] := Image.PatternCount-Random(Image.PatternCount div 1);
        // funkcja losująca obrazek
        if Random(2)<1 then  Chips[j, i] := -1;
       
// gęstość obrazków na ekranie
        // Random(2)<1 im większa liczba tym mniejsza gęstość
      end;
  end;

Takich funkcji możemy dać tutaj więcej. Powinno wszystko działać, ale jeśli masz probley to zajrzyj do kody źródłowego.Pobierz załącznik załącznik

Autor: Nakiel

Komentarze Artykuły mogą być komentowane wyłącznie przez zarejestrowanych użytkowników.
Vathaz   2012-01-20 20:17:29
rzec*
Vathaz   2012-01-20 20:16:42
hmm użyłem tego kodu w grze wcześniej zrobionej przeze mnie jednakże ruchome tło zasłoniło całą treść gry... co zrobić żeby jakby to rzecz tło było pod spodem ? Opcja "control -> send to back" niestety nie działa
Redakcja zastrzega sobie prawo do skracania, usuwania komentarzy o treściach wulgarnych, obraźliwych oraz niezgodnych z polskim i miedzynarodowym prawem. Unit1.pl Team nie ponosi odpowiedzialności za treść komentarza.