Scrollowanie mapy



Gdy robimy gierkę często potrzebna jest nam funkcja scrollująca mapę. Poniższy sposób wymyśliłem sam, nie wiem czy działa szybko na słabszych komputerach, ale kto dziś takie posiada...

Piszemy zmienne globalne

mx, my , lx, ly : Integer;
Mapa : TBitmap;

Zmienne mx i my to położenie mapy, lx i ly to położenie ludka.

W zdarzeniu formy OnShow piszemy:

Mapa := TBitmap.Create;
Mapa.LoadFromFile('mapka.bmp');
mx := 0;
my := 0;
lx := 160;
ly := 130;
Image1.Canvas.Brush.Style := bsSolid;
Image1.Canvas.Brush.Color := clBlack;
Image1.Canvas.Draw(mx, my, mapa);
Image1.Canvas.Rectangle(lx, ly, lx + 10, ly + 10);

Wstawiamy na formę TImage i w zdarzeniu formy OnKeyDown piszemy:

if (key = vk_right) then
  if (mx <> Image1.Width - Mapa.Width) then
  begin
    mx := mx - 10;
    Image1.Canvas.FillRect(Image1.Canvas.ClipRect);
    Image1.Canvas.Draw(mx, my, mapa);
    Image1.Canvas.Rectangle(lx, ly, lx + 10, ly + 10);
  end;

if (key = vk_left) then
  if mx <> 0 then 
  begin
    mx := mx + 10;
    Image1.Canvas.FillRect(Image1.Canvas.ClipRect);
    Image1.Canvas.Draw(mx, my, Mapa);
    Image1.Canvas.Rectangle(lx, ly, lx + 10, ly + 10);
  end;

if (key = vk_up) then
  if (my <> 0) then
  begin
    my := my + 10;
    Image1.Canvas.FillRect(Image1.Canvas.ClipRect);
    Image1.Canvas.Draw(mx, my, Mapa);
    Image1.Canvas.Rectangle(lx, ly, lx + 10, ly + 10);
  end;

if (key = vk_down) then
  if (my <> Image1.Height - Mapa.Height) then 
  begin
    my := my - 10;
    Image1.Canvas.FillRect(image1.Canvas.ClipRect);
    Image1.Canvas.Draw(mx, my, Mapa);
    Image1.Canvas.Rectangle(lx, ly, lx + 10, ly + 10);
  end;

Powyższa funkcja służy do przemieszczania mapy i jej rysowania. Rysowany jest także ludek (kwadrat), który na razie nie dochodzi do krawędzi mapy, ale jest to proste do zaimplementowania (sam to napisałem :)). Gdyby ten "algorytm" działał zbyt wolno (z powodu wielkości bitmapy), to proponowałbym użycie funkcji CopyRect do skopiwania kawałka bitmapy i wklejenie go do TImage.





...powrót