Skocz do zawartości

Skłonność do zaokrąglania pozycji view


Exigo

Rekomendowane odpowiedzi

Problem istniał od dawna, ale dopiero teraz zaczął mnie wnerwiać. Pytanie klucz: czy istnieje opcja aby pozycja viewa (np. view_xview) miał wartość zmiennoprzecinkową?

 

A chodzi mi o to:

Mój problem leży w zoomie, który działa natywnie w bardzo prosty sposób:

 

view_wview = staly_view_wview / zoom;

view_hview = staly_view_hview / zoom;

(gdzie zoom >= 1)

I tyle.

 

Przy przybliżeniu np. dwukrotnym (zoom = 2), kiedy przypiszę wartości view_xview wartość nie-całkowitą, tak czy siak pozycja ekranu zwraca mi wartość zaokrągloną. W efekcie przemieszczanie kamery jest równoznaczne ze "skakaniem" (przez to zaokrąglanie!) co jest bardzo widoczne przy sporym przybliżeniu.

 

Pomysły? ; )

Odnośnik do komentarza
Udostępnij na innych stronach

Bump.

Wymyśliłem żeby dodać zmienną reprezentującą pozycję view-a jako "kamerę". Dokonuje w niej wszelkich obliczeń, i na koniec nadaję pozycje view-om. Potem obliczam różnicę z tego, i na podstawie wyniku rysuję surface ekranu (fun fact, trzymam wszystko w surface) z tym przesunięciem (różnicą). Strata jest w tym, że na krawędziach ekranu są artefakty, ale przynajmniej nie rzuca nim przy dużym przybliżeniu.

 

Tak to mniej więcej wygląda:

(pozycja kamery jest centrowana na pozycję gracza)

GML
view_xview = kamera_x - (view_wview / 2);

view_yview = kamera_y - (view_hview / 2);

view_wview = startowy_view_wview / kamera_zoom;

view_hview = startowy_view_hview / kamera_zoom;

kamera_xview_roznica = (view_xview + (view_wview / 2) - kamera_x) * kamera_zoom;

kamera_yview_roznica = (view_yview + (view_hview / 2) - kamera_y) * kamera_zoom;

draw_surface_ext(ekran, kamera_xview_roznica, kamera_yview_roznica, 1, 1, 0, c_white, 1);

 

Jeśli ktoś wpadnie na inny pomysł, niech pisze. ; )

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy

Miałem z tym problem w jednym z dem na tegoroczne GDC - rozwiązałem to tak, że te zmienne z pierwszego posta zapisywałem do innych zmiennych, a dopiero powyżej różnicy 2px przesuwałem view, dzięki czemu tak nie skakało. Czyli upłynniałem ten ruch dodatkowymi zmiennymi. Niestety i tak zdarzały się miejsca, gdzie ekran skakał :(

 

Edit: ah, zmieniałem też hspeed roomu na dodatni, to pomaga na za duże skoki.

Odnośnik do komentarza
Udostępnij na innych stronach

Generalnie skoro używasz surface to myślę, że możesz zrezygnować ze standardowego rysowania na rzecz rysowania wszystkiego na surface. Wtedy w zasadzie robisz co chcesz. Przesuwasz, obracasz, skalujesz. Pamiętaj. d3d_transform... ;)

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