SFML, wyjście z gry do Menu

0

Otóż, napisałem Arcanoid w SFML, Gra działa, wszystko fajnie, Menu też, wejscie z Menu do Gry też fajnie działa, niestety mam problem jak chce wyjść z gry do Menu, nagle nakłada się na obraz z gry obraz z Menu i działaja jednocześnie gra i menu. Dodam, że ręcznie debugowałem wszystko co zwiazane z grą i działa, metoda if_lose() też działa, bo debugowałem w konsoli wypisywaniem czy przegrałem, czy nie. Jednak nie potrafię przejść z Gry do czegokolwiek, czy to Menu, czy jakieś okno wyświetlające porażkę.

void Game::run_menu()
{		
	Event menu_event, game_event; 
	while (state == MENU_STATE)
	{
		while (window->pollEvent(menu_event))
		{
			menu1->MoveDown(); 
			menu1->MoveUp();
			if (menu_event.type == Event::Closed || menu_event.type == Event::KeyPressed && menu_event.key.code == Keyboard::Escape)
			{
				this->state = END_STATE; 
				window->clear(Color::Black); 
			}
			else if (menu1->give_selected_item() == 2 && menu_event.type == Event::KeyPressed && menu_event.key.code == Keyboard::Space)
			{
				this->state = END_STATE;
				window->clear(Color::Black);
			} 
			if (menu_event.type == Event::KeyPressed && menu_event.key.code == Keyboard::Space && menu1->give_selected_item() == 0)
			{
				this->state = PLAY_STATE; 
				while (state == PLAY_STATE)
				{
				
						if (menu_event.type == Event::KeyPressed && menu_event.key.code == Keyboard::Escape)
						{
							this->state = MENU_STATE;
							window->clear(Color::Black);
						}
						engine1.game();
						if (engine1.if_lose())
						{
                                                        // tutaj chciałbym zaimplementować okno informujące o score i porażce 
						}
					}	
				}
			}
		}
	menu1->draw(*window); 
	window->display(); 
}

To całkowicie nie działa :

if (menu_event.type == Event::KeyPressed && menu_event.key.code == Keyboard::Escape)
                        {
                            this->state = MENU_STATE;
                            window->clear(Color::Black);
                        }

Jeszcze część klasy Engine.h biorącej znaczny udział :

void Engine::game()
{
	paddle_engine.update(window_engine->getSize().x);
	ball_engine.up_velocity_bounce(window_engine->getSize().x, window_engine->getSize().y);
	ball_engine.update();

	collision_test(paddle_engine, ball_engine);

	for (auto& brick : bricks) if (collisionTest(brick, ball_engine))  break;

	auto iterator = remove_if(begin(bricks), end(bricks), [](Block& brick) {return brick.isDestroyed(); });
	bricks.erase(iterator, end(bricks));
	draw(); 
}
void Engine::draw()
{
	window_engine->clear(); 
	for (auto& brick : bricks)
		window_engine->draw(brick);
	window_engine->draw(paddle_engine);
	window_engine->draw(ball_engine);
	window_engine->display();
}
0

A jak tworzysz nowe okno? W sensie wychodzisz z gry do menu ale nie widzę tworzenia nowego okna.

0

Chciałbym w jednym oknie wyjść z gry do Menu. Stworzenie nowego okna, to zaimplementuje jak mi się uda ta czynność(Bedzie to okno z wynikiem i komunikatem, że przegrałeś).

0

Specjalistą z SFML nie jestem zrobiłem jedną prostą grę kiedyś. I tak parzę w kod teraz to takie coś rozwiązywałem przez to że zamykałem poprzednie okno i otwierałem nowe

state = GAME_OVER;
GameWindow.clear();
GameWindow.close();

Nie wiem czy to poprawne rozwiązanie, ale zawsze jakiś pomysł, chętnie poznam zdanie kogoś bardziej doświadczonego.

0

Ja bym chciał tak płynnie po naciśnięcu ESCAPE np wyjść do Menu i skończyć grę. Ktoś jakiś pomysł?

0

Możesz dać Enuma GameState, w którym będziesz miał np. Playing i Menu. I wted po kliknięciu Esc state zmienia się z Playing na Menu

0

Właśnie przecież tak robie

1

Edit:
Znalazłem gdzie rysujesz - poza główną pętlą gry, czyli renderuje ci się raz, na sam koniec.

void Engine::draw()
{
	window_engine->clear(); 
	for (auto& brick : bricks)
		window_engine->draw(brick);
	window_engine->draw(paddle_engine);
	window_engine->draw(ball_engine);
	window_engine->display();
}

Gdzie rysujesz tutaj menu?

Proponuję coś w tym stylu:

void Engine::Render()
{
    window_.clear(sf::Color(0x1f, 0x1f, 0x1f, 0));

    if (state_ == GameState::PLAY)
    {
        // GAME
        window_.setView(main_view_);
        window_.draw(game_map_);

        window_.setView(ui_view_);
        window_.draw(player_ui_);
        //END GAME
    }
    else
    {
        window_.draw(main_menu_);
    } 
    window_.display();
}
0

Najlepszym rozwiązaniem jest zrobienie singletona i do niego się odwoływać

Game::getInstance()->setController(gameController *controller).

w singletonie umieścić obiekt gameController *
a potem

controller->draw(), controller()->update 

i co tylko chcesz

1 użytkowników online, w tym zalogowanych: 0, gości: 1