|
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 |