Jump to content

[Delphi][Omega] Kolejność rysowania


LordLost

Recommended Posts

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 to comment
Share on other sites

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 to comment
Share on other sites

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 to comment
Share on other sites

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 to comment
Share on other sites

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 to comment
Share on other sites

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 to comment
Share on other sites

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 to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.

×
×
  • Create New...