Skocz do zawartości

Skalowanie ekranu na androidzie, gdy room jest większy niż view.


hgter

Rekomendowane odpowiedzi

Witajcie

 

Problem jest pewnie banalny, ale coś poległem.

 

W przypadku roomów o wielkości view korzystam z poniższego kodu wywoływanego na początku wczytywania każdego roomu (to nie jest mój kod, przyznaję):

 

GML
if os_type == os_windows

{

device_w = window_get_width();

device_h = window_get_height();

}

else

{

device_w = display_get_width();

device_h = display_get_height();

}

 

window_set_size(device_w, device_h);

game_w = room_width;

game_h = room_height;

device_aspect = device_w / device_h;

game_aspect = game_w / game_h;

 

if device_aspect/game_aspect>=1

{

view_wview[0] = game_h * device_aspect;

view_hview[0] = game_h;

offset_y=0;

offset_x = (game_w - view_wview[0])/2;

view_xview[0] = offset_x;

view_yview[0] = room_height - game_h;

}

else

{

view_wview[0] = game_w;

view_hview[0] = game_w / device_aspect;

offset_x=0;

offset_y = (game_h - view_hview[0])/2;

view_xview[0] = room_width-game_w;

view_yview[0] = offset_y;

}

view_wport[0] = device_w;

view_hport[0] = device_h;

 

 

idt=tile_add(til_outofscreen, 0, 0, 15, 15, -300, -300, 99999);

tile_set_scale(idt, 20, 120);

idt=tile_add(til_outofscreen, 0, 0, 15, 15, 1280, -300, 99999);

tile_set_scale(idt, 20, 120);

idt=tile_add(til_outofscreen, 0, 0, 15, 15, 0, -300, 99999);

tile_set_scale(idt, 120, 20);

idt=tile_add(til_outofscreen, 0, 0, 15, 15, 0, 720, 99999);

tile_set_scale(idt, 120, 20);

 

 

Celem tego jest dopasowanie roomu do wyświetlacza. Proporcje roomu zostają zachowane a jeżeli wyświetlacz ma inne to wyświetlane są czarne paski (robię to czarnym rozciągniętym tilem na samym końcu - bez tego w miejscu czarnych pasków wyświetla się tło roomu).

 

Problem jest gdy roomy są większe niż view. Tu rzecz w tym, że takie skalowanie dla większych roomów teoretycznie nie ma sensu. Bo nie ma sensu wyświetlać pasków jeżeli room jest większy bo można bez problemu użyć całego wyświetlacza. Tyle, że ja mam roomy o różnej wielkości i chciałbym aby były wyświetlane tak samo - czyli z paskami. Ma ktoś z Was pomysł jak uzyskać dla dużych roomów view o takiej samej proporcji jak dla mniejszych?

 

 

 

 

Odnośnik do komentarza
Udostępnij na innych stronach

Zamiast tila nie lepiej użyć koloru roomu(background color w zakładce backgrounds roomu)

 

Tylko, że to nie działa. Jeżeli nie dam tila to wyświetla się to co teoretycznie jest poza roomem z tłem roomu. Ustawienie koloru roomu nic nie zmienia tutaj. Jeżeli nie dam grafiki na tło to okno przyjmuje ten kolor (także na tym obszarze gdzie normalnie mam paski), ale normalnie wszędzie mam grafikę tła. Myślę, że jest to efekt wyłączonych surface.

 

I dokładnie taki efekt by mnie zadowalał w przypadku dużych roomów (paski sobie dodaję ręcznie i jest ładnie). Ale tam albo mam zapełniony cały ekran normalną treścią roomu (także tam gdzie w małych rumach jest "pustka" która przykrywam czarnym tilem) i nie ma jak dać pasków albo room jest zmniejszony tak, że się cały mieści.

 

Teraz rozwiązałem to tak, że duże roomy wyświetlam na całej powierzchni ekranu bez względu na proporcje (na jednych urządzeniach w danym momencie widać trochę mniej niż na innych) a w przypadku małych tam gdzie były czarne tile mam rozszerzone grafiki stanowiące "ramkę" roomu. W rezultacie to ile tej ramki widać jest zależne od urządzenia. Efekt nie jest zły, ale jednak wolałbym paski.

Odnośnik do komentarza
Udostępnij na innych stronach

Cały dzień zabawy i się udało:)

 

Może komuś się przyda.

 

Kluczem było odpowiednie użycie danych liczonych dla małych roomów. Przy uruchamianiu pierwszego małego roomu wywoływany jest kod z pierwszego posta.

 

Ale po nim dodałem:

 

GML
global.ekran_szer=1280+2*abs(offset_x)

global.ekran_wys=720+2*abs(offset_y)

global.pasek_x=offset_x

global.pasek_y=offset_y

 

Co wylicza mi dane potrzebne do wyświetlenia dużego roomu (liczby to wielkość view czyli 1280x720)

 

Przy jego starcie wywołuję:

 

GML
view_wview[0]=global.ekran_szer //1280

view_hview[0]=global.ekran_wys //800

view_xview[0]=global.pasek_x //0

view_yview[0]=global.pasek_y //-40

view_wport[0]=device_w //pobieram wcześniej

view_hport[0]=device_h

 

Wartości w komentarzach to wartości podczas skalowania view 1280x720 do ekranu 1920x1200 - podane dla przykładu.

 

 

To powoduje, że jeżeli proporcje ekranu różnią się od mojego pierwotnego view to na ekran idzie też trochę tego co znajduje się poza view (co powoduje, że przy krawędziach wyświetlają się dane spoza roomu). Potem te dodatkowe obszary przysłaniam czarnymi paskami.

 

Mamy natomiast dwa "ale".

 

Po pierwsze, ponieważ wyświetlam także obszary spoza roomu, przestaje poprawnie działać podążanie view za obiektem. To trzeba samemu zakodować. Podobnie jeżeli mamy ręcznie przesuwane view.

 

I po drugie, tym razem nie możemy czarnych pasków narysować tilem, bo te paski muszą się przy przesuwaniu view także przesuwać. Musimy je narysować w odpowiednich miejscach zależnych od view.

 

Całość działa dokładnie tak jak miała. Jeżeli proporcja ekranu się nie zgadza to pojawiają się dodatkowe paski zarówno przy roomach o wielkości view jak i większych.

 

Rozwiązanie banalne, ale zabawy było od groma.

 

 

PS A miałem grać w Fallouta cały dzień.

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