Skocz do zawartości

dopasowanie textboxa do rozmiaru kilku view


pankracy

Rekomendowane odpowiedzi

Cześć wszystkim.

Właśnie jestem na etapie tworzenia menu gry w którym będę zmieniał rozdzielczość:

Dostępne będą:

 

1024x768

1280x720

 

Pytanie..bo mam textboxa...jest on dopasowany do ekranu 1024x600 i 1024x768.

jak ustawie view na 1280x720 to cały textbox jest już w innym miejscu na planszy..

 

Czy jest możliwość ustawić tak żebym nie musiał ręcznie zmieniać parametrów texboxa w draw? zresztą jak chce mieć dwie rozdzielczości to chciałbym żeby textbox dopasował się do rozmiaru view.

 

 

myślałem o użyciu funkcji

 

application_surface;

 

Ale nie wiem czy dobrze kombinuje...

 

tak wygląda kod obj_textbox

 

obj_textbox

 

Create

 

alpha=0; //przeswitywalnosc
step=0; //kolejne zadanie przez nas wykonywane - KROK
text=''; //tekst jaki mamy wyswietlic
leght = 0;

Step

 

if(variable_global_exists("textq")) //Jesli zmienna global.textq istenieje, to wykonuj ponizszy kod
{
  if(ds_exists(global.textq, ds_type_queue)) //Jesli data structure istnieje, to wykonuj ponizszy kod
  {
    if not ds_queue_empty(global.textq) and global.text_get=true
    //jezeli [kolejka] nie jest pusta i mozna [pobrac tekst]
        {
        global.text_get=false;//wylacz pobieranie tekstu, aby funkcja sie juz nie wywolala, dopuki znowu nie bedzie true
        text=ds_queue_dequeue(global.textq);//pobierz tekst z kolejki
        step=1;//ustaw zadanie na jeden

        leght=0;
        }
    //KROK 1
    if step=1
        {
        //zmniejszamy przeswitywalnosc az do max. widocznosci (1)
        if alpha<1 then alpha+=0.1 else
            {
            //przeswitywalnosci juz nie ma, zatem skoncz wykonywanie tego skryptu
            alpha=1;
            step=2;
            }
        }
    //KROK 2
    if step=2
        {
        if leght<string_length(string(text)) then leght += 1; // Mozesz zmienic predkosc "drukowania" testu dodajac inna liczbe do zmiennej leght
        }

    //KROK 3
    if step=3
        {
        //teraz zwiekszaj przeswitywalnosc az do znikniecia (0)
        if alpha>0 then alpha-=0.1 else
            {
            //przeswituje juz tak ze bardziej nie moze
            alpha=0;
            text='';

            global.text_get=true;//ustaw, ze mozna juz pobierac tekst
            step=0;
            }
        }
  }
}

Draw

 



vx=view_xview[0];
vy=view_yview[0];
// ^^ dodatkowe zabezpieczenie gdybysmy wlaczyli viewy, jak nie ma wloczonych
//i tak dziala jak nalezy

//teraz malujemy tlo tekstu
draw_set_alpha(alpha/2);
draw_set_color(c_gray);
    draw_rectangle(vx+10,vy+550,vx+1000,vy+460,false);
  

//teraz malujemy obwodke
draw_set_alpha(alpha);
draw_set_color(c_black);
    draw_rectangle(vx+10,vy+550,vx+1000,vy+460,true);
    //draw_rectangle(vx+10,vy+550,vx+1895,vy+460,true);
//a teraz tekst, za pomoca draw_text_ext, zeby nie wyjechal poza prawa strone
draw_set_color(c_black);
    draw_set_font(font_text);
    draw_set_halign(fa_left);
    draw_set_valign(fa_top);

    draw_text_ext(vx+12,vy+586-20-100-2,string_copy(string(text),1,round(leght)),-1,596);
    draw_set_alpha(1);
    
    

 

Odnośnik do komentarza
Udostępnij na innych stronach

Kurcze..źle pytanie sprecyzowałem.

Draw gui ustawi mi textbox na środku ekranu,a ja chce taki efekt uzyskać jak niżej na obrazku 1

 

obrazek 1

1024x600 - chce żeby ten textbox był na dole ekranu tak jak na tej rozdzielczości i bez względu czy ustawie rozdzielczość 1024x600 czy wyższą

https://drive.google.com/open?id=1y4aiN-GNA3jEJIOnbCv5Q2m9fzD9b2CB

 

 

obrazek 2

1280x720 - tu jest na tej rozdzielczości źle..textbox mój znajduje się już wyżej na ekranie

 

https://drive.google.com/open?id=1CUJwNXVHpfCZpWtfTFU-Fd6fI5itzq0X

 

 

Odnośnik do komentarza
Udostępnij na innych stronach

Albo użyj funkcji display_set_gui_size i ustaw tam stałą wartości dla np. 1024x600, albo zamiast na stałe ustawiać pozycję jak np. draw_rectangle(30, 400, 994, 570, false) to przelicz pozycję od ramek ekranu, np. używając display_get_gui_width i display_get_gui_height, coś takiego:

var w = display_get_gui_width();
var h = display_get_gui_height();

var x1 = 30;
var y1 = h - 230;
var x2 = w - 30;
var y2 = h - 30;

draw_rectangle(x1, y1, x2, y2, false);

 

Odnośnik do komentarza
Udostępnij na innych stronach

Próbowałem użyć funkcji display_set_gui_size();  w evencie draw gui w obj_textbox wpisałem wartości display_set_gui_size(600, 1024); ale kiedy pojawia mi się plansza pierwsza gry,to mam bardzo duży pasek HUD i jest bardzo rozciągnięty.

Pasek HUD musi być w draw_gui bo cały czas występuje w grze.

 

Użyłem też w evencie draw obj_textbox drugiego rozwiązania,ustawiłem pozycję ramki od ekranu no i sytuacja jest taka,że jak jest plansza już z textboxem to

na planszy intro o wymiarach 1024x600  prostokąt jest pod tesktem:/,

A na kolejnej planszy już grze o stałych wymiarach 1280x720 to prostokąt textboxa jest w podobnym położeniu co wyżej na screenie pokazałem

 

w draw obj_textbox mam tak

 

vx=view_xview[0];
vy=view_yview[0];




var w = display_get_gui_width();
var h = display_get_gui_height();

var x1 = 10;
var y1 = h - 550;
var x2 = w - 1000;
var y2 = h - 460;


//teraz malujemy tlo tekstu
draw_set_alpha(alpha/2);
draw_set_color(c_gray);
draw_rectangle(x1, y1, x2, y2, false);


var w = display_get_gui_width();
var h = display_get_gui_height();

var x1 = 10;
var y1 = h - 550;
var x2 = w - 1000;
var y2 = h - 460;



//teraz malujemy obwodke
draw_set_alpha(alpha);
draw_set_color(c_black);
draw_rectangle(x1, y1, x2, y2, true);



//a teraz tekst, za pomoca draw_text_ext, zeby nie wyjechal poza prawa strone
draw_set_color(c_black);
    draw_set_font(font_text);
    draw_set_halign(fa_left);
    draw_set_valign(fa_top);

    draw_text_ext(vx+12,vy+586-20-100-2,string_copy(string(text),1,round(leght)),-1,596);
    draw_set_alpha(1);

 

 

 

 

 

 

 

 

 

Odnośnik do komentarza
Udostępnij na innych stronach

Rozumiem,że masz na myśli GUI teraz paska HUD hmmm..ale to może bałaganu narobić Mi..

 

pasek hud jest w obj_game_controler który jest obiektem persistent

 

 

obj_game_controler

draw GUI

 

/// Wyswietlamy HUD gracza

//draw_sprite(spr_glowny_hud,1,383,100);
draw_set_color(c_white);
draw_sprite(spr_mniejszy_hud,1,50,64);


//draw_text(39, 68, string("    Score: " + string(global.pScore)));
var __guiW = display_get_gui_width(), __guiH = display_get_gui_height();


//draw_sprite(spr_healthbar,0,60,20);
//draw_sprite(spr_hp_bar,0,120,20);


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



// Zegarki rozmieszczenie spritow i liczb
draw_set_color(c_white);
draw_set_valign(fa_middle);
draw_set_halign(fa_center);
draw_set_font(fn_punkty);
draw_sprite(spr_watch,1,500,30);
draw_text(480, 75," "+string(global.watch)+" / 5");

// 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,32,0,91/maxHpHUD*hpHUD,32,34,4);
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);     //sprite glowy anatola przy pasku zycia
//draw_sprite(spr_serduszko,1,160,74);




 

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy

Nie musisz nic kodu rysowanie zmienić.

 

Użyj:

 

display_set_gui_size(1024, 768); czy jak tam chcesz

 

a potem

 

var _w_percentage = display_get_height()/768 * (1024/768);

display_set_gui_maximise( _w_percentage, display_get_height()/768, ( 1024*_w_percentage - display_get_gui_width()) / 2, 0);

 

i powinno załatwić sprawę. To wyżej przeskaluje GUI do obecnego rozmiary ekranu utrzymując proporcje i przesunie o tyle pikseli w lewo ile wynosi różnica między rozmiarami. Jakoś tak to będzie, proporcje piszę z głowy teraz - ale w tym artykule który podlinkowałem było to opisane, niepotrzebnie szukasz problemu gdzie indziej.

Odnośnik do komentarza
Udostępnij na innych stronach

Kurcze w tym musi być problem w wyświetlaniu

 

mam ustawiony widok w obiekcie na mapie gry

 

obj_global_controler

 

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
}

 

Jak go wyłączę to texbox wraz z tekstem zmienia mi położenie

 

Gnysek..

tak też zrobiłem dałem w evencie draw Gui

 

 display_set_gui_size(1024, 768); 

 
var _w_percentage = display_get_height()/768 * (1024/768);

display_set_gui_maximise( _w_percentage, display_get_height()/768, ( 1024*_w_percentage - display_get_gui_width()) / 2, 0); 

To mi wyśrodkowało centralnie na górze ekranie pasek HUD,który powinien być jak zawsze jest w lewym górnym rogu.

 

Mi kurcze nie chodzi o centrowanie obrazu...

Ja chce uzyskać taki efekt: napisze prościej bo mnie chyba nie rozumiecie.

 

Stworzyłem sobie opcje zmiany rozdzielczości;

1.Rozdzielczość 1024x600

2.Rozdzielczość 1024x768

3.Rozdzielczość 1280x720

 

I chciałbym uzyskać taki efekt,że jak zmienię na jakąkolwiek inną rozdzielczość ekranu grę,to textbox który był na dole przy rozdzielczości 1024x600 to też chce żeby tam się znajdował.

Nie mam być wycentrowany na środku ekranu tylko ma być na dole ekranu jak na tym obrazku na każdej z tych rozdzielczości:

 

tak jak tu: 1024x600

 

https://drive.google.com/file/d/1y4aiN-GNA3jEJIOnbCv5Q2m9fzD9b2CB/view

 

Tak samo chce żeby się w tym samym miejscu znajdował w rozdzielczości

 

1024x768 i 1280x720 właśnie o to mi chodzi..

Nie wiem jak to nazwać skalowanie obrazu?

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy

ok, no to nie zostaje nic innego, jak rysować textbox od środka gry

 

czyli np. na tej zasadzie (pseudokod).

 

var _x = view_width/2;

var _y = view_height;

 

draw_rectangle(_x -100, _y - 50, _x + 100, _y + 100);

Odnośnik do komentarza
Udostępnij na innych stronach

Przepraszam chłopaki,że was męczę w tej sprawie...

 

Kombinowałem różnych rozwiązań,ale jednak zmienia swoje położenie,więc zrezygnowałem z tych rozwiązań:/

Nie pomogło wymusić stałego położenia textboxa,bo przy zmianie rozdzielczości to i tak zmienia swoje położenie i zmniejsza się przy wyższej rozdzielczości.

Idealnie jest na rozdzielczości 1024x768 natomiast na 1280x720 jest mniejszy i jest w złym miejscu.

Ja rozumiem,że wyższa rozdzielczość powoduje to,że ten obiekt się zmniejsza i zmienia swoje położenie,ale jak to rozwiązać,żeby się rozciągnął/dopasował i zajął takie same lub zbliżone położenie jak na rozdzielczości 1024x768

Tak jak na obrazku poniżej..tak to wygląda jak zmienię rozdzielczość z 1024x768 na 1280x720 to textbox zmniejsza się i położenie jego jest w innym miejscu niż na rozdzielczości 1024x768

 

image.thumb.png.de196842ab590dd4b8e08177bfea5c32.png

 

próbowałem też tego rozwiązania w evencie draw w obj_text

 


 

przykład

var _x = view_width/2;

var _y = view_height;


draw_rectangle(_x -100, _y - 50, _x + 100, _y + 100);

ale nie rozpoznaje mi tej funkcji

view_width i view_height

Nie powinno być?

window_get_width() i window_get_height() ?

 

 

obj_text

 

DRAW

 

///zostawilem rozwiazanie jak bylo na poczatku

vx=view_xview[0];
vy=view_yview[0];
// ^^ dodatkowe zabezpieczenie gdybysmy wlaczyli viewy, jak nie ma wloczonych
//i tak dziala jak nalezy

//teraz malujemy tlo tekstu
draw_set_alpha(alpha/2);
draw_set_color(c_gray);
    draw_rectangle(vx+10,vy+550,vx+1000,vy+460,false);
  

//teraz malujemy obwodke
draw_set_alpha(alpha);
draw_set_color(c_black);
    draw_rectangle(vx+10,vy+550,vx+1000,vy+460,true);
    //draw_rectangle(vx+10,vy+550,vx+1895,vy+460,true);
//a teraz tekst, za pomoca draw_text_ext, zeby nie wyjechal poza prawa strone
draw_set_color(c_black);
    draw_set_font(font_text);
    draw_set_halign(fa_left);
    draw_set_valign(fa_top);

    draw_text_ext(vx+12,vy+586-20-100-2,string_copy(string(text),1,round(leght)),-1,596);
    draw_set_alpha(1);

 

Odnośnik do komentarza
Udostępnij na innych stronach

Nie wiem jak operujesz rozdzielczością, ale może spróbuj tak:
 

draw_rectangle(view_xview + 200, (view_yview + view_hview) - 400, (view_xview + view_wview) - 200, (view_yview + view_hview) - 100, false);

albo
 

draw_rectangle(view_xview + 200, (view_yview + view_hport) - 400, (view_xview + view_wport) - 200, (view_yview + view_hport) - 100, false);


Napisałem z pamięci, nie testowałem.

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy
52 minuty temu, pankracy napisał:

Tak Gnysku widziałem...napisałeś pseudokod...zgadza się

dlatego zapytałem się,czy nie powinno być użyte


window_get_width() i window_get_height()?

 

Jeżeli view ma inny rozmiar niż okno to nie, wtedy view_wview[0] i view_hview[0].

Odnośnik do komentarza
Udostępnij na innych stronach

Dobra textbox jest już idealnie ustawiony..dzięki chłopaki..za pomoc zwłaszcza dla SimianVirus7:-)

Jeszcze tylko tekstem jest problem z textboxa bo zmienia mi pozycje jak zmienię rozdzielczość z 1024x768 na 1280x720 to wtedy tekst jest nad textboxem,a nie w textboxie

na rozdzielczości 1024x768 jest dobrze tekst usytuowany bo w textboxie,a na 1280x720 jest nad textboxem.

 

 

Ostatecznie tak to wygląda

 

Obj_text

 

Draw

 

///ustawienie i narysowanie textboxa na planszy
// ^^ dodatkowe zabezpieczenie gdybysmy wlaczyli viewy, jak nie ma wloczonych
//i tak dziala jak nalezy

vx=view_xview[0];
vy=view_yview[0];


//teraz malujemy tlo tekstu
draw_set_alpha(alpha/2);
draw_set_color(c_gray);
draw_rectangle(view_xview + 10, (view_yview + view_hview) - 120, (view_xview + view_wview) - 10, (view_yview + view_hview) - 30, false);  
    
    
//teraz malujemy obwodke
draw_set_alpha(alpha);
draw_set_color(c_black);
draw_rectangle(view_xview + 10, (view_yview + view_hview) - 120, (view_xview + view_wview) - 10, (view_yview + view_hview) - 30, true);    
    
    
//draw_rectangle(vx+10,vy+550,vx+1895,vy+460,true);
//a teraz tekst, za pomoca draw_text_ext, zeby nie wyjechal poza prawa strone
draw_set_color(c_black);
    draw_set_font(font_text);
    draw_set_halign(fa_left);
    draw_set_valign(fa_top);

    draw_text_ext(vx+12,vy+586-20-100-2,string_copy(string(text),1,round(leght)),-1,596);
    
    draw_set_alpha(1);
    

 

Odnośnik do komentarza
Udostępnij na innych stronach

Konradzie;-)

ja wiem,że mam problem  z

 

 

draw_text_ext

tylko,że jak zmienię położenie tekstu i dopasuje go do rozdzielczości 1280x720 to wtedy Jego położenie na rozdzielczości 1024x768 będzie w innym miejscu..

A tekst ten ma być przecież w tym samym miejscu zarówno dla 1024x768 jak jest obecnie i dla 1280x720;-)

 

Odnośnik do komentarza
Udostępnij na innych stronach

Zauważ, że ten kod:

draw_rectangle(view_xview + 10, (view_yview + view_hview) - 120, (view_xview + view_wview) - 10, (view_yview + view_hview) - 30, false);

A ten kod:

draw_text_ext(vx+12,vy+586-20-100-2,string_copy(string(text),1,round(leght)),-1,596);

Inaczej liczą Ci pozycje, bo drugi kod ma kompletnie gdzieś wysokość i szerokość ekranu.

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy

W ogóle nie zastanawiasz sie co podajesz jako argumenty w funkcjach. Popatrz, jak rysujesz prostokąta, a gdzie potem próbujesz rysować tekst. Musisz go rysować tak samo, jak górną część prostokąta plus ewentualnie jakiś offset (np +5 pikseli).

Odnośnik do komentarza
Udostępnij na innych stronach

Tu jest rysowany prostokąt

I ma stała pozycję na ekranie.

draw_rectangle(view_xview + 10, (view_yview + view_hview) - 120, (view_xview + view_wview) - 10, (view_yview + view_hview) - 30, false);

 

Tu zmieniam wartości,ale jak mowie tekst mi zmienia położenie..

Zmieniłem vx zmieniłem vy

Zmieniłem tą wartość 586-20-100-2 i tą -1,596 i jak mówię...tekst jest zupełnie w innym miejscu

 

draw_text_ext(vx+12,vy+586-20-100-2,string_copy(string(text),1,round(leght)),-1,596);

 

Odnośnik do komentarza
Udostępnij na innych stronach

draw_rectangle(view_xview + 10, (view_yview + view_hview) - 120, (view_xview + view_wview) - 10, (view_yview + view_hview) - 30, false);

Rozłóżmy tę funkcję na parametry:

  1. view_xview + 10 to parametr liczący nam od lewej krawędzi ekranu + 10 pikseli
  2. (view_yview + view_hview) - 120 ten parametr liczy nam już od dolnej krawędzi ekranu - 120px
  3. (view_xview + view_wview) - 10 ten parametr teraz liczy nam od prawej krawędzi ekranu - 10px
  4. (view_yview + view_hview) - 30 a ten parametr już liczy nam ponownie od dolnej krawędzi ekranu - 30px
  5. false po prostu rysuje nam pełny prostokąt

 

A teraz funkcję na rysowanie tekstu:

draw_text_ext(vx+12,vy+586-20-100-2,string_copy(string(text),1,round(leght)),-1,596);

Rozbijemy na:

  1. vx+12 liczymy pozycję tekstu od lewej krawędzi ekranu + 12px
  2. vy+586-20-100-2 liczymy pozycję tekstu od górnej krawędzi ekranu + 586px - 20px - 100px - 2px, w skrócie + 464px
  3. string_copy(string(text),1,round(leght)) zapewne kasujesz nadmiar tekstu, nie wiem ale to nie wpływa na pozycję tekstu a jego długość
  4. -1 odległości pomiędzy liniami w pikselach
  5. 596 przesunięcie tekstu do następnej linii gdy przekroczy ono tę długość

Teraz przyjrzyj się parametrom i zauważ, że liczysz pozycję tekstu od górnej krawędzi ekranu, a nie powinieneś tego robić, policz pozycję od dolnej krawędzi ekranu jak w pierwszym przypadku.

 

Poczekaj aż będzie Ci przełamywać tekst w ramce za wcześnie, to dopiero mind fcuk.

Odnośnik do komentarza
Udostępnij na innych stronach

Mam tak:-)

 

draw_text_ext(vx+12,(view_yview + view_hview)- 1-15-100-2,string_copy(string(text),1,round(leght)),-1,596);

 

tekst jest w boksie nie zależnie od rozdzielczości...jeszcze raz dzięki chłopaki Konrad Tobie tym bardziej za naprowadzenie mnie błędnego rycerza na trop;-)

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