Skocz do zawartości

Funkcja Draw i depth


oLuju

Rekomendowane odpowiedzi

W swoich projektach bardzo często używam funkcji 'draw' do rysowania, gdyż jest to o wiele szybsze i prostsze. Po co tworzyć nowy sprite, który jest, np.: tylko prostym zielonym kwadratem jeśli to samo można zrobić za pomocą 1 komendy. Jednak używając jej wielokrotnie natrafiłem na pewien problem. Otóż gdy rysuje 2 obiekty na sobie nakładają się na siebie (1 przysłania 2), lecz niestety w pewnym przypadkach albo zwykły sprite jest nad tym narysowanym obiektem z funkcji 'draw' lub 2 taki obiekt nieoczekiwanie go przysłania. Moje pytanie jest następujące: Czy jest jakiś sposób na ustalenie "głębi" (depth) rysowanych obiektów za pomocą tej że funkcji?

Próbowałem zmieniać głębie normalnie w obiektach, które posiadają skrypt rysowania, jednak to nie daje żadnych efektów.

 

http://zapodaj.net/images/b1748538f4323.jpg

Na przedstawionym screenie czerwony prostokąt jest narysowany funkcją draw_rectangle(), a białe kwadraty draw_sprite(), obiekt rysujący prostokąt ma depth=-1, a obiekt rysujący sprite depth=1

Odnośnik do komentarza
Udostępnij na innych stronach

Raczej nie powinno być problemu. depth oznacza kolejność wykonywania kodu w obiektach. Te z większym będą się wykonywać wcześniej. Różnica była by gdybyś używał Begin Draw albo End Draw, bo działa to tak że pierw jest begin wszystkich obiektów, potem zwykły draw wszystkich obiektów, a na koniec end draw wszystkich obiektów.

 

No a sam kod wykonuje się po kolei. Od lewej do prawej. Więc

GML
draw_recrangle()

draw_sprite()

draw_recrangle()

Narysuje sprite pomiędzy rysowaniem rectangle.

Odnośnik do komentarza
Udostępnij na innych stronach

OK, rozumiem z tym begin i end, ale od kiedy Depth ustala kolejność wykonywania skryptów?! Przypuśćmy, że mamy jakiś kod składający się z 10 linijek to oczywiste jest, że 10 linia wykona się na samym końcu. Ale Depth?! Tu: http://docs.yoyogames.com/source/dadiospic...ties/depth.html znajduję się potwierdzenie tego co mówię.

GML
draw_recrangle()

draw_sprite()

draw_recrangle()

Okej, ale po co rysować 2x kwadrat? Nie lepiej:

GML
draw_sprite()

draw_recrangle()

Rysowanie sprite'a wykona się jako pierwsze, a kwadratu jako drugie.

Odnośnik do komentarza
Udostępnij na innych stronach

Depth nie ma bezpośredniego wpływu na kolejność wykonywania kodu. Ma wpływ na kolejność obiektów. Event draw w obiekcie z większym depth wykona się przed eventem draw obiektu z mniejszym depth.

Odnośnik do komentarza
Udostępnij na innych stronach

Aaaaa no chyba, że tak. Lecz jeszcze jedna sprawa...

Event draw w obiekcie z większym depth wykona się przed eventem draw obiektu z mniejszym depth.

Większym depth czyli depth=np.:1? Bo nie zapominajmy, że mając np.: 2 obiekty to ten który pojawi się jako ostatni, czyli ukryje drugi będzie miał depth=-1. GM liczbę minusową traktuje... hmmm... powiedzmy "bardziej priorytetowo"? Gdyż obiekty z depth=-x zawsze są na 'wierzchu' w przeciwieństwie do tych z depth=+x. Chociaż z matematycznego punktu widzenia to liczba +x jest większa niż -x. No cóż, tak GM został zaprogramowany, a tego zmienić się nie da.

Odnośnik do komentarza
Udostępnij na innych stronach

OK, już wszystko działa tak jaka chciałem. Jednak zauważyłem bardzo dziwną anomalię: Gdy 1 raz zrobiłem te rysujące się kwadraty (tylko zielone) każdy z nich miał depth=-1 i wszystko działało tak jak powinno. Każdy kwadrat przykrywał wszystko inne, a zduplikowanie tych obiektów i po zmianie na kolor czerwony nagle przestało to działać... Archiwum X ? tylko, że w wersji: Archiwum GM: Return ?

Odnośnik do komentarza
Udostępnij na innych stronach

Jeżeli obiekty maja ten sam depth to i tak musi być jakoś wybrana ich kolejność. Nie ma takiej możliwości aby wykonał się w tym samym momencie. Ta kolejność to instance order w room. Jeżeli go nie ruszasz to kolejność jest wg tego kiedy powstał obiekt.

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...