Skocz do zawartości

[GM:S] Dynamiczne skalowanie viewportu/śledzenie 3 obiektów


Huri

Rekomendowane odpowiedzi

Cześć :)

Ech dawno mnie tu nie było ale swoich projektów nie zarzuciłem totalnie. Zrobiłem sobie po prostu przerwę.

 

Mam jednak wciąż ten sam problem. Szukałem na forum ale nie znalazłem nic konkretnego.

 

Otóż mam 3 obiekty, którymi gracz steruje jednocześnie. Cały etap gry jest większy niż okno i w momencie gdy jeden z obiektów wydostaje się poza widoczny obszar viewport powinien się skalować z jednoczesnym zachowaniem proporcji a gdy nie ma takiej potrzeby (obiekty są blisko siebie) viewport powinien się zmniejszać. Jak można to osiągnąć?

 

Doszedłem do momentu, w którym... Dobra. Nie będę zaśmiecał waszych głów tym co naskrobałem. Macie może jakieś pomysły?

Jutro postaram się opisac problem dokładniej z obrazkami jeśli coś jest niezrozumiałe... Dodam też kod, który mam, ale obstawiam, że jest do wywalenia mimo, że działa "prawie" tak jakbym chciał...

 

Pozdrawiam :)

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy

Przelicz obecną proporcję ekranu, np. 1024/768 = 0.75; Potem zrób żeby szerokość viewa, to była odległość między najbliższym i najdalszym obiektem:

 

GML
var a = min(objA.x, objB.x, objC.x);

var b = max(objA.x, objB.x, objC.x);

 

view_wview[0] = b-a+20; // 20 to dodatkowy border po 10 na kazda strone, zeby obiekty nie były ucinane

view_hview[0] = view_wview[0]*0.75;

 

To tak w podstawowej wersji, a jak chcesz też z wysokością no to się musisz więcej pobawić, ale podstawę logiki masz :)

Odnośnik do komentarza
Udostępnij na innych stronach

Generalnie to robiłem tak jak napisałeś. Z jedną małą ale istotną różnicą. Ale się nie przyznam na czym polegał mój błąd bo wstyd...

Z nową wiedzą postaram się przerobić kod, który miałem dotychczas żeby jeszcze pion działał jak należy ;). Ale nie pogniewam się jak mi ktoś podpowie coś więcej ;)

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy

Wyliczasz to samo dla pionu i jeżeli szerokość jest większa, to używsz kodu jak wyżej (dwie ostatnie linijki), a jak wysokość, to na odwrót - wysokości dajesz wyliczony rozmiar, a szerokość to ona * 1.33 (1024/768 = 1.33, 768/1024 = 0.75). Także dodajesz 4 linijki kodu, z czego dwie to if (szerokosc > wysokosc) oraz else.

Odnośnik do komentarza
Udostępnij na innych stronach

EDIT: Już wiem.. Działa... nie wywaliłem 2 linijek kodu ;)

 

 

Kurcze. Przepraszam, że wykazuje się tu brakiem logicznego myślenia. Ale nie mogę dojść do tego co napisałeś.

Ja mam tak przy rozdzielczości 960x540:

 

GML
maxx=max(obj_rat64.x,obj_rat2_64.x,obj_rat3_64.x);

minx=min(obj_rat64.x,obj_rat2_64.x,obj_rat3_64.x);

maxy=max(obj_rat64.y,obj_rat2_64.y,obj_rat3_64.y);

miny=min(obj_rat64.y,obj_rat2_64.y,obj_rat3_64.y);

 

max_distx=(maxx-minx);

max_disty=(maxy-miny);

 

view_xview = minx-128;

view_yview = miny-128;

 

view_wview = (max_distx)+512;

view_hview = view_wview[0]*0.5625;

 

I to działa świetnie... Czy mój kod na skalowanie w pionie powinien wyglądać tak?

GML

GML
if max_disty>max_distx

{

view_wview = (max_disty)+512;

view_hview = view_wview[0]*0.5625;

 

}

else

{

 

view_hview = max_disty+512;

view_wview = view_hview*1.77;

}

 

Niby działa ale czasami zdarza się, że obiekty gracza znikają z ekranu.

Zresztą pokaże jak to wygląda na filmie :)

 

 

 

 

 

Wyliczasz to samo dla pionu i jeżeli szerokość jest większa, to używsz kodu jak wyżej (dwie ostatnie linijki), a jak wysokość, to na odwrót - wysokości dajesz wyliczony rozmiar, a szerokość to ona * 1.33 (1024/768 = 1.33, 768/1024 = 0.75). Także dodajesz 4 linijki kodu, z czego dwie to if (szerokosc > wysokosc) oraz else.
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ę...