Skocz do zawartości

Wstawienie obrazków do textboxa po wyswietleniu się odpowiedniej części tekstu


Rekomendowane odpowiedzi

Cześć wszystkim,

 

Próbuje zrobić porządek w intrze gry;-) tzn mam textboxa i z tekstem i chciałbym odpowiednio wrzucić obrazki opisujące historie bohatera,które zmieniają się po pokazaniu się odpowiedniej części tekstu.

A więc

tak:

 

add_text('Czesc Bohaterze co slychac .'); obrazek 1

add_text('Wszystko w porzadku a co u ciebie? .') obrazek 2

add_text('Wszystko w porzadku jade do pracy .') obrazek 3

add_text('A Ja musze w domu zostac .') obrazek 4

 

Tych obrazków mam 8

 

w create mam tak

 

add_text('Czesc Bohaterze co slychac .'); 

add_text('Wszystko w porzadku a co u ciebie? .') 

add_text('Wszystko w porzadku jade do pracy .') 

add_text('A Ja musze w domu zostac .') 

 

w Step

 

if no_text() then room_goto( swiat1);

press<space>

go to room swiat1

 

Odnośnik do komentarza
Udostępnij na innych stronach

Tak mam możliwość podejrzenia kodu.Tak to wygląda

 

trzy skrypty

 

skrypt1 scr_ini

global.textq=ds_queue_create();
global.text_get=true;

skrypt 2 no_text

 

if ( ds_queue_empty(global.textq) and global.text_get=true )
    then return true
    else return false;

skrypt 3 add_text

 

//dodajemy tekst do kolejki
var text;
text=argument0;

if !instance_exists(obj_text) then instance_create(0,0,obj_text);
//poniewaz obj rozmowa nie ma opcji persistent (dla bezpieczenstwa)
//tworzymy go gdy nie ma go na planszy



ds_queue_enqueue(global.textq,text);

i teraz tak wygląda obj_text

 

create

 

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

Step

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;
        }
    }

step cd

 

///Sterowanie padem
if(key_check_pressed(key.jump)) {
    event_perform(ev_keypress,vk_enter);
    //wykonaj event nacisniecia klawisza enter
}

 

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

Tą nową tablice muszę stworzyć w skrypcie domyślam się,tylko dla przykładu jak ma to wyglądać?

 

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy

Tak naprawdę tworzysz drugi raz to samo, tylko zamiast stringów podajesz obrazki :) Nie napiszę Ci od zera, bo raz, ze to sporo roboty a dwa, że nie korzystam z GMS 1.4 tylko 2.0, bo GMS 1.4 jest porzucony już niemal rok.

Odnośnik do komentarza
Udostępnij na innych stronach

Kurcze...tylko jednego nie przewidziałem...Ja tego obecnego textboxa używam w całej grze..i jak tu dodam obrazki,to te obrazki będą mi się też pojawiać w samej grze..a ja chcę żeby wyłącznie w intrze gry pojawiły się te obrazki:-(

No i kicha...

 

Odnośnik do komentarza
Udostępnij na innych stronach

Mogę...ale teraz walczę z tymi string..źle mi coś idzie:/ bo jak wywalę string i wstawię żeby mi się rysował obrazek to już nic nie wyświetla..

Niby ten textbox nie jest skomplikowany,ale jest zabawy z tym żeby go dostosować do wyświetlania ilustracji.

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy

@pankracy ponieważ piszesz, że robisz na GMS 1.4 to średnio mogę pomóc, nie chce mi się go instalować specjalnie. Ale z głowy zrobiłbym tak:

 

(wielokropek oznacza, że zostaje poprzedni kod).

 

scr_ini:

global.textq=ds_queue_create();
global.imageq=ds_queue_create();
global.text_get=true;

add_text (od teraz ma dwa argumenty, ("tekst", -1) gdy nie ma obrazka i ("tekst", spr_jakis) gdy jest obrazek:

ds_queue_enqueue(global.textq,argument0);
ds_queue_enqueue(global.textq,argument1);

if !instance_exists(obj_text) then instance_create(0,0,obj_text);

---

obj_text

create:

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

step:

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
	image=ds_queque_dequeue(global.imageq);
	....
/// KROK 3
	...
        text='';
        image = -1;
        global.text_get=true;//ustaw, ze mozna juz pobierac tekst
        step=0;
        }
    }

draw:

... // cały poprzedni kod

if (image > -1) {
	draw_sprite(image, 0, 10, 10); // alphę itd. sobie już dopisz sam w draw_sprite_ext ;)
}

 

 

Jeśli dobrze liczę, dodałem raptem 7 linijek kodu. Niewiele trzeba było zmienić, żadnej zabawy, tylko druga kolejka i druga zmienna. Nie wiem dlaczego aż tyle problemu to zajęło, skoro to jest niemal skopiowanie tego samego kodu, tylko zamiast "global.textq" i "text", używasz "global.imageq" i "image". No i nie przypisujesz stringa.

 

Odnośnik do komentarza
Udostępnij na innych stronach

Dzięki Piotrek

Niestety nie działa

Ja chyba coś spierdzieliłem...

 

Ostatecznie

wygląda to tak:

 

scr.ini

global.textq=ds_queue_create();
global.imageq=ds_queue_create();
global.text_get=true;

 

 

add_text

 

ds_queue_enqueue(global.textq,argument0);
ds_queue_enqueue(global.textq,argument1);

if !instance_exists(object309) then instance_create(0,0,object309);

 

Obj_text

 

Create

 

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

Step

 

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
    image=ds_queue_dequeue(global.imageq);
    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='';
        image = -1;
        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);
    
    
if (image > -1) {
draw_sprite(introcolor, 3, 35, 35); // alphę itd. sobie już dopisz sam w draw_sprite_ext ;)
}

Coś popierdzieliłem...

Tylko hmmmm...patrząc na kod to obrazki będą się po prostu same zmieniać...bez względu na treść tekstu...A zależy mi na tym żeby obrazki zmieniały się po wyświetleniu danej części tekstu zgodnego z historią na obrazku..

 

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy
draw_sprite(introcolor

A co to jest ten introcolor ?

 

A jak chcesz zmianę obrazka na jakimś etapie tekstu (w połowie), no to jest już naprawdę dużo roboty, cały dzień. Chyba w kodzie źródłowym cinders coś takiego bylo, masz może go z humble bundle ?

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy

@pankracy To jednak Solstice było, ale obie gry są niemal identyczne. TeeGee na pewno się nie pogniewa jak się podzielę w celach edukacyjnych, skoro i tak dawał do kodu dostęp w ramach Humble.

 

https://drive.google.com/open?id=1y9cA4R9m-KBrLuM8tHhJsTQjY5temFz1

 

Ostrzegam jednak, że to spory kod będzie (poznasz zmianę tła czy efekty po kodzie podobnym jak bbcode, np. [do_something=1]).

Odnośnik do komentarza
Udostępnij na innych stronach

Powoli rozgryzam ten kod;-) ktoś naprawdę nie źle się narobił.wszystko jest napisane w skryptach.

 

Mam pytanie do mojego wyżej kodu.

narysowałem sobie osobną grafikę textboxa..i chciałbym go wstawić zamiast tego co jest obecnie..teraz się zastanawiam której funkcji użyć i podmienić grafikę textboxa...

jak najprościej to zrobić...?

I jak wstawić w lewym rogu textboxa sprita? tak jak tu np

https://marketplace.yoyogames.com/assets/2195/ctb-ced-s-textbox-demo

Dołączyć Tag do każdego wiersza tekstu coś jak np [speaker = charactername]?


 

 

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy

Trochę tak jak ja to napisałem, dodatkowe zmienne, oznaczające własnie avatar, może imię osoby, może rodzaj tła i na tej podstawie resetować zmienne po kazdym tekście i czytać nowe.

 

Generalnie ja napisałem coś takiego jak w solstice/cinders na swoje potrzeby w jakieś 6-8h, ale nie nadaje się do udostępnienia tak ot, bo 50% kodu jest zależna od wielu innych rzeczy w grze, a nie będę dawał połowy gry :)

 

to nie jest łatwe zagadnienie i wymaga napisania niemalże parsera prostego języka programowania (taki bardziej znacznikowy w sumie, no ale jednak). Jak ma się już pierwszą komendę to potem z górki, ja mam tak zrobione nawet animacje postaci (przemieszczają sie, obracają itd.) i nawet można podawać prędkość i czas trwania.

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