Skocz do zawartości
nowy_user

Draw GUI pod spodem

Rekomendowane odpowiedzi

Cześć wszystkim, 

 

dziś szybkie pytanie: Jak narysować GUI pod spodem, pod wszystkimi innymi obiektami, tak jak jest rysowane tło ( dla GMS1.4) ? Z dokumentacji wynika, że Event Draw_GUI rysuje rzeczy zawsze nad innymi obiektami, niezależnie od Depth. Ma to sens , w końcu to GUI. Jednak to, co ja chciałbym zrobić to swego rodzaju tło, które jest niezależne od ustawienia naszego viewa, a także niezależne od zoomu. Właściwie zainspirowało mnie do tego IDE GMS2 które jest bardzo dynamiczne i ma właśnie zastosowany taki fajny patent: Rozmyte tło, które zawsze jest takie samo, niezależnie od zmiany pozycji na naszym workplace. Pozostaje również niewzruszone przy przybliżaniu i oddalaniu kamery.

 

Teoretycznie można to zrobić za pomocą funkcji draw_background_ext;    i użycie zwykłego eventu draw, umieszczonego w obiekcie o Depth równym 999999. Jest to jednak droga na około, wymagająca ciągłego skalowania tła przy przybliżaniu i oddalaniu ekranu. Raz, że nie jest to pewnie najbardziej wydajny sposób, a dwa, że jakość tła może wtedy się obniżyć. 

 

Intuicja podpowiada mi, że można to załatwić eventem Draw_GUI, ale czegoś mi tu brakuje, żeby to zadziałało.

 

Będę wdzięczny za wkazówki!

nowy_user

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

odejmij pozycję x i y view od x i y backgrounda to ci się nie będzie ruszać. 

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Cześć, Draw GUI rysuje się zawsze na końcu, niezależnie od depth innych obiektów. Depth służy wtedy do sortowania innych elementów GUI. Nie widzę takiej możliwości, aby rysować GUI jako tło.

 

Cytuj

You may notice depth issues when using this event due to the fact that it is not dealt with the same was as the traditional draw event. What happens is that the normal draw events for all instances are resolved first, once each for each active view, and then the draw GUI events for all instances are resolved. So the depth order between instances with draw GUI events is always respected, as is the depth order between instances with normal draw events, but the draw GUI events will always draw over anything drawn in the normal draw event, even if the instance doing the drawing it is at a higher depth than other instances.

https://docs.yoyogames.com/source/dadiospice/000_using gamemaker/events/draw gui event.html

 

Twoja propozycja z dedykowanym obiektem jest jak najbardziej dobrym rozwiązaniem. Tylko, że zamiast draw_background_ext możesz użyć chociażby draw_background_stretched.

 

Coś takiego:

draw_background_stretched(bg_niebo, view_xview[0], view_yview[0], view_wview[0], view_hview[0])

 

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Dziękuję serdecznie za odpowiedzi. Rzeczywiście opcja z draw_background_stretched wydaje się bardzo sensowna, pewnie z niej właśnie skorzystam, dzięki zatem za sugestię. Właściwie to wcześniej też przymknęło mi to prez myśl, jedyny minus tego rozwiązania jest taki, że plik graficzny backgrounda musi być idealnie przycięty na rozmiar viewa, aby tło nie było rozciągnięte ani w jedną ani w drugą stronę. Żeby przyciąć : to nie jest problem, gorzej jeśli view jest dynamiczny, a chcąc tworzyć aplikację na różne  monitory, ( i chcąc uniknąć czarnych pasków po bokach , lub na górze i dole) warto pomyśleć o dostoswaniu rozmiaru viewa do monitora. W tym aspekcie korzystam z youtubowego tutoriala Pixelated Pop'a "Resolution and Aspect Ratio Management for Game Maker" , który polega mniej więcej na tym że podaje się wartości dla viewa: ideal_width i ideal_height , natomiast rzeczywiste width i height  są pewną niewiadomą, bo zależą od monitora i mniej lub bardziej pokrywają się z wartościami ideal_width i ideal_height.

 

Hmm w takiej sytuacji może lepiej  byłoby stworzyć background o 30 % większy od viewa zarówno w osi wertykalnej jak i horyzontalnej, i nie musiec nic rozciągać , a w razie szerszego monitora, po prostu więcej powierzchni backgrounda byłoby objęte w view'ie. Tylko tutaj trzeba pamiętać aby skalować background wraz z zoomem używając draw_background_ext.

 

Dzięki za odpowiedzi, najprawdopodobniej własnie skorzystam z opcji draw_background_stretched. 

 

Pozdrawiam,

nowy_user

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Żeby utrzymać rozmiar backgrounda, to musiałbyś policzyć tzw. aspect ratio i bazować na nim podczas rysowania tła. Przypuśćmy, że masz backgrounda 1024x1024 i chcesz go rozciągnąć na całego viewa:

 

// szerokosc okna jest wieksza niz jego wysokosc, liczymy aspect ratio jako: szerokosc / wysokosc
if (view_wview[0] > view_hview[0]) {
    var aspect = view_wview[0] / view_hview[0];
    var sx = ((view_wview[0] - view_hview[0]) / aspect) * 0.5;
    draw_background_stretched(bg_tlo, view_xview[0] - sx, view_yview[0], view_wview[0] + sx * 2.0, view_hview[0]);
}
// wysokosc okna jest wieksza niz jego szerokosc, liczymy aspct ratio jako: wysokosc / szerokosc
else {
    var aspect = view_hview[0] / view_wview[0];
    var sy = ((view_hview[0] - view_wview[0]) / aspect) * 0.5;
    draw_background_stretched(bg_tlo, view_xview[0], view_yview[0] - sy, view_wview[0], view_hview[0] + sy * 2.0);
}

 

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Dziękuję za skrypt, i za pochylenie się nad problemem. Niestety skrypt nie dokońca spełnia swojej funkcji i dalej roziąga i wydłuża tło nie uwzględniając aspect ratio. Dzięki jednak na sprowadzenie mnie na właściwe tory, pogłówkowałem trochę i stworzyłem działający skrypt:

 

var bg_tlo = back_blur;
displayw=display_get_width();
displayh=display_get_height();
    
draw_background_stretched(bg_tlo, view_xview[0], view_yview[0] , displayw*o_starter.Zoom, displayh*o_starter.Zoom);

Ten kod zdaje się działać prawie tak jak chciałem. I pomimo, że w trakcie rozgrywki możemy zmieniać sobie rozmiar i  aspect ratio okna, a także możemy przybliżać i oddalać, to tło zawsze pozostanie niewzruszone - tak jak np. w IDE GMS2 , a dokładnie taki efekt chciałem uzyskać. Jedyny minus mojego rozwiązana jest taki, że przy mniejszych oknach, tło które będzie się nam wyświelać zawsze będzie premiowało lewy górny róg zamiast środka naszego wgranego backgrounda, ale pewnie i z czasem na to znajdę patent. Dzięki za pomysły i inspirację :)

 

Pozdrawiam,

Nowy

 

EDIT Zerknąłem jeszcze raz  na IDE GMS2 , i tam jest jednak ta prostsza wersja, przy rozciąganiu okna tło też się rozciąga, więc przy np. bardzo wąskich  ale wysokich oknach, tło jest bardzo ściśnięte - wygląda kiepsko. Powinni zrobić to co ja, czyli przy mniejszych oknach wyświetlać tylko kawałek tła, którego apsect ratio nie jest zmienione. U mnie zatem tło będzie lepiej się prezentowało niż w samym IDE GMS2 ^^

 

 

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

zrobić event pre-draw (i odznaczyć "clear background color") ? pre-draw chyba będzie wymagał dodania pozycji viewa do rysowania, ale sprawdź. Ja tak jakieś surface rysowałem w którymś projekcie.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

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

Tylko 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ę tutaj.

Zaloguj się tutaj

  • Przeglądający   0 użytkowników

    Brak zarejestrowanych użytkowników, przeglądających tę stronę.

×