Skocz do zawartości

Problemy z rozmiarem GUI


Rekomendowane odpowiedzi

  • Administratorzy

Dobra, wiem gdzie jest pies pogrzebany. window_get_size() przez pierwsze kilka klatek po wyjściu z pełnego ekranu nadal zwraca wielkość ekranu na fullscreenie i dlatego jest błąd. Poprawiłem go tak:

 

// create

display_set_gui_size(1280, 720)
full_screen = -1;

// step

if (full_screen != window_get_fullscreen()) {
	full_screen = window_get_fullscreen();
	alarm[0] = 10;
}

// alarm0

if (full_screen) {
	display_set_gui_maximize( 1, 1 );
} else {
	display_set_gui_maximize( window_get_width()/1270, window_get_height()/720 );
}

// moje draw GUI:
draw_set_halign(fa_center);
draw_text( window_get_width()/2, 20, "Pause");

Wystarczyło za pomocą show_debug_message wyrzucić sobie co zwraca window_get_width() .

Odnośnik do komentarza
Udostępnij na innych stronach

To nie pomaga...ale coś odkryłem...Gnysku i wygląda na to,że jest to przyczyna powstawania tego problemu

 

otóż..

 

kiedy tutaj wstawię zamiast

 

display_set_gui_maximize( window_get_width()/1280, window_get_height()/720 );

 

 

to

 

display_set_gui_maximise( room_width/1280,room_height/720 );

Przecież mam włączone view w planszach gdzie mam scenerię gry i chodzę bohaterem..a view wszędzie jest ustawiony na 1280x720..wiadomo,że sceneria ma rożne wymiary,ale to nie ma wpływu na wyświetlanie się na warstwie GUI pauzy zegara i paska HUD prawda?

To przez dosłownie ułamek sekundy w trybie okienkowym pasek hud oraz zegar jest w prawidłowej pozycji i ładnie skalowany..ale zaraz to znika..

pauza też przez ułamek sekundy jest dobrze skalowana i w dobrej pozycji,ale później już się psuje..Wiem wina alarmu...można to naprawić?

 

 

 

 

 

 

 

 

tu przykład...

 

menu gry nie mam włączonych view,bo tam grafika ma rozmiary planszy czyli 1280x720...

a plansze gdzie jest rozgrywka w grze gdzie chodzi bohater są różnego rozmiaru,ale z ustawionym podglądem gry view 1280x720...wszędzie tak ustawiłem

 

 

view room.PNG

 

 

Edycja 1

 

Wywaliłem w zdarzeniu step linijkę z alarmem

alarm[0] = 10;

I teraz wszystkie jest w porządku;-) pauza zegar i pasek hud idealnie skalują się na warstwie GUI na małym ekranie..I dopasowują swoją pozycję.;-)

Widzisz...mówiłem,że coś jest z tą linijka kodu nie tak;-)jednak coś tam mi świtało wujaszku Gnysku ;-)

Mam nadzieje,że na różnych monitorach będzie to cały czas w tym samym miejscu pauza zegar i pasek hud...nie tylko na moim monitorze..

 

Ostatecznie zostawiłem ten kod tylko wywaliłem tą linijkę..więc kod jest w zdarzeniu step w alarm[0](chociaż chyba tam nie powinien teraz być) i w create

Jednak jak dam go do step to się wszystko psuje..a w Alarm0 jest idealnie..

 

ostatecznie kod wygląda tak

 

// create

display_set_gui_size(1280, 720)
full_screen = -1;

// step

if (full_screen != window_get_fullscreen()) {
	full_screen = window_get_fullscreen();
	
}

// alarm0

if (full_screen) {
	display_set_gui_maximize( 1, 1 );
} else {
	display_set_gui_maximise( room_width/1280,room_height/720 );
}

 

Sprawdzisz czy tak to powinno wyglądać?

 

ok jeszcze po za tym mam dwa pytania do tego tematu..

 

1.Kiedy przechodzę z plansz gameplayu do menu gry to używam tego kodu aby nie psuło mi grafiki gry..bo zawsze tak jest...pewnie ma to wspólnego ze mianą rozdzielczości itp...

Mam to włączone i jest ok..jednak mam pytanie,czy ta poniżej linijka kodu powinna być też włączona? bo obecnie jak ją włączam to wtedy psuje mi się całe gui

 

 

obj_grafika_poprawa

 

create

 

surface_resize(application_surface,room_width,room_height)
//display_set_gui_maximise()//tu wyłaczylem tą linikę,bo przy włączonej tej funkcji psuje mi się całe gui w oknie gry

obj_grafika_poprawa1

 

step

 

if(instance_exists(obj_global_controller))
{with(obj_game_controller){instance_destroy()}}
surface_resize(application_surface,room_width,room_height)
//display_set_gui_maximise() //to samo wyłaczyłem bo włączenie tej funkcji psuje mi gui..na w oknie gry
draw_texture_flush()

 

i pytanie drugie

2. Mam w menu opcji przycisk który naciskam i zmienia mi się tryb wyświetlania gry..pełny ekran/okno i wyświetla mi się też informacja czy jest to tryb pełnoekranowy czy okienkowy...

Ale jest jeden mankament z tym wyświetlaniem..Otóż kiedy wejdę do menu opcji..i wybiorę pozycję zmiany wyświetlania obrazu i pokaże mi się jak nacisnę ENTER napis na przycisku windowed i zmieni się tryb na okienkowy to jeśli jeszcze raz wejdę do menu opcji to nie wyświetla mi się napis windowed tylko display..

i analogicznie to samo jak teraz nacisnę przycisk ENTER to przełączy mnie na full screen i wyświetli się napis na przycisku full screen,ale jak znów wejdę do menu opcji to zamiast wyświetlać się napis full screen wyświetla mi się napis display..

Wiem,że to ma związek z tym,że w zdarzeniu create mam tak to zdefiniowane i nazwane..jak usunę nazwę display z create i nic nie wstawię to nic mi się nie wyświetla i przycisk jest pusty..więc coś musiałem tam wpisać..

Reasumując..

 

Chciałbym aby w menu opcji przycisk jak przejdę w tryb okienkowy to wyświetlał mi się napis windowed nawet jak wejdę po raz drugi do tego menu opcji..póki nie przełączę się w tryb pełnoekranowy i analogicznie tak samo przy pełnym ekranie full screen chce żeby mi się w menu opcji wyświetlał nawet jak wrócę do tej opcji póki nie zmienię go na tryb okienkowy windowed.

 

ok tak wygląda zaprogramowany przycisk

 

 

obj_opcje

 

create

 

options=ds_list_create()
options[|0]=("Controlls")
options[|1]=("Sound")
options[|2]=("Display")
options[|3]=("Back")


selected=0

gp_up=false
gup_down=false
gp_left=false
gp_right=false

//Używane do animacji menu
animation_speed=room_speed/4
for(var i=0; i<ds_list_size(options); i++) {
    animation[i]=0
}

step

 


if(abs(gamepad_axis_value(0,gp_axislv))<0.3 && !keyboard_check(vk_anykey))
    {
    gp_up=0
    gp_down=0
    }
    
if(abs(gamepad_axis_value(0,gp_axislh))<0.3 && !keyboard_check(vk_anykey))
    {
    gp_left=0
    gp_right=0
    }  

if(keyboard_check_pressed(vk_down) || gamepad_button_check_pressed(0,gp_padd) || (gamepad_axis_value(0,gp_axislv)>0.7 && !gp_up)) {
    selected++
    if(selected>=ds_list_size(options)) {
        selected=ds_list_size(options)-1
    }
    gp_up=true
}

if(keyboard_check_pressed(vk_up) || gamepad_button_check_pressed(0,gp_padu) || (gamepad_axis_value(0,gp_axislv)<-0.7 && !gp_down)) {
    selected--
    if(selected<0) {
        selected=0
    }
    gp_down=true
}



if(keyboard_check_pressed(vk_enter) || gamepad_button_check_pressed(0,gp_face1))  {
    if(selected=0) {
        room_goto(room_setup_controlls)
    } else if(selected=1) {
        room_goto(room_setup_sound)
    } else if(selected=2) {
       
   window_set_fullscreen(!window_get_fullscreen());
   options[|2]=("Fullscreen")

     if (!window_get_fullscreen()) {
    window_set_size(obj_display_manager.ideal_width, obj_display_manager.ideal_height);
    options[|2]=("Windowed")

   }


    } else if(selected=3) {
        room_goto(room_main_menu)
    }
}

draw

 

 

draw_set_valign(1)
draw_set_halign(1)
draw_set_font(font_menu)

var line_height=ceil(string_height("M")*1.1)

for(var i=0; i<ds_list_size(options); i++) {
    if(i=selected) {
        //Wybrana opcja
        animation[i]=clamp(animation[i]+(1/animation_speed),0,1)
    } else {
        animation[i]=clamp(animation[i]-(1/animation_speed),0,1)
    }
    var color=merge_colour(c_white,c_red,animation[i])
    var s=options[|i]
    draw_text_transformed_color(x,y+(line_height*i),s,1+animation[i]/5,1+animation[i]/5,0,color,color,color,color,1)
}

 

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy

Za dużo tego, żeby ktokolwiek czytał. Jeśli chcesz zadawać pytania, to musisz konkretnie, a nie ścianę kodu. Jeśli zmieniasz rozmiary okien, to musisz umieć dzielić i mnożyć, żeby ustalić proporcje.

Poza tym korzystasz z GMS 1.4, które nie jest wspierane już trzeci rok, więc tam rzeczy działają inaczej i już nie bardzo nawet mam ochotę się cofać do różnic z wersją obecną, a akurat na tym tle są.

Rozmiary okien, widoków, skalowania można ustawiać na różne sposoby - im więcej tym mieszasz, tym łatwiej wpaść w tarapaty, wiec zawsze, ale to zawsze sprawdź jakie są wartości wszystkiego i czy są odpowiednie proporcje - odpowiedzi powinny wtedy przyjść same.

 

btw.

 

if (window_get_fullscreen()) {
options[|2]=("Fullscreen")
} else {
options[|2]=("Window")
}
Przecież napis się nie zmienia, bo go ustawiasz na sztywno w create (tworząc zawsze nową mapę) a zmieniasz tylko jak klikasz enter, wiec oczywiste, że się nie zmieni sam, bez kliknięcia.
Odnośnik do komentarza
Udostępnij na innych stronach

Dziękuję...pomogło...miałeś rację w zdarzeniu create na sztywno miałem przypisaną nazwę dla przycisku..

Wiem,że gms 1.4 jest nie wspierany od 3 lat,ale sporo osób jeszcze go używa..ba nawet znam takich co jeszcze używają wersję 8.1

Gnysku powiedz mi jeszcze...

uszczuplę kod żeby nie wklejać tu wszystkiego..

 

czy ta część kodu powinna być w zdarzeniu alarm[0] lub dowolny inny alarm?

bo jak wrzucę to do zdarzenia step to gui się psuje...więc mam to w alarmie i jest teraz dobrze..

 

czyli mam dokładnie tak

 

// create

display_set_gui_size(1280, 720)
full_screen = -1;

// step

if (full_screen != window_get_fullscreen()) {
	full_screen = window_get_fullscreen();
	
}

// alarm0

if (full_screen) {
	display_set_gui_maximize( 1, 1 );
} else {
	display_set_gui_maximise( room_width/1280,room_height/720 );
}

 

No i druga ostatnia już sprawa...bo nie chce Cie już męczyć..przynajmniej dziś ;-) nie no żartuje...dużo mi pomogłeś i bardzo dziękuję Ci za pomoc..

 

Używam tego kodu do naprawy wyświetlania grafiki jak skończę grę i wracam do menu gry...

i to ładnie działa..ale jak mam teraz nowy kod od ciebie to zakomenderowałem tą linijkę kodu

 

display_set_gui_maximise()

Ponieważ wtedy rozwala mi się menu GUI..raz jest ok,a raz nie..dlatego to wyłączyłem i tego zjawiska już nie ma..

ale pytanie,czy muszę tu wstawić jakieś wartości? czy wystarczy,że to wyłączyłem..

 

poniżej kod..

 

obj_poprawa_grafika

 

create

 

surface_resize(application_surface,room_width,room_height)
//display_set_gui_maximise()//tu wyłaczylem tą linikę,bo przy włączonej tej funkcji psuje mi się całe gui w oknie gry

obj_poprawa_grafika1

 

step

 

if(instance_exists(obj_global_controller))
{with(obj_game_controller){instance_destroy()}}
surface_resize(application_surface,room_width,room_height)
//display_set_gui_maximise() //to samo wyłaczyłem bo włączenie tej funkcji psuje mi gui..na w oknie gry
draw_texture_flush()

 

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy

Zjadłeś alarm[0] = 10 w step, bez tego alarm sie nigdy nie wykona.

 

Nie wiem też po co zmieniasz application_surface, to się powinno zmieniać tylko jak zmianie ulega rozmiar renderowanego okna gry i tylko jak używasz application_surface, a nie wiem czy go w ogóle używasz.

Odnośnik do komentarza
Udostępnij na innych stronach

Używam jeszcze w jednym obiekcie aplication_surface..tak było od początku w tym silniku gry...tylko usunąłem tą linijkę którą mi zasugerowałeś żebym to zrobił,bo wychodziły wtedy dziwne anomalia z rozdzielczością

Zostawiłem sobie tak:

 

na pełnym ekranie mimo,że mam view ustawiony na 1280x720 to gra uruchamia się na pełny ekran i pokazuje 1920x1080 ok tak mi odpowiada..zresztą to już dawno jest standardem i większość monitorów to obsłuży..

Natomiast w oknie gry samo dostosowuje sobie proporcje ekranu tylko muszę ustawić szerokość np 720p lub inną dowolną

 

obj_global_controller

 

begin step

 

///Wyswietlanie widoku okna gry

if (view_wport[0] != window_get_width() || view_hport[0] != window_get_height()) && window_get_width() != 0 {
 view_wport[0] = window_get_width();
 view_hport[0] = window_get_height();
 view_hview[0] = view_wview[0]/view_wport[0]*view_hport[0];
 surface_resize(application_surface,view_wview[0],view_hview[0]);
//display_set_gui_size(view_wport[0],view_hport[0]); //wersja podstawowa
}

co do alarmu nie zjadłem go..tylko celowo usunąłem bo jak jest włączony to znika mi pasek gui lub dziwnie się zachowuje..dlatego usunąłem tą linijkę

 

 

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy

Ale jak uniesz tą linijkę, to sie nie wykonuje reszta kodu. Zatem display_set_gui_maximize nie musisz uzywać, tak by wychodziło. Co do application_surface i viewów... no to tak jak sobie chcesz zrobić, tak musisz to ustawić, ja nie będę za Ciebie zgadywał. Musisz sam ustalić, czy na pełnym ekranie gra ma być powiększona czy 1:1, tak samo w trybie okienkowym. I samemu przeskalować to, przeliczyć proporcje itd. Nie jestem wróżką, żeby wiedzieć co chcesz osiągnąć, a application_surface, viewy i gui to trzy różne warstwy które mogą mieć różne rozmiary. Do tego application surface samemu powinno sie w jakimś post_draw rysować i wtedy też można to robić z innym rozmiarem niż 1:1, więc za dużo tu jest czynników i trzeba pod siebie wszystko ustawić po prostu, spokojnie to rozrysowując i przeliczając na kartce papieru.

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