Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

SDL2 Obliczenie proporcji tekstury do rozdzielczości okna

Ostatnio zmodyfikowano 2017-07-13 11:26
Autor Wiadomość
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ć.
P-163191
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.
P-163199
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.
P-163236
« 1 »
  Strona 1 z 1