wykrywanie kolizji i co dalej?

0

Witam, mam kod, który wykrywa kolizje. Korzystam z SFML.

Chodzi o to, by obiekt nie wyszedł poza prostokąt. (Ograniczam mu pole gry)

wszystko pięknie, wykrywa mi kiedy wychodzi, lecz co dalej?

oto kod:


s	void aktualizuj()
	{
		doGory = false; doDolu = false;
		wLewo = false; wPrawo = false;
		if (sf::Keyboard::isKeyPressed(sf::Keyboard::Up))
			doGory = true;
		else if (sf::Keyboard::isKeyPressed(sf::Keyboard::Down))
			doDolu = true;
		else if (sf::Keyboard::isKeyPressed(sf::Keyboard::Left))
			wLewo = true;
		else if (sf::Keyboard::isKeyPressed(sf::Keyboard::Right))
			wPrawo = true;
	}

	sf::Vector2f ruch()
    {
		v.x = 0;
		v.y = 0;
		if (doGory)
		{
			v.y -= predkosc;
			animacje();
		}
          
        if(doDolu)
		{
			
            v.y += predkosc;
			animacje();
		}
        if(wLewo)
		{
			
            v.x -= predkosc;
			animacje();
		}
		if (wPrawo)
		{
			v.x += predkosc;
			animacje();
		}
		return v;
    }

	void porusz(sf::Vector2f v)
	{
		sprajt.move(v);
	}
	FloatRect doKolizji()
	{
		return sprajt.getGlobalBounds();
	}
	float dajpozycjex()
	{
		return sprajt.getPosition().x;
	}
	float dajpozycjey()
	{
		return sprajt.getPosition().y;
	}
	~Gracz(void){};



};
class Kolizje {
public:

	static void czywychodzi(Gracz &g1, sf::RectangleShape prostokat, Vector2f ruch)
	{

		sf::FloatRect X = g1.doKolizji();
		sf::FloatRect Y = g1.doKolizji();
		X.left += ruch.x ;
		Y.top += ruch.y ;
		g1.porusz(Vector2f(ruch.x, ruch.y));
		if (prostokat.getGlobalBounds().width<g1.dajpozycjex() || g1.dajpozycjex()<0 )
		{
			cout << "wyszedl za prawo lub lewo" << endl;

		}
		if (prostokat.getGlobalBounds().height < g1.dajpozycjey() || g1.dajpozycjey() < 0 )
		{
			cout << "wyszedl za gore lub dol" << endl;
		}
		
	}
};


Próbuje ograniczyć mu ruch w zależnosci od wykrytego przejscia przez prostokąt (os x lub y)

wpadłem na coś takiego :



static void czywychodzi(Gracz &g1, sf::RectangleShape prostokat, Vector2f ruch)
	{

		sf::FloatRect X = g1.doKolizji();
		sf::FloatRect Y = g1.doKolizji();
		X.left += ruch.x ;
		Y.top += ruch.y ;
		bool kolX = false; bool kolY = false;
		if (prostokat.getGlobalBounds().width < g1.dajpozycjex() || g1.dajpozycjex() < 0)
			kolX = true;
		if (prostokat.getGlobalBounds().height < g1.dajpozycjey() || g1.dajpozycjey() < 0 )
			kolY = true;
		if (!kolX)
			g1.porusz(Vector2f(ruch.x, 0));
		if (!kolY)
			g1.porusz(Vector2f(0, ruch.y));
	}	

lecz gdy wyjde za prostokąt, nie moge wrócic sprajtem na niego ( moge tylko poruszać się po osi oy - jeśli wyszedłem na ox), a gdy wyjde na róg, nie moge się ruszyć z miejsca. Jakieś pomysły?

0

Jeśli kolejny ruch nie spowoduje kolizji to takowy wykonaj
lub
Jeśli po ruchu zaszła kolizja to przesuń o najkrótszy wektor pozwalający na wyjście z obszaru kolizji

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.