Skocz do zawartości

Rekomendowane odpowiedzi

Opublikowano

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? ; )

Opublikowano

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. ; )

  • Administratorzy
Opublikowano

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.

Opublikowano

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... ;)

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