• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed [C++][SFML] Implementacja pauzy w grze

VPS Starter Arubacloud
+1 głos
789 wizyt
pytanie zadane 18 stycznia 2016 w C i C++ przez pietrzakacper Mądrala (7,480 p.)
zamknięte 18 stycznia 2016 przez pietrzakacper

Witam!

Pisząc grę napotkałem na trudność w implementacji pauzy. Otóż sam szkielet wygląda u mnie tak:

Mam klasę Engine, a w niej metodą obsługującą rozgrywkę:

void Engine::runEngine()
{
	srand((unsigned int)time(NULL));
	while (!menu)
	{
		if (_pause)pause_screen();
			generator_manager();
			event_manager();
			update();
			draw();
		
	}

}

 klikając odpowiedni przycisk zmieniam wartość _pause na true  , dalej program idzie do funkcji pause_screen():

void Engine::pause_screen()
{
	PauseScreen pauza(_pause,*okno);
	pauza.runPause();
	
}

i w funkcji PauseScreen::runPause() mam pętle obsługującą pauzę wykonującą się dopóki nie przestawie zmiennej_pause na false którą przesyłam przez referencję.

Problem jaki napotkałem to, że pomimo tego, że teoretycznie program powinien wykonywać tylko pętlę pauzy, to obiekty którymi poruszam w metodzie Engine::update() , zmieniają swoją pozycję (nie widać tego dopóki nie wyjdę z pętli pauzy ale po wyjściu ich pozycja jest taka, jakby poruszały się przez okres trwania pauzy).

Pierwsze pytanie jakie zadaję to dlaczego tak się dzieje ( domyślam się, że może chodzić o wątki o których nie mam bladego pojęcia). Drugie pytanie to jak zrealizować pauzę, stworzyć nowe okno? Może użyć RenderTexture?? 

kodzik:

http://www44.zippyshare.com/v/UiJKp1Pk/file.html

komentarz zamknięcia: Otrzymałem odpowiedź

1 odpowiedź

+2 głosów
odpowiedź 18 stycznia 2016 przez adrian17 Ekspert (344,100 p.)
wybrane 18 stycznia 2016 przez pietrzakacper
 
Najlepsza
Nie pokazałeś dużej części kodu, z tego co masz nie mogę wywnioskować o co może chodzić.

Co do praktycznej implementacji: najbardziej elegancko byłoby, gdybyś używał maszynę stanów ze stosem stanów - wtedy otwarcie menu pauzy by polegało po prostu na na wepchnięciu nowego stanu pauzy. Przykład: http://gamedev.stackexchange.com/a/25232/65858

Mniej eleganckie byłoby kombinowanie w stylu: if(!_pause) update();
komentarz 18 stycznia 2016 przez pietrzakacper Mądrala (7,480 p.)
komentarz 18 stycznia 2016 przez adrian17 Ekspert (344,100 p.)
W runPause odpalasz pętlę potem wracasz do update(), ta aktualizujesz zegar, czas=timer.getElapsedTime(). Tyle, że ten czas jest równy długości trwania pauzy, więc wszystko w jedną klatkę przesunie się o równowartość tylu sekund, ile pauzowałeś.

Poważnie, nie rób zupełnie niezależnej pętli zdarzeń w trybie pauzy, to bardzo głupie ominięcie problemu.
komentarz 18 stycznia 2016 przez pietrzakacper Mądrala (7,480 p.)
Faktycznie :) Że ja na to nie wpadłem...

Postaram się powalczyć z tą maszyną stanów :) Dzięki

Podobne pytania

0 głosów
1 odpowiedź 559 wizyt
pytanie zadane 20 grudnia 2016 w C i C++ przez xjakubekx Obywatel (1,280 p.)
0 głosów
2 odpowiedzi 229 wizyt
pytanie zadane 8 lipca 2016 w C i C++ przez mrdropex Początkujący (430 p.)
0 głosów
0 odpowiedzi 129 wizyt

92,454 zapytań

141,263 odpowiedzi

319,099 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...