Skocz do zawartości
pankracy

Problemy z rozmiarem GUI

Rekomendowane odpowiedzi

Cześć wszystkim,

 

Próbuje od jakiegoś czasu rozwiązać problem ze skalowaniem paska HUD w trybie okienkowym..

Moja gra pracuje na pełnym ekranie w rozdzielczości 1280x720.

W grze ustawiłem sobie możliwość przełączania gry z pełnego ekranu na tryb okienkowy z zachowaniem proporcji obrazu ze skalowaniem.

Wszystko ładnie działa..Prawie wszystko się skaluje w trybie okienkowym,ale pasek HUD nie chce się skalować do wymiarów okna gry..Jest cały czas w takich samych rozmiarach jak na pełnym ekranie..

Próbowałem użyć nawet funkcji

display_set_gui_size()

 

Wpisując odpowiednie wartości czyli połowę

display_set_gui_size(640,360)

 

Pomimo tego nadal pasek HUD nie chce się skalować i wszystkie sprity które są na nim umieszczone.Mało tego jak użyje tej właśnie funkcji to pasek HUD w trybie pełnoekranowym i w trybie okienkowym jest jeszcze większy.

 

Bardzo proszę o waszą pomoc..bo nie mam już pomysłów jak to naprawić..

 

dziękuję

 

Kod wygląda następująco

 

room_display_manager

creacion code

 

window_set_fullscreen(true);

obj_display_manager (trwały)

 

create

 

ideal_width = 0;
ideal_height = 720;

aspect_ratio = display_get_width()/display_get_height();

ideal_width = round(ideal_height * aspect_ratio);

//Sprawdź czy liczba jest nieparzysta
if (ideal_width & 1) {
    ideal_width ++;
}

for (var i=2; i <= room_last; i++) {
    if (room_exists(i)) {
        
        
        view_wview[0] = ideal_width;
        view_hview[0] = ideal_height;
        
        view_wport[0] = ideal_width;
        view_hport[0] = ideal_height;
    }
}


surface_resize(application_surface, ideal_width, ideal_height);

window_set_size(ideal_width, ideal_height);

room_goto(room_next(room));

obj_game_controller

 

step

 

///Przełącz tryb okienkowy
if (keyboard_check_pressed(ord("F"))) {
   window_set_fullscreen(!window_get_fullscreen());
 
   if (!window_get_fullscreen()) {
    window_set_size(obj_display_manager.ideal_width, obj_display_manager.ideal_height);
   }
}

draw GUI

 

/// Wyswietlamy HUD gracza 


draw_set_color(c_white);
draw_sprite(spr_mniejszy_hud,1,50,64);


var __guiW = display_get_gui_width(), __guiH = display_get_gui_height();




//punkty czyli score wysrodkowalem to na HUD 
draw_set_color(c_white);
draw_set_valign(fa_middle);
draw_set_halign(fa_center);
draw_set_font(fn_punkty);
draw_sprite(spr_score,1,310,30);
draw_text(310,75,"$"+string(global.pScore));




// Rozmieszenie monet
draw_set_color(c_white);
draw_set_valign(fa_middle);
draw_set_halign(fa_center);
draw_set_font(fn_punkty);
draw_sprite(spr_coins,1,400,30);
draw_text(400, 75, string(" " + string(global.coins)));



//HP HUD

if instance_exists(par_player) {

 //hpHUD = lerp(hpHUD,par_player.hp,.5);
 hpHUD=global.hp;
 maxHpHUD = par_player.maxHp;
 

 //HUD dopalaczy
 
 with obj_player {
  var _offset;
  _offset = 0;
 
  draw_set_font(fnt_pwrup);
  draw_set_valign(fa_bottom);
  draw_set_halign(fa_center);
  draw_set_color(c_white);
  draw_texture_flush();
 
  if pwrupSpd > 0 {
   draw_sprite_ext(spr_pwrup_speed,0,__guiW-26,29+35*_offset,1,1,0,c_gray,.5);
   draw_text(__guiW-26,29+35*_offset,string(ceil(pwrupSpd/room_speed)));
   _offset++;
  }
  if pwrupStr > 0 {
   draw_sprite_ext(spr_pwrup_strength,0,__guiW-26,35+35*_offset,1,1,0,c_gray,.5);
   draw_text(__guiW-26,35+35*_offset,string(ceil(pwrupStr/room_speed)));
   _offset++;
  }
  if pwrupJmp > 0 {
   draw_sprite_ext(spr_pwrup_jump,0,__guiW-26,28+35*_offset,1,1,0,c_gray,.5);
   draw_text(__guiW-26,28+35*_offset,string(ceil(pwrupJmp/room_speed)));
   _offset++;
  }
 }
} else {
 hpHUD = lerp(hpHUD,0,.5);
}

//HUD zycia


draw_sprite_part(spr_hp_bar,1,1,0,180/maxHpHUD*hpHUD,130,90,14);
draw_set_color(c_white);
draw_set_valign(fa_middle);
draw_set_halign(fa_center);
draw_set_font(fn_punkty);
draw_text(70, 74, string("x" + string(global.life))); //rozmieszczenie wskaznika zyc
draw_sprite(spr_glowa,1,40,1);     





 

 

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

użyj display_set_gui_maximize(), aby ustalić o ile skalować GUI. Zmiana rozmiaru działa jak zmiana szerokości surface - z prawej i na dole po prostu obcinasz obszar rysowania, więc na pełnym ekranie raczej musisz skalować. Ta funkcja pozwala też użyć offsetu dla ekranów dziwnych/innych szerokości.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

A jak to dokładnie obliczyć? mam ustawić tutaj również połowę rozdzielczości obrazu??Pytam,bo nie używałem jeszcze tej funkcji..

 

Mam jeszcze jedno pytanie do tego tematu..

 

Ustawiłem sobie w menu gry zmianę obrazu z trybu pełnoekranowego w tryb okienkowy..

ale myślę,że część kodu nie działa..zwłaszcza ten warunek przy którym napisałem komentarz..

 

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(keyboard_check_pressed(vk_enter) || gamepad_button_check_pressed(0,gp_face1)) {
    if(selected=0) {
        room_goto(room_controls_setup)
    } else if(selected=1) {
        room_goto(room_sound_setup)
    } else if(selected=2) {
        
   window_set_fullscreen(!window_get_fullscreen());
 
//nie wiem czy ten warunek dziala tak jak go tu zaimplementowalem
     if (!window_get_fullscreen()) {
    window_set_size(obj_display_manager.ideal_width, obj_display_manager.ideal_height);
   }


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

 

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
22 minuty temu, pankracy napisał:

A jak to dokładnie obliczyć? mam ustawić tutaj również połowę rozdzielczości obrazu??Pytam,bo nie używałem jeszcze tej funkcji..

To zależy jakie masz rozdzielczości.

 

Jak masz grę 800x600, a fullscreen jest na 1920/1080, to skalowanie wynosi zapewne poziomo 1920/800 i 600/1080 w pionie. Możesz oczywiscie wpisać od razu wynik działania, ale tutaj przynajmniej wiesz o co chodzi o możesz podstawić funkcję display_get_width() albo ..._height() i ustawić do dowolnego monitora.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Grę mam ustawioną na 1280x720 i full screen jest ustawiony na 1280x720

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Teraz tak...w draw gui mam użyć tych dwóch funkcji ?

 display_get_width() lub  display_get_height() oraz  display_set_gui_maximize()

 

 

 

 

 

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Nie wiem co chcesz uzyskać. Jeśli grę i fullscreen masz ustawione na te same rozdzielczości to GUI powinno być dobrego rozmiaru. Jeśli GUI jest ustawione na mniejsze, no to podziel jak pokazałem.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

No właśnie o to chodzi,że po za paskiem HUD wszystko jest dobrze skalowane do rozmiaru okna..

Gra jest ustawiona na pełnym ekranie na 1280x720...i wszystkie mam tak ustawione pokoje na taką rozdzielczość

Tu jest tylko problem z paskiem HUD i spritami które są osadzone na nim...kiedy przełączę się z ekranu (full screen 1280x720) na ekran okienkowy..to pasek HUD ze spritami umieszczonymi na nim nie skalują się do rozmiaru okna..tylko nadal mają pierwotny rozmiar..

 

 

draw GUI

/// Wyswietlamy HUD gracza 


draw_set_color(c_white);
draw_sprite(spr_mniejszy_hud,1,50,64);


var __guiW = display_get_gui_width(), __guiH = display_get_gui_height();




//punkty czyli score wysrodkowalem to na HUD 
draw_set_color(c_white);
draw_set_valign(fa_middle);
draw_set_halign(fa_center);
draw_set_font(fn_punkty);
draw_sprite(spr_score,1,310,30);
draw_text(310,75,"$"+string(global.pScore));




// Rozmieszenie monet
draw_set_color(c_white);
draw_set_valign(fa_middle);
draw_set_halign(fa_center);
draw_set_font(fn_punkty);
draw_sprite(spr_coins,1,400,30);
draw_text(400, 75, string(" " + string(global.coins)));



//HP HUD

if instance_exists(par_player) {

 //hpHUD = lerp(hpHUD,par_player.hp,.5);
 hpHUD=global.hp;
 maxHpHUD = par_player.maxHp;
 

 //HUD dopalaczy
 
 with obj_player {
  var _offset;
  _offset = 0;
 
  draw_set_font(fnt_pwrup);
  draw_set_valign(fa_bottom);
  draw_set_halign(fa_center);
  draw_set_color(c_white);
  draw_texture_flush();
 
  if pwrupSpd > 0 {
   draw_sprite_ext(spr_pwrup_speed,0,__guiW-26,29+35*_offset,1,1,0,c_gray,.5);
   draw_text(__guiW-26,29+35*_offset,string(ceil(pwrupSpd/room_speed)));
   _offset++;
  }
  if pwrupStr > 0 {
   draw_sprite_ext(spr_pwrup_strength,0,__guiW-26,35+35*_offset,1,1,0,c_gray,.5);
   draw_text(__guiW-26,35+35*_offset,string(ceil(pwrupStr/room_speed)));
   _offset++;
  }
  if pwrupJmp > 0 {
   draw_sprite_ext(spr_pwrup_jump,0,__guiW-26,28+35*_offset,1,1,0,c_gray,.5);
   draw_text(__guiW-26,28+35*_offset,string(ceil(pwrupJmp/room_speed)));
   _offset++;
  }
 }
} else {
 hpHUD = lerp(hpHUD,0,.5);
}

//HUD zycia


draw_sprite_part(spr_hp_bar,1,1,0,180/maxHpHUD*hpHUD,130,90,14);
draw_set_color(c_white);
draw_set_valign(fa_middle);
draw_set_halign(fa_center);
draw_set_font(fn_punkty);
draw_text(70, 74, string("x" + string(global.life))); //rozmieszczenie wskaznika zyc
draw_sprite(spr_glowa,1,40,1);     

 

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
Godzinę temu, pankracy napisał:

nim nie skalują się do rozmiaru okna..tylko nadal mają pierwotny rozmiar..

No tak, GUI nadal będzie mieć 1280x720, tak jak w momencie startu gry - jeśli nie podasz inaczej w kodzie. Jeśli chcesz przeskalować, to musisz zrobić tak:

 

// create:

display_set_gui_size(1280, 720); // wymuś zawsze taki rozmiar na każdym monitorze

 

// skalowanie - przy zmianie ekranu (nie trzeba co krok)

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

 

Reszta kodu którą tutaj podajesz nie ma związku z problemem.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

te rozwiązanie nie działa..

ale odkryłem jedną zależność..

na scenerii tam gdzie się rozgrywa akcja gry i jest bohater to mam dwa obiekty które kontrolują grę...

jeden z tych obiektów miał włączoną dodatkową aplication_surface..wyłączyłem to..i teraz widać idealnie jak skaluje pasek HUD jak gra przechodzi  w tryb okienkowy...

Ale jest jedno ale...

kod do zmiany trybu z full screen na okienkowy umieściłem chwilowo w step jednego z tych kontrolerów które wyłącznie znajdują się na scenerii gry(nie  w menu głównym gry)

Jak ten sam kod umieszczę w menu głównym gry.to nie skaluje mi paska HUD...

Teraz mam zagadkę jak to naprawić..jest to dość uciążliwe zjawisko...bo bez sensu jak będę zmieniał tryb pełno ekranowy i okienkowy w samej rozgrywce..Od tego mam specjalne miejsce w menu gry..

 

Przejrzałem już czy nie mam gdzieś w menu głównym i opcji jakiegoś kodu z aplication_surface i nic już nie ma...

 

 

to jest ten kod....

 

jak umieszczę go w zdarzeniu step np w obiekcie obj_game_controller który jest obiektem trwałym w nim jest w draw GUI pasek HUD i on znajduje się wszędzie ten obiekt po za planszami menu gry game over i highscore...czyli tam gdzie jest gracz..To tutaj skalowanie idealnie działa

 

if (keyboard_check_pressed(ord("F"))) {
   window_set_fullscreen(!window_get_fullscreen());
 
   if (!window_get_fullscreen()) {
    window_set_size(obj_display_manager.ideal_width, obj_display_manager.ideal_height);
   }
}

natomiast ten sam kod jak mam w menu gry opcji(tam gdzie nie ma obj_game_controller)

 

to nie skaluje mi paska HUD

 

room_menu

obj_opcje

 

step

 

if(keyboard_check_pressed(vk_enter) || gamepad_button_check_pressed(0,gp_face1))  {
    if(selected=0) {
        room_goto(rm_controls_setup)
    } else if(selected=1) {
        room_goto(rm_sound_setup)
    } 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(roo_menu)
    }
}

 

 

 

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Zobrazowałem to na poniższym obrazku jak to wygląda...wszystko poza paskiem HUD się skaluje do rozmiaru okna gry.

 

Pełny ekran full screen  view 1280x720 i tryb okienkowy view 1280x720

 

 

przyklad.png

 

 

 

Edit..

 

Jeśli użyje kodu który mi podałeś...

to sytuacja jest wtedy taka:

w oknie gry pasek jest takiej samej wielkości jak przy pełnym ekranie full screen,a na pełnym ekranie full screen pasek jest zmniejszony i pasowałby do okna gry..

 

obj_display

 

create

display_set_gui_size(1280, 720)

draw GUI

 

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

Pomyślałem sobie..zmienię wartości..

więc zrobiłem tak

 

w create zostało jak jest..a w draw gui zmieniłem wartości na takie..

 

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

Teraz w oknie gry pasek skaluje się prawidłowo,ale na pełnym ekranie jest jeszcze mniejszy...czyli i te rozwiązanie nie jest dobre..

 

 

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

No dobrze, a podstawiłeś sobie cyferki pod dzielenie i sprawdziłeś wynik? Wtedy byś wiedział, skąd błąd. Bardzo możliwe, że podałem na odwrót kolejność, bo nie wiem czemu, założyłem, że podajemy ile razy pomniejszyć GUI, a przecież dla mniejszego okna musi być < 1. Możliwe też, że window_get_width() na pełnym ekranie zwraca wartość okienka niepełnego, chociaż byłoby to dziwne - no ale to już musiałbyś sobie na ekran/w output wrzucić ten wynik, dla pewności.

 

Zatem, na pełnym ekranie:

display_set_gui_maximize( 1, 1 );

a w oknie:

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

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Fakt...masz rację nie podstawiłem sobie cyfry pod dzielenie.

czy przypadkiem tu nie ma być

 

display_set_gui_size(1, 1)

zamiast

 

display_set_gui_maximize( 1, 1 );

?

 

 

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

A zajrzałeś kiedyś do dokumentacji ? display_set_gui_size ustawi Ci interfejs na 1x1 piksel, zdecydowanie tego nie chcesz :)

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Łobuz z Ciebie;-)

 

Dobra...pytam,bo nie używałem tej funkcji wcześniej...

a napisałeś ją dwukrotnie z innymi wartościami stąd moje pytanie;-)

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

I dupka;-)

 

teraz w trybie okienkowym są dobre proporcje paska hud,a w trybie pełny ekran pasek jest bardzo malutki..jeszcze mniejszy niż w trybie okienkowym..

 

create

 

display_set_gui_maximize( 1, 1 );

draw gui

 

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

Może muszą być większe te wartości niż 1?

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Czyli nie przeczytałeś dokumentacji, tak jak sądziłem :gnysek:Masz dwa różne tryby ekranu, wiec musisz odpowiednio do niego używać innego kodu skalowania GUI, stąd problem.

Żeby nie ustawiać tego co krok, wystarczy sprawdzać, czy właśnie się nie zmienił tryb ekranu i go zapamiętywać.

 

// create
display_set_gui_size(1280, 720)
full_screen = -1;


// step
if (full_screen != window_get_fullscreen()) {
full_screen = window_get_fullscreen();
	if (full_screen) {
		display_set_gui_maximize( 1, 1 );
	} else {
		display_set_gui_maximize( 720/window_get_width(), 360/window_get_height() );
	}
}

Oczywiście przy innych monitorach niż Twój, zamiast 1,1 będzie dzielenie przez display_get_width() i ..._height() .

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Wiesz..dokumentacja to pojęcie szeroko rozumiane:-)

Nie przeczytałem książki gms...ale przeczytałem krótki opis tej funkcji...

Z której zrozumiałem jak zrozumiałem.

 

Gnysku,

Czy pod obsługę innych monitorów niż mój muszę zmienić te wartości z 1,1 na dzielenie przez display_get_width() i ..._height() .?

 

 

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Gnysku,

 

Teraz skaluje się pasek HUD do rozmiaru okna...

Jeszcze jedna rzecz...nie chce skalować się pauza a skalowała się i zegar gry...który jest w prawym górnym rogu..

Jak jest na pełnym ekranie to wszystko ładnie wygląda i jest na swoim miejscu..kiedy przełączę na tryb okienkowy pasek HUD też się ładnie już skaluje,ale nie skaluje się pauza i zegar.

 

Odkryłem tą zależność..jak włączę ten kod poniżej to zegar i pauza skalują się,ale wtedy pasek HUD nie skaluje się....

Jak to naprawić?

Pauza i zegar też jest rysowany na warstwie GUI

 

obj_game_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]);
}

edit

 

tak to wygląda jak na obrazku

 

 

TAK TO WYGLADA.png

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Zmieniasz display_set_gui_size na view_wport[0],view_hport[0], które nie muszą być równe ani rozmiarowi okna, ani ekranu i jeszcze mogą być różne na pełnym ekranie i na okienkowym, więc nie mam pojęcia co się dzieje w Twojej grze :) Generalnie zalecałbym tego nie zmieniać, skoro wcześniej ustaliliśmy, że tylko w create to ląduje, a teraz nagle zmieniasz warunki.

Proponuję wyświetlić sobie te wartości na ekranie:

 

draw_text(10,10, string(view_wport[0]) + ", " + string(view_hport[0]));

I wtedy się dowiesz co się dzieje i jakie są różnice.

 

A co do czytania manuala... całego nie musisz czytać, ale ja po wejściu w opis dowolnej funkcji staram sie przeczytać wszystkie o podobnej nazwie w tym samym dziale (albo i sam wstęp do działu), co pomaga zrozumieć wiele podstaw i zależności. Bez przeliczenia co obecnie masz i co ma kiedy jaki rozmiar - niewiele zrozumiesz, musisz trochę prostej matematyki (głównie dzielenia i mnożenia) odbębnić.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Gnysku tak..

 

 

Teraz pytanie dlaczego pauza i zegar narysowane na warstwie GUI (draw GUI) przy zmianie na tryb okienkowy nie chcą zmienić swojego położenia dopasowanego do okna gry...?

 

 

 

 

Pomogło wyświetlić wartości na ekranie..

draw_text(10,10, string(view_wport[0]) + ", " + string(view_hport[0]));

 

Przy wyłączonym tym poniżej kodzie

 

///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]);
}
*/

Tryb pełnoekranowy wyświetla informacje 1280x720

a tryb okienkowy wyświetla informacje 1280x720

pauza i zegar gry bez względu na tryb gry czy to pełnoekranowy czy okienkowy ich położenie jest złe nie są na swoim miejscu

Pasek HUD jest usytuowany w porządku

 

Natomiast przy włączonym poniżej kodzie

 

///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]);
}

Tryb pełnoekranowy wyświetla informacje 1920x1080

a tryb okienkowy wyświetla informacje 1280x720

Tu pauza i zegar w trybie pełnoekranowym są dobrze umieszczone,ale kiedy przełączymy na tryb okienkowy ich położenie jest złe(jest takie same jak w powyższym wcześniejszym przypadku) pasek HUD jest usytuowany w porządku

 

Tylko teraz...jak to naprawić? aby i pauza i zegarek które są narysowane na warstwie GUI tak samo skalowały się jak reszta rzeczy

 

Tak to ostatecznie powinno wyglądać jak na poniższym obrazku

 

 

tak powinno byc.png

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Przede wszystkim wywal display_set_gui_size z tego fragmentu powyżej, bo tym zmieniasz rozmiar gui na jakiś inny, więc może i się wtedy rysuje inaczej. Poza tym, jeśli uzależniasz pozycję od rozmiaru okna czy view, to na pełnym ekranie i w okienku one są różne. Np. rysowanie napisu pauza na środku ja bym zrobił tak:

draw_set_halign(fa_center);

draw_text(display_get_gui_width()/2, 50, "Pauza");

Wtedy zawsze będzie na środku.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Już usunąłem display_set_gui_size z tego poprzedniego kodu.

Ja mam na środku pauze..jest w zdarzeniu draw GUI...

 

zobacz

 

obj_pauza_controller (wywołuje on obiekt obj_pauza na ekranie)

 

step

 

if keyboard_check_pressed(vk_escape)
{
if !instance_exists(obj_pauza)
    {
    instance_create(0, 0, obj_pauza);
    
    }
}

 

obj_pauza

 

draw gui

 

draw_set_color(c_fuchsia);
draw_set_font(fn_pauza);
draw_set_halign(fa_center);
draw_set_valign(fa_middle);



draw_text( display_get_gui_width()/2, display_get_gui_height()/2-200,"PAUSED");




draw_set_font(fn_pauza);
draw_set_valign(fa_middle);
draw_set_halign(fa_center);

if (interest == "continue")
{

   
   draw_text_colour(display_get_gui_width()/2, display_get_gui_height()/2-100,"CONTINUE",c_red,c_red,c_red,c_red,1)
   draw_text_colour(display_get_gui_width()/2, display_get_gui_height()/2,"RESTART",c_white,c_white,c_white,c_white,1)
   draw_text_colour(display_get_gui_width()/2, display_get_gui_height()/2+100,"EXIT",c_white,c_white,c_white,c_white,1)
}
else if (interest == "restart")
{

    draw_text_colour(display_get_gui_width()/2, display_get_gui_height()/2-100,"CONTINUE",c_white,c_white,c_white,c_white,1)
    draw_text_colour(display_get_gui_width()/2, display_get_gui_height()/2,"RESTART",c_red,c_red,c_red,c_red,1)
    draw_text_colour(display_get_gui_width()/2, display_get_gui_height()/2+100,"EXIT",c_white,c_white,c_white,c_white,1)
}
else if (interest == "exit")
{

   draw_text_colour(display_get_gui_width()/2, display_get_gui_height()/2-100,"CONTINUE",c_white,c_white,c_white,c_white,1)
   draw_text_colour(display_get_gui_width()/2, display_get_gui_height()/2,"RESTART",c_white,c_white,c_white,c_white,1)
   draw_text_colour(display_get_gui_width()/2, display_get_gui_height()/2+100,"EXIT",c_red,c_red,c_red,c_red,1)
}
else if (interest == "main manu")
{

   draw_text_colour(display_get_gui_width()/2, display_get_gui_height()/2-100,"CONTINUE",c_white,c_white,c_white,c_white,1)
   draw_text_colour(display_get_gui_width()/2, display_get_gui_height()/2,"RESTART",c_white,c_white,c_white,c_white,1)
   draw_text_colour(display_get_gui_width()/2, display_get_gui_height()/2+100,"EXIT",c_red,c_red,c_red,c_red,1)
}

tak samo zegar patrz

 

 

obj_timer

 

draw gui

 

var i, notimer_room;
notimer_room = false;
for (i = 0; i < ds_list_size(global.RT_room_list); ++i) {
    if (ds_list_find_value(global.RT_room_list, i) == room) { notimer_room = true; break; }
}


if (notimer_room == false)
{ 



draw_set_font(fnt_zegar);
draw_set_color(c_white);
draw_set_halign(fa_right);
draw_set_valign(fa_top);


draw_text(display_get_gui_width()+30-string_width(time_string), 0, "CZAS: " + time_string);
draw_text(display_get_gui_width()-string_width(fps),y-5,"FPS: " + string(fps));

}

Na pełnym ekranie jest wszystko w porządku z pozycja pauzy i zegara...

jeśli nie zmniejszymy paska hud i zegara oraz pauzy to pozycja w okienku też wtedy jest w porządku tych rzeczy,ale są one za duże..

 

jest tak obecnie

 

 

 

TAK TO WYGLADA.png

 

a powinno być tak

 

 

tak powinno byc.png

 

To jest dziwna sytuacja..bo skoro na warstwie GUI jest narysowana pauza i zegar gry to powinni dostosować się do trybu okienkowego...

Wygląda to tak,że przez zmianę rozmiaru pauzy i zegara podczas zmiany w tryb okienkowy zmienia się ich pozycja...

Pasek hud ma swoją stałą pozycję bo jest usytuowany cały czas w lewym górnym rogu bez względu na rozmiar okna gry..

 

 

 

zmniejszając całą warstwę GUI przy trybie okienkowym...zmienia się ich położenie...tylko pasek HUD ma prawidłowe położenie a pauza i zegar już nie...w trybie okienkowym

display_set_gui_maximise(720/window_get_width(),360/window_get_height());

 

 

 

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Nie wiem co mam odpowiedzieć, bo to nie są screeny z gry. Widać, że fonty mają ten sam rozmiar, wiec nie wiem co się dzieje w Twojej grze. Zalecam wypisanie sobie na ekranie wszelkich wartości i sprawdzenie, czy faktycznie są dobre proporcje (dlaczego w ogóle 720 i 360?).

 

Dla pewności, jako 3 i 4 argument w display_set_gui_maximize możesz podać 0,0, żeby się offset nie robił - co oczywiście jest w dokumentacji.

 

Wciaż też twierdzisz, że tryb okna i pełnego ekranu maja tę samą rozdzielczość co nie jest możliwe :)

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Źle mnie Gnysek zrozumiałeś...

 

wyjaśniam ;-)

 

użycie tych wartości

 

display_set_gui_maximise(720/window_get_width(),360/window_get_height());

powoduje,że w trybie okienkowym pasek hud pauza i zegar mają dobry rozmiar..tylko umiejscowienie pauzy i zegara jest złe.Narysowałem to na tych dwóch obrazkach gdzie są umiejscowione;-)

 

i teraz sztuczka.. jak ustawię te wartości na takie

 

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

To wtedy pasek HUD,pauza i zegar jest takiej samej wielkości jak na pełnym ekranie jak przełączę się w tryb okienkowy..plusem tego rozwiązania,że wszystko jest wtedy na swoim miejscu pauza i zegar..ale wszystko jest powiększone i rozmiarów takich jak na pełnym ekranie;-)

 

Teraz rozumiesz co mam na myśli?

 

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

czyli tak dać argument;-)

 

display_set_gui_maximise(720/window_get_width(),0,360/window_get_height(),0);

 

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

nie, dwa ostatnie 0,0  - zajrzyj w końcu do dokumentacji i przeczytaj opis funkcji!

 

Poza tym, jeśli tylko jeden element jest źle, a reszta ok, to znaczy, że coś po drodze zmienia rozmiary. Muszą być albo wszystkie źle, albo wszystkie dobrze, nie może być pół na pół.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

jak pasek HUD ma pozycję x,y nie wycentrowaną tylko 0,0 to chyba tak myślę jest to wytłumaczenie dlaczego sam pasek HUD jest prawidłowo usytuowany..bo przecież jego pozycja nie zmieni po przełączeniu w tryb okienkowy..

 

 

ok już zajrzałem i sprawdzam teraz te wartości..

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Gnysek,

Sprawdziłem...

Nie mam w żadnym z obiektów kodu który zmienia gdzieś po drodze rozmiary.

W menu gry idealnie wszystko wygląda bo tam nie używam view ponieważ menu gry jest w natywnej rozdzielczości 1280x720 a scenerie mają różne wymiary i włączony view gdzie wszędzie ustawiam podgląd gry na 1280x720

 

 

Skoro przy użyciu tego poniżej kodu te trzy obiekty pasek HUD zegar i pauza skalują się o te wartości to chyba jest to w porządku prawda?

 

display_set_gui_maximise(720/window_get_width(),0,360/window_get_height(),0);

One mają dobre w trybie okienkowym rozmiary..ale położeniew trybie okienkowym pauzy i zegara jest w złym miejscu..

nie wiem jak mam to bardziej wytłumaczyć:-)

jak wstawie takie np wartości

 

display_set_gui_maximise(1280/window_get_width(),0,720/window_get_height(),0);

To te trzy obiekty pasek hud zegar i pauza nie zmniejszają się i są takie same jak na pełnym ekranie i w trybie okienkowym..A ich umiejscowienie w trybie pełnoekranowym i okienkowym jest prawidłowe

 

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Gnysek..

Uwierz mi że jest takaa sama rozdzielczość w trybie pełnoekranowym i w oknie czyli 1280x720

 

Sprawdziłem to jak podałeś mi kod

 

draw_text(10,10, string(view_wport[0]) + ", " + string(view_hport[0]));

 

..i mi wyświetliły się te wartości na ekranie

Wspomniałem Ci że wyłączyłem ten jedyny kod który miał te hport w kodzie i na włączonym tamtym kodzie tryb pełnoekranowy pokazywał

1920x1080 a okienkowy 1280x720..ale to wyłączyłem..

Pytasz czemu takie wartości tu zasugerowałem?

 

display_set_gui_maximise(720/window_get_width(),0,360/window_get_height(),0);

bo to jest przecież połowa rozdzielczości w jakiej gra ma podgląd gry. Stąd takie proporcje..

Ja obstawiam..że coś źle jest w tej linijce..może faktycznie musiałbym podać xoffset i yoffset? Nie wartości 0,0 tylko wstawić odpowiednią wartość która w trybie okienkowym przesunie mi na środek pauze i na prawy górny róg zegarek?

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

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

Zaloguj się tutaj

  • Przeglądający   0 użytkowników

    Brak zarejestrowanych użytkowników, przeglądających tę stronę.

×