Delphi i praca z warstwami obrazków, elementów

0

Witam!

Sytuacja wygląda tak: Rysuje na TPaintBox mapkę która złożona jest z elementów różnego typu (woda, las, trawa) :) - składających się z kwadratowych pól, sęk polega na tym że chciałbym aby niektóre pola, oraz elementy nanoszone na takowe które są umieszczone na mapce były "pod spodem" a niektóre nad obiektem którym się poruszam. Załóżmy że to ludzik, kwadrat, lub cokolwiek porusza się po mapce, i gdy są drzewa to chowa się pod koroną drzew, ale z drugiej strony nie chowa się pod trawą, czy też pniem drzewa :)

Mam nadzieje że rozumiecie o co mi chodzi :) Tutaj główną umiejętnością jest operowanie na warstwach, niestety nie wiem w jaki sposób mógłbym zdefiniować na "twardo" że to jest taką warstwą, a to jest taką i aby były zachowane te priorytety "kto na kogo włazi" + obsługa przezroczystości oczywiście.

Kolejne zapytanie to takie czy TPaintBox to dobre rozwiązanie do ładowania dość obszernej mapy i tego typu zastosowań? (mapa ładowała by się dynamicznie, - po ruchach aktualizowane odpowiednie "pixele").

Do tego będę oprogramowywał dość dużo zdarzeń - np. takich aby ludzik nie właził mi na pień drzewa przykładowo, czy na słup :), ale z drugiej strony mógł za nim przejść.

No nic, czekam na Wasze pomysły, jeżeli nie to będę musiał kombinować z przeładowywaniem odpowiednio wszystkich "pikseli" mapy, co może okazać się trochę zjadliwe dla zasobów komputera (choć z drugiej strony podczas ruchów i tak musze przeładowywać całą mapke), to raz, dwa monotonne, bowiem zauważyłem że zależnie od tego kiedy jaki obiekt postawię to jeden nakłada się na drugi (jeżeli najpierw, trawe, potem ludzik, to ludzik jest na "górze"), ale takie tworzenie obiektów to przesada (ciągły przeładunek w odpowiedniej kolejności).

Pozdrawiam

0

Wprawdzie nie doczytałem do końca, ale domyślam się, że chodzi o kolejność wyświetlania grafik ;). Po napotkaniu w timerze ( zegarze gry) na opcję rysowania w konkretnej warstwie zapisz w buforze grafikę i wyświetl dopiero wtedy, gdy przyjdzie na to czas :P

0

A no właśnie nie do końca o to chodzi, i teraz pytanie czy muszę to robić tak jak Ty napisałeś (jedyny znany mi sposób). Czy można to jakoś inaczej zrobić, a może jakiś komponent dotyczący warstw?

Po napotkaniu w timerze ( zegarze gry) na opcję rysowania w konkretnej warstwie zapisz w buforze grafikę i wyświetl dopiero wtedy, gdy przyjdzie na to czas :P

W konkretnej warstwie powiadasz...? Ale właśnie jak rysować w warstwach i tak dalej..., jak je potem ustawiać.

0

Hmm... Nie wiem jakby ci to wytłumaczyć, bo jest na pewno wiele sposobów, a nie napiszę ci tego, bo trochę trzeba by przy tym posiedzieć.

Ale dam ci radę. Ściągnij se komponenty graficzne, które zrobią to w pewnym sensie za ciebie. Polecam Omegę. Nie są to nowe komponenty, ale jak dla mnie są bardzo dobre i łatwe do nauki. Jakbyś chciał się o tym coś dowiedzieć to pisz do mnie albo wejdź na unit1.pl.

Na wstępie mogę ci pokazać jak wygląda określenie warstwy:

 Obiekt.Z:= 1; //Gdzie 1 to nr warstwy :D 

Im większy numer tym rysowanie będzie późniejsze.

0

I dzięki temu będę mógł szybko przeskakiwać i manipulować warstwami? :) (dzięki m.in. komponentom z paczki omega)

Omega hmy, ciekawe czy zadziała na najnowszym Delphi XE :) wątpie trochę.

0

Niestety działa tylko na Delphi 5, 6, 7, ale naprawdę polecam. Poza tym warstwy to nie tylko jedna rzecz, którą można łatwo manipulować. Jest jeszcze świetny test kolizji, sprity, obsługa dźwięków w 3d, obsługa joysticków i wiele innych :)

Tworzę na tym silnik 2D i jestem w pełni zadowolony

0

Jeśli chodzi o XE to polecam Asphyre Extreme lub Sphinx i tamtejszy SpriteEngine, podobny do tego z Omegi, a działa na XE (po drobnych przeróbkach). Tu masz link do strony producenta: http://dev.ixchels.net/products

0

Spodobały mi się komponenty Graphic32, natomiast zastanawia mnie dlaczego nie mogę na warstwie rysować... to znaczy mogę, ale widzę dziury a nie nakładający się obraz:

dla przykładu jeżeli chcę:

B.Bitmap.Canvas.Ellipse(60,60,2,2);

to widzę coś takiego:

user image

jeszcze to co może pomóc w znalezieniu błędu to kod:

      with B.Bitmap do
  begin
    BeginUpdate;

    // Different platforms store resource files on different locations
    Assert(FileExists(pathMedia + 'delphi.jpg'));
    LoadFromFile(pathMedia + 'delphi.jpg');

    TLinearResampler.Create(B.Bitmap);

    //ensure good looking edge, dynamic alternative to SetBorderTransparent
    TCustomResampler(B.Bitmap.Resampler).PixelAccessMode := pamTransparentEdge;

    B.BitmapCenter := FloatPoint(Width / 1, Height / 1);
    MasterAlpha := 200;
    FrameRectS(BoundsRect, $FFFFFFFF);
    DrawMode := dmBlend;
    EndUpdate;
    Changed;
  end;

I nie chodzi tutaj bynajmniej o kolor pisaka, bo gdy chcę coś skopiować i narysować na warstwę tak jak tutaj:

TreeImg.Canvas.CopyRect(Rect(x*60, y*60, (x*60)+60, (y*60)+60),
B.Bitmap.Canvas, Rect(0, 0, 60, 60));

to problem jest ten sam.

Dziękuje za ewentualne podpowiedzi.

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