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

SFML - Okno gry

Object Storage Arubacloud
0 głosów
373 wizyt
pytanie zadane 20 kwietnia 2017 w C i C++ przez redie Obywatel (1,490 p.)
Cześć, potrzebuję małego nakierowania ewentualnie większej pomocy dotyczącej SFML-a.

Mam grę i etapy przechodzenia wyglądają tak:

Menu->Wybór postaci->Okno gry.

Z okna gry mogę wejść do "Menu gry", z niego wrócić do Okna gry albo wyjść do Menu.

Problem jaki mnie trapi jest taki: Chciałbym aby po przejściu z wyboru postaci do okna gry generowała mi się cała mapa, przeciwnicy (rozmieszczeni losowo), postać na konkretnym miejscu. Po przejściu z okna gry do menu z gry i powrocie, żebym miał stan taki jaki miałem przed wyjściem z tego okna. Nie wiem czy zrozumiał ktoś o co mi chodzi, mogę jeszcze inaczej wytłumaczyć (piszcie).

2 odpowiedzi

+2 głosów
odpowiedź 20 kwietnia 2017 przez Ehlert Ekspert (212,710 p.)

Jeśli zaczynasz przygodę z GameDevem to rzeczywiście rozwiązanie typu GameState enum może rozwiązać Twój problem. Jeśli jednak myślisz o czymś ambitniejszym proponuje Ci implementację systemu scen. 
 

class Scene : public sf::Drawable
{
protected:

    const sf::Time updateLogicTime;

public:

    const sf::Time getUpdateLogicTime();

    virtual void update(sf::Time) = 0;

    virtual void handle(const sf::Event) = 0;

    virtual void draw(sf::RenderTarget & target, sf::RenderStates states) const = 0;

    Scene(sf::Time);

    virtual ~Scene();

};

Wszystkie Twoje sceny czyli de facto: menu, wybór postaci itp. będą dziedziczyć po klasie Scene. Implementujesz sobie klasę Engine albo coś podobnego.
 

class Engine{
private:	

	Window 		window;
	sf::Clock 	timer;
	sf::Time 	fps, 
				accumulator;

	MenuScene 			menu;
	HeroSelectScene 	heroSelectScene;
	GameScene 			gameScene;
	
	Scene* 		currentScene;
	
	void handleInputs()
	{
		sf::Event event;
		while(window.pollEvent(event))
		{
			currentScene->handle(event);
		}
	}

	void update()
	{
		fps = timer.restart();
		accumulator += fps;
		if (accumulator >= updateLogicTime)
		{
			currentScene->update(accumulator);
			accumulator = sf::Time::Zero;
		}
	}

	void draw()
	{
		window.clear(sf::Color::Black);
		window.draw(*currentScene);
		window.display();
	}

	void mainLoop()
	{
		while(/*dostęp do okna*/)
		{
			handleInputs();
			update();
			draw();
		}
	}

public:
	
	void run()
	{
		mainLoop();
	}

	Engine()
	{
		//...
		accumulator = sf::Time::Zero;
	}
};

Bardzo nieelegancko trzymam sceny w klasie wyżej. Powinieneś napisać sobie jakąś strukturę danych albo trzymać je w mapie. Wtedy jedna scena nie wie nic o drugiej, ale ma możliwość (w prosty i czytelny sposób) wysłania pseudo requesta do klasy Engine o zmianę sceny. 

Polecam Ci ten wzorzec, jeśli masz jakieś problemy z implementacją pisz.

komentarz 20 kwietnia 2017 przez DarkEliat Bywalec (2,810 p.)

Ciekawy sposób, a co myślisz o czymś takim:

Class Controller
{
Game game;
Menu menu;

void run();
void runGame();
void showMenu();
};

A w metodzie run():

Controller::run()
{
 while(true)
    {
        switch(gameInfo.state)
        {

        case GameInfo::MENU:
            showMenu();
            break;

        case GameInfo::GAME:
            runGame();
            break;

	case GameInfo::END:
		exit(0);
		break;

        default:
            showMenu();
            break;
        }
    }
}

 

1
komentarz 20 kwietnia 2017 przez Ehlert Ekspert (212,710 p.)

No niby może być ale ja wolę ten mój cheeky jest szybszy i nie zginiesz jak będziesz mieć 12 stateów. 

komentarz 22 kwietnia 2017 przez redie Obywatel (1,490 p.)
A mogę prosić o pomoc z takim efektem: Na mapie mam losowo rozmieszczonych przeciwników, rysują się i wszystko jest pięknie. Napisałem funkcję, która sprawdza kolizje z elementami na mapie (normalne). I jak mój gracz wejdzie na pole gdzie znajduje się przeciwnik, to chciałbym aby obok niego rysował się tekst typu: Pytanie TAK - NIE I mogę operować na tym pytaniu i w zależności od wyboru ma się dziać coś dalej. Potrzebuję też wstrzymywać czas ruszania się dopóki gracz nie podejmie odpowiedniej decyzji (NIE -> może się poruszać dalej) https://github.com/Deeadline/Game/tree/master/Game/Game Macie tutaj odpowiednie pliki: Główny plik gdzie sprawdzane są kolizje to Engine.cpp :)

 

PS. Mogę prosić o pomoc ze zmianą kodu na ten co kolega proponował wyżej (to z tymi scenami) :)
0 głosów
odpowiedź 20 kwietnia 2017 przez MetGang Nałogowiec (34,360 p.)

W wielkim uproszczeniu można zrobić tak:

switch(GameState)
{
    case Menu: Menu(); break;
    case Game: Game(); break;
    case Pause: Pause(); break;
}

Opakować to w klasę dla wygody i bez problemu można się przełączać między stanami gry (np. po naciśnięciu klawisza). Jeśli akurat jesteś na ekranie pauzy to logika gry (ale nie aplikacji) nie jest wykonywana, przez co ma taki sam stan ja przed pauzą.

Podobne pytania

+4 głosów
0 odpowiedzi 142 wizyt
pytanie zadane 31 lipca 2023 w Nasze projekty przez Bondrusiek Maniak (61,370 p.)
+3 głosów
0 odpowiedzi 224 wizyt
+1 głos
2 odpowiedzi 651 wizyt
pytanie zadane 19 sierpnia 2018 w Nasze projekty przez Michał Muzyka Pasjonat (24,080 p.)

92,595 zapytań

141,444 odpowiedzi

319,717 komentarzy

61,980 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

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy 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!

...