Program ala Google Maps

0

Witam,

Chciałem napisać sobie program który działałby w podobny sposób jak Google Maps. Dokładnie chodzi mi o wyświetlanie w siatce zdjęć z fragmentami mapy. Zrobiłem już wyświetlanie na całym ekranie, ale problem pojawia się gdy przesuwam tą mapę po ekranie - nie wiem co dać w warunkach.

Wyświetlanie fragmentów mapy jest za pomocą dynamicznie tworzonych TImage.
Moje pliki z fragmentami mapy mają nazwę "mapa_x_y.jpg".

W googlach znalazłem klasę dla javy która wygląda bardzo podobnie do efektu jaki chciałem osiągnąć, nazywa się JXMapKit lub JXMapViewer. Istnieję może podobny komponent dla Delphi?

Pozdrawiam

0

Wystarczy jeden TImage, klasa TCanvas albo cokolwiek na czym jesteś wstanie wyświetlić obrazek. Możesz po prostu zrobić dwuwymiarową tablicę, w której przechowujesz np. ścieżki do plików, następnie wybierasz które elementy tablicy mają być wyświetlone noi wyświetlasz je.

Lektura na dziś:
Tablice
Rozdział 9

0

Chyba się trochę źle wyraziłem. Powiedzmy, że zrobiłem tak jak napisałeś - to akurat nie był problem. Problem pojawia się dopiero gdy chcę doczytywać mapę podczas przesuwania TImage po formularzu. Co ma znaleźć się w warunku:

if Image1.Left < -500 then
begin
//Co tu wpisać aby na początku znikały załadowane fragmenty mapy
//i co wpisać aby na końcu pojawiały się następne fragmenty mapy
end;

Chcę to zrobić ponieważ mapa jest bardzo duża i ładowanie jej całej zajmuje dużo czasu.

0

Nie, nie, nie. Źle mnie zrozumiałeś. Wartość algin tego TImage powinna mieć wartość alClient (czyli że jest zawsze idealnie wpasowany w formę). Czytałeś te dwa artykuły do których linki Ci dałem? Nie chodzi o ładowanie całej mapy do TImage a potem jego przesuwanie, tylko wyświetlanie w TImage odpowiedniej części mapy.

0

No nie wiem albo mam jakąś zaćmę umysłu albo nie rozumiem Twojego toku rozumowania. Bo niby jak ja mam teraz przesuwać tą mapę? Użyłem Canvas.StretchDraw do narysowania mapy na Timage, ale nie wiem co dalej.

0

Ehh, człowieku. Użyj Canvas.Draw; żeby narysować odpowiedni kawałek mapy w odpowiednim miejscu TImage.

0

No przecież napisałem że już to zrobiłem. Nie wiem jak przesuwać tą mapę.

0

Jaa nie mogę. Trzymaj w dwóch zmiennych globalnych wartość marginesów, górnego i bocznego. W zdarzeniach np OnKeyPress możesz wychwytywać strzałki lub W, S, A, D i odpowiednio zwiększać/zmniejszać wartości tych marginesów, a następnie narysować mapę z ich uwzględnieniem.

Edit.
Przesunąć się nie da. Możesz co najwyżej narysować od nowa.

0

Przesunąć się nie da. Możesz co najwyżej narysować od nowa.

Bez herezji. Da się. Gdzieś jest procka która na to pozwala, ale teraz nie mam czasu żeby zobaczyć, więc jeżeli ktoś jest zainteresowany to zapytać.

0

No właśnie tu jest problem, bo ja chciałem tą mapę przesuwać za pomocą myszki. Będę chyba musiał wrócić to tego co na samym początku napisałem - dynamicznie tworzone TImage. Przesuwanie za pomocą MouseMove, ale nadal pozostaje problem wyświetlaniem następnych fragmentów mapy. Mam coś takiego ale to nie działa zbyt dobrze:

w MouseMove:
TabImage[i, j].Left := TabImage[i, j].Left + (X - P.X);
TabImage[i, j].Top := TabImage[i, j].Top + (Y - P.Y);

if TabImage[i, j].Left < -250 then
        begin
        najwiekszaX := TabName[i, j].X;
          for k := 0 to Length(TabImage) - 1 do
          begin
            if najwiekszaX < TabName[k, j].X then
            najwiekszaX := TabName[k, j].X;
            TabName[k, j].X := TabName[k, j].X + 250;
          end;
          TabImage[i, j].Left := TabImage[High(TabImage), j].Left + ((i+1) * 250) + (X - (P.X));

          TabImage[i, j].Name := 'mapa_' + IntToStr(najwiekszaX + 250) + '_' + IntToStr(TabName[i, j].Y);
          TabImage[i, j].Picture.LoadFromFile(TabImage[i, j].Name + '.jpg');
        end;
 
//TabImage - tablica z TImage którymi poruszam
//TabName - tablica TPoint z wszystkimi współrzędnymi([0, 0].X := 0; [0, 0].Y := 0; [1, 0].X := 250; [0, 0].Y := 0; itd.)

1 użytkowników online, w tym zalogowanych: 0, gości: 1