SFML - kolizja(problem z algorytmem)

0

Witam
Mam taką oto zagwozdkę.

W mojej grze chce dodac kolizje. Kolizje dzialaja lecz nie moge zrobic czegos takiego ze jak wystapi kolizja to wyswietla sie na ekranie Game Over.

W obecnym kodzie mam metode GameDraw() kora odpowiada za rysowanie wszystkiego oraz GameOver() ktora odpowiada za wyswietlenie napisu Game Over.

Czy ktos moglby mi powiedziec jak to napisac aby GameDraw przerwalo wykonanie po wystapieniu kolizji bo nie moge z tym sie uporac i mam takie cos jak wystapi kolizja ekran czarny + gracz, a gdy wyjde za obszar kolizji to znowu rysuje mape. A chce zeby po wystapieniu kolizji nie moglem sie juz poruszac tylko wczytac od nowa gre.

Prosze o pomoc

Oto kod:

#include "Game.h"

sf::Vector2f velocity(sf::Vector2f(0, 0));
Game::Game(void)
{

	sf::Vector2i source(1, Down);

	if (textureBackground.loadFromFile("background.png"))
	{
		spriteBackground.setTexture(textureBackground);
	}

	
	
	window.create(sf::VideoMode(1366,768), "Runner");

	//wczytanie tekstur
	for (int i = 1; i<Level::LAVA; i++)
	{
		tekstura[i].loadFromFile("Leveltexture.png", sf::IntRect((i - 1)*level.tile_width, 0, level.tile_width, level.tile_height));
	}

	//ustawienie kafli
	level.loadFromFile("map.txt");
	Game::LoadColMap("colMap.txt");
	for (int i = 0; i<level.height; i++)
	{
		for (int j = 0; j<level.width; j++)
		{
			if (level.poziom[i][j].type != Level::NONE)
			{
				spritemap[i][j].setTexture(tekstura[level.poziom[i][j].type]);
				spritemap[i][j].setPosition(j*level.tile_width, i*level.tile_height);
			}
		}
	}

	Game::PlayerTexture();

	
}



void Game::PlayerTexture()
{


	if (texturePlayer.loadFromFile("player.png"))
	{
		spritePlayer.setTexture(texturePlayer);
	}
	spritePlayer.setPosition(0, groundHeight);
}



void Game::Movement()
{
	
	
	if (sf::Keyboard::isKeyPressed(sf::Keyboard::Right))
	{
		source.y = Right;
		velocity.x = movespeed;
		

	}

	else if (sf::Keyboard::isKeyPressed(sf::Keyboard::Left))
	{
		source.y = Left;
		velocity.x = -movespeed;
	}
	else
		velocity.x = 0;
		
	
	
	//source.y = Right;
	//spritePlayer.move(0.5, 0);

	if (sf::Keyboard::isKeyPressed(sf::Keyboard::Space))
	{

		velocity.y = -jumpspeed;
	}

	spritePlayer.move(velocity.x, velocity.y);	

	if (spritePlayer.getPosition().y + 32 < groundHeight || velocity.y <0)
	{
		
		
			velocity.y += gravity;
	}
	else 
	{
		spritePlayer.setPosition(spritePlayer.getPosition().x, groundHeight   );
		velocity.y = 0;
	}


}
	

void Game::GameStart()
{


	while (window.isOpen())
	{

		while (window.pollEvent(event))
		{



			if (event.type == sf::Event::Closed || sf::Keyboard::isKeyPressed(sf::Keyboard::Key::Escape))
				window.close();
		}

		Movement();


		Aktualizacja();

		

		spritePlayer.setTextureRect(sf::IntRect(source.x * 32, source.y * 32, 32, 32));
		//rysowanie mapy
		for (int i = 0; i < level.height; i++)
			for (int j = 0; j < level.width; j++)
				if (level.poziom[i][j].type != Level::LAVA)
					window.draw(spritemap[i][j]);


		

		for (int i = 0; i < colMap.size(); i++)
		{
			for (int j = 0; j < colMap[i].size(); j++)
			{
				if (colMap[i][j] == 1)
				{


					
					bottom = i * 32 + 32;
					top = i * 32;
					right = j * 32 + 32;
					left = j * 32;
					
					
					if (spriteright<left || spriteleft>right ||
						spritetop > bottom || spritebottom < top)
					{
						gameov = false;
					}

					else
						gameov = true;
					break;
						
					
						
				}

			}
			

			

		}
		if (gameov != true)
		{
			GameDraw();
		}
		else
			GameOver();
		
		
	}
	

}
void Game::Aktualizacja()
{
	spritebottom = spritePlayer.getPosition().y + 32;
	spriteleft = spritePlayer.getPosition().x;
	spriteright = spritePlayer.getPosition().x + 32;
	spritetop = spritePlayer.getPosition().y;
}

void Game::LoadColMap(std::string filename)
{
	std::ifstream openfile(filename);
	std::vector<int> tempMap;
	colMap.clear();

	if (openfile.is_open())
	{
		while (!openfile.eof())
		{
			std::string str, value;
			std::getline(openfile, str);
			std::stringstream stream(str);

			while (std::getline(stream, value, ' '))
			{
				if (value.length() > 0)
				{

					int a = atoi(value.c_str());
					tempMap.push_back(a);
				}
			}

			colMap.push_back(tempMap);
			tempMap.clear();

		}
	}
}

void Game::GameOver()
{
	window.clear();
	sf::Text tekst;

		tekst.setCharacterSize(70);

		tekst.setString("GAME OVER");
		tekst.setPosition(1920 / 2 - tekst.getGlobalBounds().width / 2, 250  * 120);

		window.draw(tekst);
	}


void Game::GameDraw()
{
	window.draw(spritePlayer);
	view.setCenter(spritePlayer.getPosition().x, spritePlayer.getPosition().y);
	window.setView(view);

	window.display();
	window.clear();
}





 
0

nikt nie pomoze :(

0

Powinieneś wykorzystać maszynę stanów. Tutaj masz przydatne info jak to może wyglądać:
http://gamedevgeek.com/tutorials/managing-game-states-in-c/

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