Platformówka a BOUNDING BOX COLLISION

0

Piszę platformówkę przy użyciu SFML2, mam taki system kolizji gdzie wyliczam położenie lewo,prawo,górę,dół od gracza i klocków, potem jeśli kolizja występuję przypisuję odpowiednie położenie:

if(player.getSize().intersects(sprite.getGlobalBounds()) )
	{	
		float bottom = sprite.getPosition().y + sprite.getGlobalBounds().height;
		float left = sprite.getPosition().x;
		float right = sprite.getPosition().x + sprite.getGlobalBounds().width;
		float top = sprite.getPosition().y;

		float pBottom = player.getPosition().y + player.getSize().height;
		float pLeft = player.getPosition().x;
		float pRight = player.getPosition().x + player.getSize().width;
		float pTop = player.getPosition().y;

		float prevBottom = player.getPrevPosition().y + player.getSize().height;
		float prevLeft = player.getPrevPosition().x;
		float prevRight = player.getPrevPosition().x + player.getSize().width;
		float prevTop = player.getPrevPosition().y;

		if(pBottom >= top)
		{
			sf::Vector2f newPosition;
			newPosition.x = player.getPosition().x;
			newPosition.y = top - 0.1 - player.getSize().height;

			player.setPosition(newPosition);

		}
		else if(pTop <= bottom)
		{
			sf::Vector2f newPosition;
			newPosition.x = player.getPosition().x;
			newPosition.y = bottom;

			player.setPosition(newPosition);
		}
		else if(pRight >= left)
		{
			sf::Vector2f newPosition;
			newPosition.x = left - 0.1 - player.getSize().width;
			newPosition.y = player.getPosition().y;

			player.setPosition(newPosition);
		
	
		}
		else if(pLeft <= right)
		{
			sf::Vector2f newPosition;
			newPosition.x = right;
			newPosition.y = player.getPosition().y;

			player.setPosition(newPosition);
		}

Problem polega na tym że jak kolizja powinna wystąpić po bokach -lewego lub prawego boku to teleportuje na górę klocka. Szukam rozwiązania tego problemu, bo potrzebuję taki system kolizji żeby też działało przy ruchomych platformach. Znacie jakieś rozwiązanie?

0

Zapisuj wektor prędkości i sprawdzaj kolizję jako z linią, a nie całym boxem.
Poza tym co to za wynalazek z jakąś pozycją poprzednią? :|

0

Zapomniałem usunąć ten fragment z poprzednią pozycją.
Jeśli chodzi o wektory kierunku to zawsze są dwa, bo jest możliwość że idzie w lewo, prawo i zawsze sprawdzana kolizja w dół czyli grawitacja.

0

No i co w związku z tym, bo nie rozumiem? :P

0

Dalej coś nie działa, ten sam efekt. Wrzucam poprawiony kod:

	if(player.getSize().intersects(sprite.getGlobalBounds()) )
	{	
		std::vector <Direction> direction = player.getDirection();

		float bottom = sprite.getPosition().y + sprite.getGlobalBounds().height;
		float left = sprite.getPosition().x;
		float right = sprite.getPosition().x + sprite.getGlobalBounds().width;
		float top = sprite.getPosition().y;

		float pBottom = player.getPosition().y + player.getSize().height;
		float pLeft = player.getPosition().x;
		float pRight = player.getPosition().x + player.getSize().width;
		float pTop = player.getPosition().y;

		for(int i = 0; i < direction.size(); i++)
		{
			if(direction[i] == DOWN)
			if(pBottom >= top)
			{
				sf::Vector2f newPosition;
				newPosition.x = player.getPosition().x;
				newPosition.y = top - 0.1 - player.getSize().height;

				player.setPosition(newPosition);
				player.setGravity(false);
				player.setJump(true);

				containsEntity = true;
			}

			if(direction[i] == UP)
			if(pTop <= bottom)
			{
				sf::Vector2f newPosition;
				newPosition.x = player.getPosition().x;
				newPosition.y = bottom;

				player.setPosition(newPosition);
			}

			if(direction[i] == RIGHT)
			if(pRight >= left && pBottom <= top)
			{
				sf::Vector2f newPosition;
				newPosition.x = left - 0.1 - player.getSize().width;
				newPosition.y = player.getPosition().y;

				player.setPosition(newPosition);	
			}

			if(direction[i] == LEFT)
			if(pLeft <= right && pBottom <= top)
			{
				sf::Vector2f newPosition;
				newPosition.x = right;
				newPosition.y = player.getPosition().y;

				player.setPosition(newPosition);
			}
		}
	}

zamiana jakichś bredni na znaczniki <code class="cpp"> - @furious programming

0

Weeeektoooooor prędkości miałeś tam dodać.

0

Co masz na myśli pisząc wektor prędkości, bo to ciągle daje ten sam efekt:

 
		if(player.getVelocity().y > 0)
        {
            sf::Vector2f newPosition;
            newPosition.x = player.getPosition().x;
            newPosition.y = top - 0.1 - player.getSize().height;
 
            player.setPosition(newPosition);
			player.setJump(true);
        }
		else if(player.getVelocity().y < 0)
        {
            sf::Vector2f newPosition;
            newPosition.x = player.getPosition().x;
            newPosition.y = bottom;
 
            player.setPosition(newPosition);
        }
		else if(player.getVelocity().x > 0)
        {
            sf::Vector2f newPosition;
            newPosition.x = left - 0.1 - player.getSize().width;
            newPosition.y = player.getPosition().y;
 
            player.setPosition(newPosition);
        }
		else if(player.getVelocity().x < 0)
        {
            sf::Vector2f newPosition;
            newPosition.x = right;
            newPosition.y = player.getPosition().y;
 
            player.setPosition(newPosition);
        }

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