Skocz do zawartości

Pauzowanie gry


matik97

Rekomendowane odpowiedzi

Jak mogę zrobić w mojej grze taki efekt, że jak naciskam np. escape to mi grę zatrzymuje i pojawia się menu z różnymi opcjami(przykładowo zakończ, zapisz, wczytaj, kontynuuj). Chodzi o zatrzymanie wszystkich obiektów, dźwięków i ogólnie całego rooma bez usypiania gry. Praktycznie we wszystkich grach jest takie coś. Z góry dzięki. Czekam na jakąś pomocną osobę.

Odnośnik do komentarza
Udostępnij na innych stronach

Na zatrzymywanie gry sam sobie dałeś odpowiedź ;) A co do tego menu. To albo sam je jakoś rysujesz (przykładowo prostokąt z różymi opcjami), albo uzywasz gmowego show_message_ext itp.

Szczerze mówiąc nie bardzo kumam w jaki sposób sobie odpowiedziałem. Mógłbyś jakoś konkretnie odpowiedzieć? Jestem jeszcze młody i niedoświadczony...

Odnośnik do komentarza
Udostępnij na innych stronach

W każdym obiekcie przechowujesz zmienne zapamiętujące wartości typu np. prędkość a te prawdziwe zerujesz i wtedy mamy stop. Przełączasz sobie jakąś zmienna wtedy, która pozwoli rysować menu i resztę. Po powrotnym naciśnięciu zwracasz wartości zmiennych tymczasowych do tych prawdziwych.

 

Ewentualnie możnaby menu zrobić w oddzielnym roomie pod warunkiem, że tamten byłby persistent. Wtedy gra "sama" zapamiętuje wartości i po powrocie wszystko jest tak jak zostawiłeś.

Odnośnik do komentarza
Udostępnij na innych stronach

zrobić screena, zdezaktywować wszystko i stworzyć obiekt pauza, który wyświetlał by tego shota i jakieś menu. wracasz do gry - niszczysz obiekt pauza i aktywujesz wszystko

ewentualnie stworzyć obiekt, który operowałby sleepami, odświeżał ekran i pobierał klawisze podczas pętli while.

ręczne zatrzymywanie obiektów jest głupie i pracochłonne, kiedy możesz zrobić coś dużo prostszego.

 

edit: znalazłem taki kod:

Odnośnik do komentarza
Udostępnij na innych stronach

będę dobry kolega i dam prawie gotowy kod:

GML
quit=0;

while(quit=0)

{

io_handle();

screen_redraw();

// tutaj wrzucasz rysowanie menu

screen_refresh();

 

if keyboard_check_pressed(vk_enter)

{

quit=1;

}

 

io_clear();

 

sleep(16);

}

akurat miałem pod ręką. wrzucasz do np. Key Escape. powinno działać, jeśli nie działa, skarż się w poście

 

edit: działa, ale co jakiś czas miga. pokombinuję z tym

Odnośnik do komentarza
Udostępnij na innych stronach

Jaklub, jak będę miał trochę czasu to pokombinuje z tą twoją propozycją (wydaje się być najbardziej sensowna). Dzięki. oczywiście temat nadal otwarty, czekam na kolejne posty.

Aktualnie nie mogę sprawdzić kodu gdyż internet mam na Linuxie a GM'a na Windowsie.

Odnośnik do komentarza
Udostępnij na innych stronach

dobrze. nie będzie to tak wygodne, ale ekran nie będzie migać.

GML (create)
// nie wiem, czy mozna to zrobic lepiej, ale bedzie dzialac

screen_save("whatsthis.bmp");

a=background_add("whatsthis.bmp",0,1,0);

file_delete("whatsthis.bmp");

instance_deactivate_all(1);

GML (draw)
draw_background(a,view_xview[0],view_yview[0]);

// rysuj menu</span>

GML (destroy)
background_delete(a);

instance_activate_all();

Odnośnik do komentarza
Udostępnij na innych stronach

Ja bym wybrał jednak:

GML
//zmiana

global.pause = 1/0;

 

//w kazdym dynamicznym obiekcie

if(!global.pause)

{

kod na ruch

}

 

//ew.

if(global.pause)

exit;

 

kod na ruch

 

//i rysujesz menu

if(global.pause)

{

menu pauzy

}

 

+daje większe możliwości niż reszta (możesz kontrolować zachowanie obiektów w czasie pauzy (gdyby Cie wzięła nagła ochota, aby animowane kryształy animowały się nawet w czasie pauzy))

+nie wykorzystuje deaktywacji - nie będzie kolidowało w żaden sposób z ewentualną inna deaktywacją (tą "normalną" w grze, która deaktywuje obiekty poza roomem)

-do każdego obiektu musisz dowalić te dwie czy trzy linie kodu.

 

Ed: A screen nie dość, że jest po prostu głupio wyglądającym wyjściem to komplikuje nam sprawę np. gdybyśmy chcieli przesunąć hud w czasie pauzy (albo go całkiem ukryć) - trzeba by wtedy się bawić w ukrywanie/presuwanie hudu na klatkę przed zrobieniem screena.

Odnośnik do komentarza
Udostępnij na innych stronach

Ja bym wybrał jednak:
GML
//zmiana

global.pause = 1/0;

 

//w kazdym dynamicznym obiekcie

if(!global.pause)

{

kod na ruch

}

 

//ew.

if(global.pause)

exit;

 

kod na ruch

 

//i rysujesz menu

if(global.pause)

{

menu pauzy

}

 

+daje większe możliwości niż reszta (możesz kontrolować zachowanie obiektów w czasie pauzy (gdyby Cie wzięła nagła ochota, aby animowane kryształy animowały się nawet w czasie pauzy))

+nie wykorzystuje deaktywacji - nie będzie kolidowało w żaden sposób z ewentualną inna deaktywacją (tą "normalną" w grze, która deaktywuje obiekty poza roomem)

-do każdego obiektu musisz dowalić te dwie czy trzy linie kodu.

 

Ed: A screen nie dość, że jest po prostu głupio wyglądającym wyjściem to komplikuje nam sprawę np. gdybyśmy chcieli przesunąć hud w czasie pauzy (albo go całkiem ukryć) - trzeba by wtedy się bawić w ukrywanie/presuwanie hudu na klatkę przed zrobieniem screena.

ja tam nie używam do pauzy ani dezaktywacji, ani sleepów i odświeżeń. podałem te rozwiązania, które nie wymagają od matika97 przebudowania całej gry.

od jakiegoś czasu konstruuję swoje tytuły tak, żeby absolutnie wszystkie eventy związane z gameplayem były umieszczone w Create i eventach użytkownika. daję też obiekt, który u wszystkich innych wywołuje te zdarzenia tylko wtedy, gdy nie ma pauzy.

dzięki temu mogę także łatwo dobudować online (niestety sprawdziłem to tylko przez LAN, ale w teorii zapewnia perfekcyjną synchronizację).

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