unit UnitWarstwy;

interface

uses
 OmegaImageList, OmegaSprite,OmegaScreen, OmegaMap,Windows,controls,extctrls,
 classes,Unit1;

type

 TTypSwiata=(prostokatny);

 TDaneMApy=record
       typ           :tTypSwiata;
       XCount        :word;//ile kolumn kosci swita
       YCount        :word;//ile wierszy kosci swita
       XSwiataEkranu :byte;//ile kosci widocznych na ekranie w osi X
       YSwiataEkranu :byte;//ile kosci widocznych na ekranie w osi Y
       W1Kosc         :word;//szerokosc kosci swiata warstwy 1
       H1Kosc         :word;//wysokosc kosci swiata  warstwy 1
       W1polKosc      :word;//szerokosc plowy kosci swiata warstwy 1
       H1polKosc      :word;//wysokosc polowy kosci swiata warstwy 1
       OmegaScreen    :TOmegaScreen;
       OmegaSprite    :TOmegaSprite;
       OmegaImageList :TOmegaImageList;
       ImageListItem  :TImageListItem;
       Rozdzielczosc  :TPoint;
       VSYNC          :boolean;
       bpp            :byte;
       fPokaz,
       fSiatka        :boolean;
       idPanel        :byte;//indeks obrazu panela wyswietlanego w dole swiata
 end;
 tAnimacja=record
       fIdObAnim:Word;//indeks odpowiadajacy pozycji typu ob. animacji w tObiektyAnimacji=(oWoda,oWoda1,...
       fAnimPos1,
       fAnimPos2  :single;//Liczniki animacji

       fKolizja        //flaga kolizji z warstwie
       :boolean;
     end;

 TMapa=record
      Name:string[25];
      fByl:boolean;
      idKaflaMapy:integer;
      idObrazka :integer;//indeks Obrazu zgdny z listą OmegaImageList załadowanego zasobu
      idKlatka  :integer;//indeks klatki obrazka, -1 to brak obrazka
      left,
      top       :integer;//wspolrzedne tej klatki wzgledem gornego lwergo rogu kostki swiata
      RGBA:record
       R:byte;
       G:byte;
       B:byte;
       A:byte;
       zakazWstepu:byte;//0 to droga wolna, 1 zajęta, Edytor ustawia to na warstwę drugą
       Left,
       Top,
       Left2,
       Top2,
       IdObrazka2,
       idKlatka2:integer;//indeks drugiej klatki nakladanej na kefel
       AlphaA,             //przenikanie warstw kafli- współczynniki Alpha
       AlphaB,
       AlphaC,
       AlphaD:byte;
      end;
     Animacja:tAnimacja;
 end;

 PMapa=^tabTMapa;
 tabTMapa=array of TMapa;//typ tablicowy do przechowywania map warstw swiatow

 //warstwy 1 i 2- widoczna an ekranie
 TKostkaMapy=class(TSprite)

      fSkokWiersza:byte;//1-dla prostokatnego,2 dla izometrycznego
      fOmegaImageList:TOmegaImageList;
      fIdObraz:integer;//indeks bitmapy na liscie OmegaImageList
      fIDKafla:integer;//kolejny numer kafla w mapie świata
      left2,
      top2,
      idObrazka2,
      idKlatka2:integer;//indeks drugiej klatki nakladanej na kefel,pierwsza klatka przechowywana
                        //jest w polu klasy TSimpleAnimSprite- ImageIndex

      //typ:TTypSwiata;
      x0,y0,               //stale wspolrzedne zaczepienia kafla
      dX,dY:single;        //wzgledne przesuniecie kafla
      left,
      top    :integer;     //wspolrzedne lewego rogu obrazu przekazanego do klatki
      kolumna,wiersz,      //kolumna i wiersz
      RogX,RogY:integer;   //wspolrzedne kolumny i wiersza gornego lewego rogu mapy
      idWskMApy   :integer;//indeks wskaznika mapy

       //płynne przejscia- przezroczystosc rogów
       AlphaA,
       AlphaB,
       AlphaC,
       AlphaD:byte;
      procedure ZmianaKlatki;virtual;
   protected
      property IdObraz  :integer      read fIdObraz  write fIdObraz;
      property IdKafla :integer       read fIDKafla write  fIDKafla;
   private

      procedure Draw;override;
      procedure Move(const MoveCount:single);override;
      procedure Animacja;
    public
      procedure OdswiezKlatke;//do modułu animacji
      procedure RGBA;//oraz left i top obarzu przekazanego do klatki
      procedure RuchWLewo;
      procedure RuchWPrawo;
      procedure RuchWGore;
      procedure RuchWDol;
      constructor Kreacja(AParent:TOmegaSprite;Dane:TDaneMApy;
                                AImageID,                   //pobrane z siatki tablicy mapy
                                AImageIndex:integer;        //pobrane z siatki tablicy mapy
                                AIDWskMapy,A,B,Z0:integer
                                );virtual;
      procedure onCollision(const Sprite:Tsprite;const colX,colY:integer);override;
 end;


// Klasa warstwy gruntu- widoczna na ekranie
 TKostkaGruntuMapy=class

      fSkokWiersza:byte;//1-dla prostokatnego,2 dla izometrycznego
      fOmegaImageList:TOmegaImageList;
      fIdObraz:integer;//indeks bitmapy na liscie OmegaImageList

      fIDKafla:integer;//kolejny numer kafla w mapie świata
      Image: TImageListItem;
      width,
      height,
      ImageIndex,//dla klatki pierwszego obrazu nakladanego na kafel, nazwa tozsam z klasy TSprite,
      idKlatka2:integer;//indeks drugiej klatki nakladanej na kefel, wrunek indeksy obrazow musza byc te same

      x,y,
      x0,y0,               //stale wspolrzedne zaczepienia kafla
      dX,dY:single;        //wzgledne przesuniecie kafla

      left,
      top    :integer;     //wspolrzedne lewego rogu obrazu przekazanego do klatki
      kolumna,wiersz,      //kolumna i wiersz
      RogX,RogY:integer;   //wspolrzedne kolumny i wiersza gornego lewego rogu mapy
      idWskMApy   :integer;//indeks wskaznika mapy

       Animacjia:tAnimacja;
       Red,
       Green,
       Blue,
       Alpha,
       //płynne przejscia- przezroczystosc rogów
       AlphaA,
       AlphaB,
       AlphaC,
       AlphaD:byte;
      procedure ZmianaKlatki;virtual;
   protected
      property IdObraz  :integer      read fIdObraz  write fIdObraz;
      property IdKafla :integer       read fIDKafla write  fIDKafla;
   private

      procedure Move(const ASkokX,ASkokY:single);
      procedure Draw;
      procedure Animacja;
    public
      procedure OdswiezKlatke;//do modułu animacji
      procedure RGBA;//oraz left i top obarzu przekazanego do klatki
      procedure RuchWLewo;
      procedure RuchWPrawo;
      procedure RuchWGore;
      procedure RuchWDol;
      constructor Kreacja(Dane:TDaneMApy;
                                AImageID,                   //pobrane z siatki tablicy mapy
                                AImageIndex:integer;        //pobrane z siatki tablicy mapy
                                AIDWskMapy,A,B:integer
                                );virtual;
 end;
 // typ tablicowy dla warstw
 TGrunt=array of array of TKostkaGruntuMapy;
 TWarstwa=array of array of TKostkaMapy;
var
 a,b:byte;

 SwiatProstokatnyGrunt:TGrunt;
 SwiatProstokatnyWarstwy:array[0..2]of TWarstwa;


 Lista:TList;//lista wskaznikow map
 DaneMApy:TDaneMApy;
 skokX,skokY:double;
 typSwiata:TTypSwiata;
 //rzeczywiste wspolrzedne rogu swita, zmieniaja sie pod wplywem jego przesowania
 RogSwiata:record
    x,
    y:single;//wspolrzedne lewego gornego rogu
    kolumna,
    wiersz,
    Indeks:LongInt;//Indeks Klatki lewegogornego rogu
 end;

 procedure PokazGrunt(const ASkokX,ASkokY:single);


 procedure TworzMApeWarstwy(const idImage,kol,wier,_01:integer;var A:PMapa);
 function UstawDaneMApy(typSwiata:tTypSwiata;
                       XYCount:TPoint;
                       WH:TPoint;
                       EKranXY:TPoint;
                       OML:TOmegaImageList):TDaneMApy;
 procedure ZerujTabliceDynamicznaWarstw;

implementation
uses Sysutils, UnitCyklSwiata,praduszek;


//Implememntacaj Klasy TKOSTKAMAPY
procedure TKostkaMapy.onCollision(const Sprite:Tsprite;const colX,colY:integer);
begin
  if (Sprite is TPraduch)then begin
     with TPraduch(Sprite) do begin
     skokX:=-dv*2*tabWersor[ord(Kierunek),0];
     skokY:=-dv*1.5*tabWersor[ord(Kierunek),1];
     //DoCollision  :=false;
     end;
  end;
end;


procedure TKostkaMapy.RGBA;
begin
    Red  :=PMapa(Lista.Items[idWskMApy])^[fIDKafla].RGBA.R;
    Green:=PMapa(Lista.Items[idWskMApy])^[fIDKafla].RGBA.G;
    Blue :=PMapa(Lista.Items[idWskMApy])^[fIDKafla].RGBA.B;
    Alpha:=PMapa(Lista.Items[idWskMApy])^[fIDKafla].RGBA.A;
    left :=PMapa(Lista.Items[idWskMApy])^[fIDKafla].left;
    top  :=PMapa(Lista.Items[idWskMApy])^[fIDKafla].top;
    idObrazka2 := PMapa(Lista.Items[idWskMApy])^[fIDKafla].RGBA.idobrazka2;//indeks obrazu
    idKlatka2  := PMapa(Lista.Items[idWskMApy])^[fIDKafla].RGBA.idKlatka2; //indeks klatki
    Left2        := PMapa(Lista.Items[idWskMApy])^[fIDKafla].RGBA.Left2;
    Top2         := PMapa(Lista.Items[idWskMApy])^[fIDKafla].RGBA.Top2;
    AlphaA:=PMapa(Lista.Items[idWskMApy])^[fIDKafla].RGBA.AlphaA;
    AlphaB:=PMapa(Lista.Items[idWskMApy])^[fIDKafla].RGBA.AlphaB;
    AlphaC:=PMapa(Lista.Items[idWskMApy])^[fIDKafla].RGBA.AlphaC;
    AlphaD:=PMapa(Lista.Items[idWskMApy])^[fIDKafla].RGBA.AlphaD;
end;
procedure TKostkaMapy.OdswiezKlatke;//do modułu animacji
begin
 if fIDKafla=-1 then exit;
 ImageIndex  := PMapa(Lista.Items[idWskMApy])^[fIDKafla].idKlatka;
 idKlatka2:=PMapa(Lista.Items[idWskMApy])^[fIDKafla].RGBA.idKlatka2;
end;
procedure TKostkaMapy.ZmianaKlatki;

begin
   DoCollision  :=false;
   if (RogX>-1)and(RogY>-1)and
          (RogX<DaneMApy.XCount)and(RogY<DaneMApy.YCount)
   then
        fIDKafla:=RogX+RogY*DaneMApy.XCount
   else
       begin
       fIDKafla:=-1;
       exit;
       end;
   Image:=DaneMapy.OmegaImageList.ImageList.Items[Pmapa(Lista.Items[idWskMApy])^[fIDKafla].idObrazka];
   ImageIndex  := PMapa(Lista.Items[idWskMApy])^[fIDKafla].idKlatka;
   //uswta nowe wartości Red, Green, Blue, Alpha jakie niesie w sobie nowa komórka mapy świata
   RGBA;
   DoCollision  :=PMapa(Lista.Items[idWskMApy])^[fIDKafla].Animacja.fKolizja;
end;
procedure TKostkaMapy.RuchWLewo;
begin
 //sprzwdz czy ma nastapic skok
 if dx>=DaneMapy.W1Kosc  then
 begin
    RogX:=RogX-1;//Kosc przesuwa sie w Lewo a świat w prawo
    x:=x0;
    dx:=0;
    ZmianaKlatki;
 end;
end;
procedure TKostkaMapy.RuchWPrawo;
begin
 if dx<=-DaneMapy.W1Kosc  then
 begin
    RogX:=RogX+1;
    x:=x0;
    dx:=0;
    ZmianaKlatki
 end;
end;
procedure TKostkaMapy.RuchWGore;
begin

 if dy<=-DaneMapy.H1Kosc then begin
       RogY:=RogY+fSkokWiersza;//prost:+1;izo:+2;
       y:=y0;
       dy:=0;
       ZmianaKlatki
    end;
end;
procedure TKostkaMapy.RuchWDol;
begin
 if dy>=DaneMapy.H1Kosc  then
    begin
     RogY:=RogY-fSkokWiersza;//prost:-1;izo:-2;
     y:=y0;
     dy:=0;
     ZmianaKlatki
    end;
end;

procedure TKostkaMapy.Move(const MoveCount:single);
begin
 inherited Move(MoveCount);
 dx:=dx+SkokX;
 dy:=dy+SkokY;
 RuchWLewo;
 RuchWPrawo;
 RuchWGore;
 RuchWDol;
 x:=x0+dx;
 y:=y0+dy;

end;
procedure TKostkaMapy.Animacja;
begin
  with PMapa(Lista.Items[idWskMApy])^[IDKafla] do begin
          //animacja pierwszego obrazu
          if DaneObiektu[Animacja.fIdObAnim].fAnimacja1 then begin
             Animacja.fAnimPos1:=Animacja.fAnimPos1+Form1.OmegaTimer1.DeltaSecs;
             if Animacja.fAnimPos1>Form1.OmegaTimer1.DeltaSecs*DaneObiektu[Animacja.fIdObAnim].fdV1 then
                begin
                inc(IdKlatka,1);
                Animacja.fAnimPos1:=0;
                end;
             if IdKlatka>DaneObiektu[Animacja.fIdObAnim].P1 then IdKlatka:=DaneObiektu[Animacja.fIdObAnim].L1;
          end;
          //animacja drugiego obrazu
          if DaneObiektu[Animacja.fIdObAnim].fAnimacja2 then begin
             Animacja.fAnimPos2:=Animacja.fAnimPos2+Form1.OmegaTimer1.DeltaSecs;
             if Animacja.fAnimPos2>Form1.OmegaTimer1.DeltaSecs*DaneObiektu[Animacja.fIdObAnim].fdV2 then
                begin
                inc(RGBA.idKlatka2,1);
                Animacja.fAnimPos2:=0;
                end;
             if RGBA.idKlatka2>DaneObiektu[Animacja.fIdObAnim].P2 then RGBA.idKlatka2:=DaneObiektu[Animacja.fIdObAnim].L2;
          end;
  end;
end;

procedure TKostkaMapy.Draw;
begin

 if (ImageIndex=-1)or(fIDKafla=-1)then exit;
 Animacja;
 OdswiezKlatke;
 Image.Draw(Round(x+left),Round(y+top),0,0.5,0.5,1,1,Red,Green,Blue,Alpha,ImageIndex,0);

 //test wzrokowy prawidłowowści przerzucania flagi kolizji
 {if DoCollision then Form1.OmegaFont1.Print(Round(X),Round(Y),'Tak') else
                     Form1.OmegaFont1.Print(Round(X),Round(Y),'Nie');
 }
 if (idKlatka2=-1)then exit;
 fOmegaImageList.ImageList.Items[idObrazka2].Draw(Round(x+left+left2),Round(y+top+top2),0,0.5,0.5,1,1,Red,Green,Blue,Alpha,idKlatka2,0);
end;
constructor TKostkaMapy.Kreacja(AParent:TOmegaSprite;Dane:TDaneMApy;
                               AImageID,
                               AImageIndex:integer;
                               AIDWskMapy,A,B,Z0:integer
                               );
begin
       inherited Create(AParent);
       idWskMApy:=AIDWskMapy;//1;//zerow jest indeksem mapy warstwy 0 czyli gruntu- inna klasa

       Image  :=DAne.OmegaImageList.ImageList.Items[AImageID];
       ImageIndex :=AImageIndex;
       idKlatka2:=-1;
       fOmegaImageList:=DAne.OmegaImageList;
       if Image.Name<>'c'then begin
          Width  := Dane.W1Kosc;
          Height := Dane.H1Kosc;
          image.TileWidth:=Dane.W1Kosc;
          image.Tileheight:=Dane.H1Kosc;
       end;
       kolumna:=a;
       wiersz:=b;
       RogX:=RogSwiata.kolumna+a;
       RogY:=RogSwiata.wiersz+b;

       fIDKafla:=RogX+RogY*Dane.XCount;//Pole mapy swiata
       x0:=a*Dane.W1Kosc +RogSwiata.x;//przesun o poczatkowe polozenie rogu swiata
       dx:=0;
       dy:=0;
       DoCollision  := true;
       DoPixelCheck := true;
       //glebia mapy odpowiada kolejnemu numerowi wiersza
       z:=b+z0;
       //typ:=Dane.typ;
       fSkokWiersza:=1;
       y0:=b*Dane.H1Kosc +RogSwiata.y;//przesun o poczatkowe polozenie rogu swiatay:=y0;
       y:=y0;
       Zmianaklatki;
end;
//******************************************************************************
//Implememntacaj Klasy TKOSTKAGruntuMAPY
procedure TKostkaGruntuMapy.RGBA;
begin
    Red  :=PMapa(Lista.Items[idWskMApy])^[fIDKafla].RGBA.R;
    Green:=PMapa(Lista.Items[idWskMApy])^[fIDKafla].RGBA.G;
    Blue :=PMapa(Lista.Items[idWskMApy])^[fIDKafla].RGBA.B;
    Alpha:=PMapa(Lista.Items[idWskMApy])^[fIDKafla].RGBA.A;
    left :=PMapa(Lista.Items[idWskMApy])^[fIDKafla].left;
    top  :=PMapa(Lista.Items[idWskMApy])^[fIDKafla].top;
    idKlatka2  := PMapa(Lista.Items[idWskMApy])^[fIDKafla].RGBA.idKlatka2;
    AlphaA:=PMapa(Lista.Items[idWskMApy])^[fIDKafla].RGBA.AlphaA;
    AlphaB:=PMapa(Lista.Items[idWskMApy])^[fIDKafla].RGBA.AlphaB;
    AlphaC:=PMapa(Lista.Items[idWskMApy])^[fIDKafla].RGBA.AlphaC;
    AlphaD:=PMapa(Lista.Items[idWskMApy])^[fIDKafla].RGBA.AlphaD;

end;
procedure TKostkaGruntuMapy.OdswiezKlatke;//do modułu animacji
begin
 //if fIDkafla=-1 then exit;
 ImageIndex  := PMapa(Lista.Items[idWskMApy])^[fIDKafla].idKlatka;
 idKlatka2:=PMapa(Lista.Items[idWskMApy])^[fIDKafla].RGBA.idKlatka2;

end;

procedure TKostkaGruntuMapy.ZmianaKlatki;
begin
   if (RogX>-1)and(RogY>-1)and
          (RogX<DaneMApy.XCount)and(RogY<DaneMApy.YCount)
   then
       fIDKafla:=RogX+RogY*DaneMApy.XCount
   else
       begin
       fIDKafla:=-1;
       exit;
       end;
   Image:=DaneMapy.OmegaImageList.ImageList.Items[Pmapa(Lista.Items[idWskMApy])^[fIDKafla].idObrazka];
   ImageIndex  := PMapa(Lista.Items[idWskMApy])^[fIDKafla].idKlatka;
   //uswta nowe wartości Red, Green, Blue, Alpha jakie niesie w sobie nowa komórka mapy świata
   RGBA;
end;
procedure TKostkaGruntuMapy.RuchWLewo;
begin
 //sprzwdz czy ma nastapic skok
 if dx>=DaneMapy.W1Kosc  then
 begin
    RogX:=RogX-1;//Kosc przesuwa sie w Lewo a świat w prawo
    x:=x0;
    dx:=0;
    ZmianaKlatki;
 end;
end;
procedure TKostkaGruntuMapy.RuchWPrawo;
begin
 if dx<=-DaneMapy.W1Kosc  then
 begin
    RogX:=RogX+1;
    x:=x0;
    dx:=0;
    ZmianaKlatki
 end;
end;
procedure TKostkaGruntuMapy.RuchWGore;
begin

 if dy<=-DaneMapy.H1Kosc then begin
       RogY:=RogY+fSkokWiersza;//prost:+1;izo:+2;
       y:=y0;
       dy:=0;
       ZmianaKlatki
    end;
end;
procedure TKostkaGruntuMapy.RuchWDol;
begin
 if dy>=DaneMapy.H1Kosc  then
    begin
     RogY:=RogY-fSkokWiersza;//prost:-1;izo:-2;
     y:=y0;
     dy:=0;
     ZmianaKlatki
    end;
end;
procedure TKostkaGruntuMapy.Move(const ASkokX,ASkokY:single);
begin
 dx:=dx+SkokX;
 dy:=dy+SkokY;
 RuchWLewo;
 RuchWPrawo;
 RuchWGore;
 RuchWDol;
 x:=x0+dx;
 y:=y0+dy;

end;
procedure TKostkaGruntuMapy.Draw;
begin
 if (ImageIndex=-1)or(fIDKafla=-1)then exit;
 Animacja;
 Image.Draw(Round(x+left),Round(y+top),0,0.5,0.5,1,1,Red,Green,Blue,Alpha,ImageIndex,0);
 if idKlatka2=-1 then exit;
 Image.Draw4Col(
                 Round(X),Round(Y),
                 Round(X+Image.TileWidth),Round(Y),
                 Round(X+Image.TileWidth),Round(Y+Image.TileHeight),
                 Round(X),Round(Y+Image.TileHeight),
                 0,0,0,1,1,
                 OmegaColor(Red,Green,Blue,AlphaA),
                 OmegaColor(Red,Green,Blue,AlphaB),
                 OmegaColor(Red,Green,Blue,AlphaC),
                 OmegaColor(Red,Green,Blue,AlphaD),
                 idKlatka2,0);
end;
constructor TKostkaGruntuMapy.Kreacja(Dane:TDaneMApy;
                               AImageID,
                               AImageIndex:integer;
                               AIDWskMapy,A,B:integer
                               );
begin
       idWskMApy:=AIDWskMapy;//1;//zerow jest indeksem mapy warstwy 0 czyli gruntu- inna klasa

       Image  :=DAne.OmegaImageList.ImageList.Items[AImageID];
       ImageIndex :=AImageIndex;
       idKlatka2:=-1;
       fOmegaImageList:=DAne.OmegaImageList;

       if Image.Name<>'c'then begin
          Width  := Dane.W1Kosc;
          Height := Dane.H1Kosc;
          image.TileWidth:=Dane.W1Kosc;
          image.Tileheight:=Dane.H1Kosc;
       end;
       kolumna:=a;
       wiersz:=b;
       RogX:=RogSwiata.kolumna+a;
       RogY:=RogSwiata.wiersz+b;

       fIDKafla:=RogX+RogY*Dane.XCount;//Pole mapy swiata

       x0:=a*Dane.W1Kosc +RogSwiata.x;//przesun o poczatkowe polozenie rogu swiata
       dx:=0;
       dy:=0;

       fSkokWiersza:=1;
       y0:=b*Dane.H1Kosc +RogSwiata.y;//przesun o poczatkowe polozenie rogu swiatay:=y0;
       y:=y0;
       Zmianaklatki;
end;
procedure TKostkaGruntuMapy.Animacja;
begin
  with PMapa(Lista.Items[idWskMApy])^[IDKafla] do begin
          //animacja pierwszego obrazu
          if DaneObiektu[Animacja.fIdObAnim].fAnimacja1 then begin
             Animacja.fAnimPos1:=Animacja.fAnimPos1+Form1.OmegaTimer1.DeltaSecs;
             if Animacja.fAnimPos1>Form1.OmegaTimer1.DeltaSecs*DaneObiektu[Animacja.fIdObAnim].fdV1 then
                begin
                inc(ImageIndex,1);
                Animacja.fAnimPos1:=0;
                end;
             if ImageIndex>DaneObiektu[Animacja.fIdObAnim].P1 then ImageIndex:=DaneObiektu[Animacja.fIdObAnim].L1;
          end;
          //animacja drugiego obrazu
          if DaneObiektu[Animacja.fIdObAnim].fAnimacja2 then begin
             Animacja.fAnimPos2:=Animacja.fAnimPos2+Form1.OmegaTimer1.DeltaSecs;
             if Animacja.fAnimPos2>Form1.OmegaTimer1.DeltaSecs*DaneObiektu[Animacja.fIdObAnim].fdV2 then
                begin
                inc(idKlatka2,1);
                Animacja.fAnimPos2:=0;
                end;
             if idKlatka2>DaneObiektu[Animacja.fIdObAnim].P2 then idKlatka2:=DaneObiektu[Animacja.fIdObAnim].L2;
          end;
  end;
end;
//******************************************************************************


procedure TworzMApeWarstwy(const idImage,kol,wier,_01:integer;var A:PMapa);
var
 i,
 rozmiar:LongInt;
begin
 rozmiar:=kol*wier;
 setLength(A^,rozmiar);
 for i:=0 to rozmiar-1 do begin
     A^[i].fByl:=false;
     A^[i].idKlatka  :=_01;
     A^[i].idObrazka :=idImage;//standardowo nie bedzi ewyswietlac obrazu z listy o indeksie 0, na -1 wykrzacz się
                               //pod indeksem zero jets obraz przezroczysty
     A^[i].left  :=0;
     A^[i].top   :=0;
     A^[i].RGBA.R:=255;
     A^[i].RGBA.G:=255;
     A^[i].RGBA.B:=255;
     A^[i].RGBA.A:=255;
     A^[i].RGBA.zakazWstepu:=0;//0 to droga wolna
     A^[i].RGBA.idKlatka2:=-1;
     A^[i].RGBA.AlphaA:=0;
     A^[i].RGBA.AlphaB:=0;
     A^[i].RGBA.AlphaC:=0;
     A^[i].RGBA.AlphaD:=0;
     //A^[i].Animacja. fdV:=0;
     //A^[i].Animacja.fAnimacja1:=false;
     //A^[i].Animacja.fAnimacja2:=false;
    end;
end;
///////////////////////////////////////////////
function UstawDaneMApy(typSwiata:tTypSwiata;
                       XYCount:TPoint;
                       WH:TPoint;
                       EKranXY:TPoint;
                       OML:TOmegaImageList):TDaneMApy;
begin
  with result do
    begin
       typ:=typSwiata;
       XCount:=XYCount.X;//23;         //liczba klatek mapy swiata w osi X
       YCount:=XYCount.Y;//26;         //liczba klatek mapy swiata w osi Y
       W1Kosc:=WH.X;//128;        //rozmiar klatki mapy w osi x
       H1Kosc:=WH.Y;//64;         //rozmiar klatki mapy w osi Y
       W1polKosc:=WH.X ;//musi byc cały rozmiar
       H1polKosc:=WH.Y ;//ze wzgledu na ruch swiata

       XSwiataEkranu  :=EKranXY.X; //liczba klatek widocznych na ekranie w osi x
       YSwiataEkranu  :=EKranXY.Y;//liczba klatek widocznych na ekranie w osi y
       OmegaImageList:=OML;//Lista grafiki
    end;{koniec prostokatny}
end;
//
procedure ZerujTabliceDynamicznaWarstw;
begin
  SetLength(SwiatProstokatnyGrunt,DaneMapy.XSwiataEkranu,DaneMapy.YSwiataEkranu);
//  SetLength(SwiatProstokatnyWarstwy[0],DaneMapy.XSwiataEkranu,DaneMapy.YSwiataEkranu);// do starego pomysłu
  SetLength(SwiatProstokatnyWarstwy[1],DaneMapy.XSwiataEkranu,DaneMapy.YSwiataEkranu);
  SetLength(SwiatProstokatnyWarstwy[2],DaneMapy.XSwiataEkranu,DaneMapy.YSwiataEkranu);
end;
procedure PokazGrunt;
var
  L1,P1:byte;
  b:LongWord;
begin
  for b:=0 to DaneMapy.YSwiataEkranu-1 do
    begin
       L1:=0;P1:=DAneMapy.XSwiataEkranu-1;
       while L1<=P1 do begin
        if (L1<P1)then begin
        SwiatProstokatnyGrunt[L1,b].Move(ASkokX,ASkokY);
        SwiatProstokatnyGrunt[L1,b].Draw;
        end;
        SwiatProstokatnyGrunt[P1,b].Move(ASkokX,ASkokY);
        SwiatProstokatnyGrunt[P1,b].Draw;
        inc(L1);
        dec(P1);
       end;
    end;
end;

end.
