Skocz do zawartości

[Delphi][Omega] Kolejność rysowania


LordLost

Polecane posty

Witam, mam kolejny problem :P Rysowałem sobie różne rzeczy na ekranie w Delphi+Omega i fajnie było dopóki nie zaczęła być potrzebna kolejność rysowania ;) Przedstawiłem na screenie mój problem, obszary zakreślone na niebiesko powinny być rysowane pod spodem a nie są. Obiekty nie są potomkami TOmegaSprite ani nic w tym stylu a rysuje Draw4Col z OmegaImageList. Udało mi się rozwiązać ten problem ifami, gdy obiekty stały obok siebie, a jak je ustawiłem jeden na drugim to znowu źle wyszło :( Teraz Nie wiem jak lepiej to zrobić:

1. Moja klasa ma dziedziczyć po TSprite?

2. Zadeklarować w klasie 5 zmiennych typu TSprite dla każdej ściany osobny?

3. Rozbudować system ifów(warunków)?

Oto klasy, tak dla obrazu sytuacji:

  
 TPointX = record
   X, Y : Integer;
   Color : TOmegaColor;
 end;

 TSideX = record
   FBmp : Integer;
   FPoint1 : TPointX;
   FPoint2 : TPointX;
   FPoint3 : TPointX;
   FPoint4 : TPointX;
 end;

 TObjectX = class
 private
   FStatus, FCol : Boolean;
   FPosX, FPosY, FPosZ, FWidth, FHeight, FWeight, FLength : Integer;
   FSideU, FSideN, FSideS, FSideW, FSideE : TSideX;
 public
   constructor PCreate(Status, Col : Boolean; X, Y, Z, W, H, L, BmpU, BmpN, BmpS, BmpW, BmpE : Integer);
   procedure PDraw(ImgList : TOmegaImageList; DelX, DelY : Integer);
 end; 

Screen:

Obrazek

Jak ktoś ma ciekawe pomysły to proszę o pomoc :)

Link do komentarza
Udostępnij na innych stronach

Ja bym zastosowal cos do 3D, np. OpenGL - tam rysujesz wszystko na swoim miejscu, tam gdzie ma byc i on sam okresla co jest na wierzchu, a co przykryte ;)

Jak mówisz że w 3D się wszystko samo robi to może dobry pomysł ;) Poza tym mam oś Z więc mam trzeci wymiar(a że nie działa poprawnie to inna sprawa) ;)

Link do komentarza
Udostępnij na innych stronach

Niby zrobiłem to warunkami w procedurze PDraw, ale tak muszę przekazywać tablice z obiektami. Niby działa, ale podczas przesuwania mapy czasami migają(ukrywają się) ściany które powinny być widoczne :( To chyba wina zaokrąglania liczb do Integer, może spróbować zaokrąglać wszystko podczas rysowania a obliczać na liczbach zmiennoprzecinkowych?

Link do komentarza
Udostępnij na innych stronach

heh czy to nie jest rozmowa typu:

janek: wiesz chce zabic muche, ale nie wiem jak

karol: o stary wez armate

 

nie wystarczy zwykle rysowanie na warstwach ?

 

To znaczy, że mam obiekty rysować tak jak grunt(np: od lewego górnego rogu do dolnego prawego)? Nie bardzo wiem jak to może wyglądać, ale dam sobie spokój ze stawianiem obiektów na sobie, grunt żeby działało w jednym poziomie.

Link do komentarza
Udostępnij na innych stronach

najprostrza implementacja polega na tym ze kazda warstwa ma swoja tablice czyli jak masz np mape o wymiarach NxM to dodajesz jeszcze wymiar L ktory mowi o kolejnych warstwach. I tak np na warstwie 0 robisz ziemie, na warstwie 1 domki, na 2 ludziki itd itd. W zaleznosci co chcesz. No i na koniec petla bedzie mniej wiecej taka

 

for Warstwa := 0 to 3 do
for X := 0 to MapWidth-1 do
  for Y := o to MapHeight-1 do
    RysujTaila( Map[x, y, warstwa], x, y);

Always Dark<br />u1_tt_logo.png banner-1.pngexFabula-banner.pngson_banner_ubersmall.jpg

Link do komentarza
Udostępnij na innych stronach

Wprowadzę trochę ograniczeń do edytora to będzie chyba działać, nie wiem czy warstwy dałby tutaj rade, bo obiekty na ekranie musiałby rysować się "jak ślimak" od najdalszych do najbliższych (do środka ekranu) i w zależności do położenia ekranu kolejność się zmienia. Na Screenie(fragment) czerwony krzyżyk to środek ekranu jeśli by był z drugiej strony skrzynek to inne ściany by były rysowane i kolejność wyświetlania też byłaby inna.

Edit: Na razie mam jeden poziom i po sesji(w środę) będę się dalej bawił, bo to dłuższy temat ;) Na razie mam układanie klocków :P

Link do komentarza
Udostępnij na innych stronach

Poprzedni problem nie do końca rozwiązany i jeszcze mam kilka pytań :)

1. Nie wiem jak nie rysować gruntu który jest zasłonięty przez obiekt. Teraz przekazuje jako parametr tablice z obiektami do procedury draw i przy rysowaniu każdego(a trochę ich jest) kafelka sprawdza czy jego X i Y są równe X i Y któregoś z obiektu(ilość operacji:= ilość kafli* ilość obiektów). Przez to spada fps a jak rysuje podwójnie też nie jest lepiej :(

2. Jak pobrać część obrazka w OmegaImageList? Tak jak klatki do animacji, które daje się w jednym pliku, najlepiej jakby można było pobrać część obrazka podając X1, Y1, X2, Y2. Jeśli OmegaImageList nie ma wbudowanej tej funkcji to dam sobie z tym spokój.

Link do komentarza
Udostępnij na innych stronach

Zarchiwizowany

Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.

×
×
  • Utwórz nowe...