Skocz do zawartości
pankracy

Intro obrazkowe+wyświetlający się pod obrazkiem tekst

Rekomendowane odpowiedzi

Cześć wszystkim,

Próbuje stworzyć proste intro obrazkowe..

Chciałbym uzyskać taki efekt.

Jest ilustracja i pod ilustracją jest tekst i teraz kiedy nacisnę klawisz enter zmieni się ilustracja i zmieni się tekst pod ilustracją aż skończą się ilustracje lub tekst i wtedy po naciśnięciu też klawisza enter przejdę do następnego roomu.

 

Zacząłem już tworzyć te intro obrazkowe.

Chcę umieścić wiadomości w tablicy,a ilustracje w spritach jako osobne podobrazy.

 

w create zrobiłem w taki sposób

 

 

index = 0 //Zmienna,która przechowuje, w której wiadomości/podobrazie jestem

msg[0] = "na poczatku powinna wyswietlic sie ilustracja nr 1"
msg[1] = "Teraz powinna wyswietlic sie ilustracja nr 2"
msg[2] = "Na koniec powinna wyswietlic sie ilustracja nr 3"
msg[3] = "" // Dodanie dodatkowej pustej wiadomości do tablicy msg, aby uniknąć awarii po zakończeniu ilustracji
W Stepie mam tak i nie działa to prawidłowo.


if (keyboard_check_pressed(vk_enter))//Zwiększyć ten indeks o jeden, jeśli naciśne Enter
    index++;
   
    if (index == sprite_get_number(spr_ilustracja4)) {
// Slajd kończy się, gdy osiągnie numer obrazu spr_ilustracja4 lub długość tablicy msg
   // to koniec
}




W Draw mam tak,ale to akurat jest źle..
draw_text(x+200, y+750, msg[0]);


draw_sprite(spr_ilustracja1, 0, x+640, y+360);

//tu poznizej tekst najezdza sie na poprzedni tekst...

draw_text(x+200, y+750, msg[1]);

draw_sprite(spr_ilustracja2, 0, x+640, y+360);


draw_text(x+200, y+750, msg[2]);

draw_sprite(spr_ilustracja3, 0, x+640, y+360);

 

Proszę pomóżcie Mi jak to poskładać do kupy żebym mógł osiągnąć efekt jaki opisałem wyżej w poście.

za wszelkie sugestie porady z góry dziękuje:-)

 

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Używasz funkcji sprite_get_number, która zwraca Ci liczbę klatek danego sprite, ale z kodu na rysowanie widzę, że używasz oddzielnych sprite a nie klatek jednego sprite. To Ci nie ma prawa zadziałać bo zwyczajnie wywołanie `sprite_get_number(spr_ilustracja4)` zwraca Ci prawdopodobnie wartość '1'. Może użyj funkcji array_length_1d zamiast sprawdzania klatek sprite'a. (pamiętaj, że funkcja dla tablicy z jednym elementem tablica[0]=100 zwróci Ci wartość '1', a indeksujesz tablice od '0')

W draw może daj też warunkowe sprawdzanie, czy klatkę możesz wyświetlić ;)

if (index == 0) {
  // draw ilustracja1
}

 

  • Lubię (+1) 1

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Tak mam każdy sprite oddzielnie w plikach,a nie w jednym pliku:-)

Ok funkcja sprite_get_number jest tu w moim przypadku źle użyta.

Przyznam szczerze,że nie znam tej funkcji co Mi podałeś array_length_1d .

Próbuje dalej to złożyć,ale pogubiłem się już.

Dalej Mi wyświetla Pierwszy tylko sprite czyli ilustracja1 i tekst z msg[0]

 

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
   if (index == sprite_get_number(spr_ilustracja4)) {
// Slajd kończy się, gdy osiągnie numer obrazu spr_ilustracja4 lub długość tablicy msg
   // to koniec
}

Pomyśl, jakie są wartości ukryte pod tymi nazwami:
Index = zainicjowałeś go w postaci liczby "0" i domyślam się, że wcisnąłeś enter 3 razy, żeby przejść do msg[3]. Teraz index = 3;
Sprite_get_number(spr_ilustracja4)) - ta funkcja, tak jak napisał Konrad, zwraca ilość klatek w obrazie. Domyślam się (znowu :V), że jest tam tylko JEDNA klatka, więc Sprite_get_number(spr_ilustracja4)) = 1 i zawsze tam będzie jeden, jeśli obrazek nie jest animacją.
Tak więc, warunek zawsze będzie prawdziwy, kiedy po raz pierwszy naciśniesz enter, bo wtedy
index = 1;

Możesz to zrobić poprzez array_length_1d a jakże, bądź, w taki oto fajny sposób (coś może się nie zgadzać, bo piszę z pamięci):
1) Robisz jeden sprite, o nazwie np. spr_intro1
2) W tym sprite dodajesz spr_ilustracja1, spr_ilustracja2, spr_ilustracja3, spr_ilustracja4 itd. tak, żeby powstała Ci animacja. 
3) Create masz dobrze, a w Stepie coś takiego:
 

if (keyboard_check_pressed(vk_enter))//Zwiększyć ten indeks o jeden, jeśli naciśne Enter
    index+=1;

if (index == sprite_get_number(spr_intro1)) //teraz możesz tego używać, bo spr_intro1 zawiera cztery klatki
{
	// Slajd kończy się, gdy osiągnie ostanią klatkę spr_intro1
   // to koniec
}

4) Draw:

//Rysuj tekst msg[i] oraz ilustracje

//Wskaźnikiem jaki ma być teraz rysowany tekst/obraz, jest zmienna "index", która zmienia się wraz z przyciskiem ENTER
draw_text(x+200, y+750, msg[index]);
draw_sprite(spr_intro1, index, x+640, y+360);


Pamiętaj, że msg[] i ilość klatek w spr_intro1 musi być taka sama, bo inaczej indeksowanie tablicy Ci się wysypie, ale możesz to zabezpieczyć, np za pomocą funkcji clamp() albo po prostu jak masz więcej obrazków niż tekstu, to daj pustą tablicę, czyli msg[42] = "";

  • Lubię (+1) 1

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Dziękuje..Ze spritem ,który zawiera animacje składająca się z kilku ilustracji działa..;-)

Jeszcze dwa pytania:

 

1.A co w przypadku,kiedy skończą się już ilustracje oraz tekst i chciałbym przejść do następnego pokoju po spełnieniu wszystkich tych warunków?

2.Jeśli ustawie w spricie animacje składającą się z tych ilustracji i dopasuje ją na cały ekran do wielkości roomu,to tekst mój jest zakryty tymi ilustracjami..

jak ustawić żeby tekst był na wierzchu? a nie za ilustracja? bo obecnie mam ustawiony room większy,a sprite z ilustracjami są wyśrodkowane a poniżej po za obrazkiem tekst jest wyświetlany.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

1. No to zrób if'a :V Znaczy masz już tam jednego co to sprawdza, wystarczy go przerobić pod siebie, nie będzie to trudne. Jedynym minusem tej metody jest to, że masz jedną sprawdzającą "index" na dwie sytuacje, czyli tekst i obrazki. Dlatego zawsze i tekst i obraz musi mieć taką samą pulę, czyli np. 5 obrazków to 5 tekstów (msg[5]). Ale jak masz np. więcej tekstu, to dajesz puste obrazki png, a jak masz więcej obrazków niż tekstu to dajesz pusty tekst msg[] = "";

2. Zamień kolejność rysowania w draw xD głupol ze mnie. Najpierw niech rysuje obraz, a później tekst. 

PS: W sumie możesz jeszcze założyć blokadę w draw przy użyciu zmiennej "index", żeby nie wyleciała poza tablice, to wtedy nie będziesz musiał dawać pustych obrazków/tekstu

DRAW
 

//Rysuj tekst msg[i] oraz ilustracje z blokadą na tablice

//Wskaźnikiem jaki ma być teraz rysowany tekst/obraz, jest zmienna "index", która zmienia się wraz z przyciskiem ENTER

draw_sprite(spr_intro1, min(index, sprite_get_number(spr_intro1)-1), x+640, y+360); //najpierw (pod spodem) rysuj obrazek

var dl_tablicy = array_length_1d(msg); //zobacz jaka jest dlugosc tablicy, aby zaznaczyc końcową wartosc przy rysowaniu
draw_text(x+200, y+750, msg[min(index, dl_tablicy-1)]); //później (nad obrazkiem) rysuj tekst)


a w stepie zobaczysz czego jest więcej i do tego się odwołać w ifie
 

var czego_wiecej = max(array_length_1d(msg), sprite_get_number(spr_intro1));

if (index == czego_wiecej) // możliwe, że będziesz musiał dać też -1, czyli index == czego_wiecej-1
{
	// Slajd kończy się, gdy osiągnie ostanią klatkę spr_intro1
   // to koniec
}

 

  • Lubię (+1) 1

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Ok kończy się ostatnia ilustracja i tekst,ale w dalszym ciągu nie można przejść do następnego roomu

 

step

 

var czego_wiecej = max(array_length_1d(msg), sprite_get_number(spr_intro1));

if (index == czego_wiecej-1) // możliwe, że będziesz musiał dać też -1, czyli index == czego_wiecej-1
{
// Slajd kończy się, gdy osiągnie ostanią klatkę spr_intro1
   // to koniec
}


if (keyboard_check_pressed(vk_enter))//Zwiększyć ten indeks o jeden, jeśli naciśne Enter
    index+=1;

if (index == sprite_get_number(spr_intro1)) //teraz możesz tego używać, bo spr_intro1 zawiera cztery klatki
{
// Slajd kończy się, gdy osiągnie ostanią klatkę spr_intro1
   // to koniec
}

 

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Ale co Ty tu za bezeceństwa napisałeś :D

Nawet nie wiem jak to wytłumaczyć :P
Generalnie, to, kiedy masz przejść do następnego pokoju, sprawdzasz jednym ifem, na podstawie dwóch zmiennych "index" i "czego_wiecej". Jeśli "index" będzie większy, niż klatki z intro (tekst/obrazki) to przejdź do następnego pokoju. Czyli if index > czego_wiecej to goto_room_next();

 

//Najpierw zwiększaj index
if(keyboard_check_pressed(vk_enter)) then index+=1; //Zwiększyć ten indeks o jeden, jeśli naciśne Enter

//a dopiero później sprawdzaj
var czego_wiecej = max(array_length_1d(msg), sprite_get_number(spr_intro1)); //zobacz, czy jest więcej obrazków czy tekstu i wpisz maks. liczbę

if (index >= czego_wiecej-1) // możliwe, że będziesz musiał dać też -1, czyli index == czego_wiecej-1
{
	//W tym bloku wypisujesz akcje, które mają być spełnione po zakończeniu intra

	room_goto_next();
}

/*
TEGO TU NIE MA BYC, WYTNIJ TO, TO JEST POPSUTE I NIEDOBRE 
if (index == sprite_get_number(spr_intro1)) //teraz możesz tego używać, bo spr_intro1 zawiera cztery klatki
{
// Slajd kończy się, gdy osiągnie ostanią klatkę spr_intro1
   // to koniec
}
*/

 

  • Lubię (+1) 1

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Dzięki;-) ustawiłem sobie jeszcze migający tekst pod tekstem obrazkowym z informacją dla gracza,że aby przejść dalej to musi nacisnąć konkretny przycisk.

No dobra i ostatnie do tego moje pytanie...

Obecnie tekst pokazuje się razem z ilustracja..a czy jest możliwość ustawić tak ten tekst,że pokazuje się najpierw obrazek,a za moment literka po literce pokazuje się tekst? A na końcu tego tekstu pod tym tekstem pokaże się tekst w całości migajacy np "nacisnij dowolny klawisz" tak jak mając textboxa coś takiego;-)?

 

 

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
Cytuj

 czy jest możliwość ustawić tak ten tekst,że pokazuje się najpierw obrazek,a za moment literka po literce pokazuje się tekst?

Pewnie, że jest taka możliwość, a nawet i pewnie multum możliwości :D Jednak ja tutaj nie pomogę, bo nigdy tego nie robiłem. Jednym ze sposobów byłoby rozdzielenie całego stringa w tablicy, na tablice ze znakami (char), a później w pętli for, która wykonywała by się w jakimś interwale czasowym, wypisywać po kolei literki. Niemniej to jest pomysł, który jako pierwszy i od razu przychodzi mi na myśl. Jak jest z jego wykonaniem to nie wiem. Na pewno nie jest on najlepszym pomysłem, z pewnością są lepsze i bardziej optymalne rozwiązania.

  • Lubię (+1) 1

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Extra! jesteś cudotwórcą Królu nic dodać nic ująć;-) czapki z głów...

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

×