Skocz do zawartości

Zatrzymanie działania obiektów w roomie


Styxu2153

Rekomendowane odpowiedzi

To znowu ja... Ostatnio ciągle wpadam na nowe problemy. Tym razem problem tkwi w tym, iż nie mam zielonego pojęcia jak zrobić aby po naciśnięciu przycisku "escape" czas w roomie się zatrzymał, wtedy wyświetla mi się okienko na środku z przyciskami resume etc. Okienko, przyciski wszystko działa, ale ja ciągle nie wiem jak zatrzymać wszystkie obiekty (oprócz oczywiście tego okienka z przyciskami). komenda sleep, działa tylko o określony czas i zatrzymuję wszystkie obiekty, więc nie wiem już co mogę zrobić :( Proszę o pomoc i z góry dziękuję za odpowiedzi :)

I jeszcze prośba, mógłby mi ktoś wytłumaczyć jak zrobić żeby po pierwszym wciśnięciu "escape" okienko z przyciskami się pojawiało, a po drugim znikało.

Odnośnik do komentarza
Udostępnij na innych stronach

Po pierwsze to w global game setting musisz wyłączyć to że jak wciska się escape to wyłącza się gra zakładka other chyba że korzystasz ze Studio tam nie ma tego problemu, a potem możesz dodać event ja pauze jeśli o to chodzi polecam robić message'em show_message('bla bla') lub jak chcesz żeby było na przekład tam wyjście czy cuś to show_message_ext z tego co pamiętam trzeba go użyć tak:

GML
zmienna=show_message_ext('Co chcesz zrobić?','Wznów','Pomoc','Wyjście')

switch(zmienna)

{

1: /*nie wiem czy jak tu się zostawi puste to wiadomość zniknie ale zawsze warto spróbować;P*/ break;

2: /*nie koniecznie tu musisz jakąś pomoc dawać tak dla przykładu dałem*/ break;

3: game_end; break;

}

 

E. Jeszcze miałem napisać o tej trudniejszej wersji pauzy przy niej trzeba znać się na surface'ach zapamiętujesz obraz ekranu do takiego surface'a potem dezaktywujesz wszystkie obiekty na terenie całego roomu i wyświetlasz obraz zapamiętany w surface. Ewentualnie można spróbować ze zmienną globalną global.pauza którą ustawiasz na true, albo false. Ale wtedy każdemu obiektowi w step musisz dać warunek if(global.pauza==false)

Odnośnik do komentarza
Udostępnij na innych stronach

Dawniej jak nie umiałem za bardzo programować to robiłem specjalny room do którego przechodziłem jak włączało się pauzę. Jeśli w roomie gry zapisują się wszystkie ustawienia "persistent" to bez problemu można iść do rooma z pauzą, a potem wrócić do ostatniego. Jeśli potrzebujesz widoku gry, to jest chyba funkcja robienia obrazka ze screena. Jeżeli etapy nie zapisują ustawień, to ten sposób nie wypali bez resetu poziomu, chyba, że jeszcze bardziej się nakombinuje :D Pewno można przypisać persistent do rooma podczas gry, chociaż nie jestem pewien.

 

Co do pomysłu z globalną pauzą, to ja stosuję odwrócony if :D If (global.pauza) exit; Jedna klamra mniej do pilnowania :)

Odnośnik do komentarza
Udostępnij na innych stronach

wyłączy wszystkie obiekty, poza obiektem z którego aktywujesz te funkcję - przestana być rysowane, przestaną się poruszać wukonywać posiadane skrypty, pętle i obliczenia.

GML
instance_deactivate_all(1);

 

włączy ponownie obiekty o podanej nazwie, przy czym równie dobrze włączy całą grupę obiektów jeśli będą one podpięte pod parent

GML
instance_activate_object("nazwa-obiektu");

 

włączy wszystko co było wyłączone

GML
instance_activate_object(all);
Odnośnik do komentarza
Udostępnij na innych stronach

@copoconaco

No tak, tylko mi chodzi o to żeby obiekty zostały, lecz zaprzestały swojego działania, wykonywania kodu. Czyli po prostu wszystko stoi w miejscu. Oczywiście wszystko poza menu które się wyświetla/

 

@kaszan88

takie rozwiązanie mam obecnie, ale chciałbym jakoś zrobić żeby to było podczas grania danego poziomu, a nie w innym roomie. Chociaż może rzeczywiście zrobię to sposobem, zapisania obrazu i wyświetlenia go, będzie to dawało wrażenie jakby się wszystko zatrzymało.

 

Mimo wszystko chciałbym dowiedzieć się czy jest sposób w GM-ie, na zatrzymanie obiektów. :D

Odnośnik do komentarza
Udostępnij na innych stronach

Jest mnóstwo sposobów :) Ja mam np obiekt Pauza i we wszystkich obiektach, które mają sie zatrzymywać mam warunek if(instance_number(Pauza)>0)exit; Mam to zrobione funkcją a nie zwykłym ifem, ale to nie zmienia logiki. Dzięki temu ptaszki dalej latają sobie po niebie, bo to tylko tło i nie ma wpływu na grę. Zatrzymuję tylko ważne dla gry obiekty.

 

Możesz zrobić tak jak proponował copoconaco zapisać obraz, dezaktywować wszystkie obiekty i w tym czasie wyświetlać po prostu obrazek a potem znowu je aktywować. To dobre i łatwe do zrobienia rozwiązanie zwłaszcza, gdy używasz alarmów. Bo przestaną się odliczać.

Odnośnik do komentarza
Udostępnij na innych stronach

możesz zrobić to na zmiennych globalnych. np. w create bohatera global.czasnaprzerwe=false. Dodajesz do każdego obiektu, który chcesz stopować w kazdy event w którym chcesz stopować wykonywanie kodu.

GML
if global.czasnaprzerwe=false

{

akcja w danym evencie // step, draw co tam jeszcze chcesz

}

 

Musisz pamiętać, aby w tym obj w którym chcesz stopować daj kod :

GML
if global.czasnaprzerwe=false

{

if keyboard_check_pressed(vk_escape)

{

global.czasnaprzerwe=true

}

 

//kod, który się wykonuje gdy nie ma przerwy

}

 

 

else

{

if keyboard_check_pressed(vk_escape)

{

global.czasnaprzerwe=false

}

}

 

E: Jeżeli chcesz ciagle rysować bohatera i inne rzeczy, to nie dawaj opcji stopu w drawie

E2: Jeżeli nie używasz gm studio, to masz w gm pod objects,rooms, game info - "Global Game Settings". I tam w zakładce Other odznacz "Let <ESC> end the game."

E3: Pomysł kaszan'a88 w praktyce

 

GML
if keyboard_check_pressed(vk_escape)

{

global.czasnaprzerwe= !global.czasnaprzerwe;

}

 

if global.czasnaprzerwe=false

{

//kod, który się wykonuje gdy nie ma przerwy

}

else

{

// kod, który się wykonuje gdy jest przerwa

}

Odnośnik do komentarza
Udostępnij na innych stronach

Mam kolejną podpowiedź :D

 

Zamiast if (czasnaprzerwe = false) czasnaprzerwe = true;

 

dajesz

GML
if keyboard_check_pressed(vk_escape)

global.czasnaprzerwe= !global.czasnaprzerwe;

! neguje wartość. Często się to przydaje w skracaniu kodu.

 

A zamiast sprawdzać zmienna = false można dać !zmienna albo not zmienna. Wtedy jeśli jest false, to zaneguje to na true. Jeśli chcemy true, to wystarczy dać if(zmienna).

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