SDL2 Obliczenie proporcji tekstury do rozdzielczości okna
Ostatnio zmodyfikowano 2017-07-13 11:26
Mentaris Temat założony przez niniejszego użytkownika |
SDL2 Obliczenie proporcji tekstury do rozdzielczości okna » 2017-07-11 12:05:01 Witam, natywna rozdzielczość to 1920x1080.
Powiedzmy dla przykładu że mam okno 800x600, tak wiec chce zescalować teksturę tak by jej wielkość była proporcjonalna do wielkości okna jak i by znajdowała się w tym samym miejscu co w przypadku wielkości natywnej. Próbowałem w ten sposób iż obliczałem ile procent z liczby 1920 jest liczby 800 i w tedy zamieniałem ją na "po przecinku" i wywoływałem z tym SDL_RenderSetScale. Jednakże jakoś nie za bardzo mi to wyszło. Podkreślę że mówimy tutaj o interface-sie, czyli przyciski, okna w samej grze etc.
Wie może ktoś jak to obliczyć/zrobić?
Napomnę jeszcze tylko że znalazłem w internecie coś takiego:
gameobject.x = 10 game_resolutionx / 1600; gameobject.y = 10 game_resolutiony / 1200;
Gdzie 1600x1200 to niby natywna rozdzielczość. Jednak za chiny nie wiem jak to poprawnie zinterpretować.
|
|
pekfos |
» 2017-07-11 20:03:50 1920x1080 i 800x600 to nawet nie są te same proporcje. Jeśli przeskalujesz układ z różnymi współczynnikami dla osi X i Y, to obraz będzie zajmować cały ekran, ale z zaburzonymi kształtami. W zależności, czy wolisz przycinać, czy dodawać paski, przeskaluj obie osie przez maksimum, lub minimum z tych dwóch współczynników. Mowa o przeskalowaniu układu, a więc przemnożeniu współrzędnych wszystkich punktów geometrii, a więc nie samych współrzędnych obiektów. Nie wiem jak to wygląda w SDLu, ale w bibliotekach opartych o OpenGL (np SFML), jest to trywialne do uzyskania i nic nie kosztuje, bo wystarczy dorzucić transformacje do macierzy, przez którą i tak wszystko przejdzie. |
|
Mentaris Temat założony przez niniejszego użytkownika |
» 2017-07-13 11:26:25 Rozumiem, poradziłem już sobie w ten sposób: SDL_RenderSetScale(renderer, 800/1920.0f, 600/1080f); Bądź można to ręcznie float rescale = (float)intrfc->clientArea.h / 1080; x = round(x * rescale); y = round(y * rescale); w = round(w * rescale); h = round(h * rescale);
Dziękuje za poradę, temat do zamknięcia. |
|
« 1 » |