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

SFML cpp gra kolizje

0 głosów
44 wizyt
pytanie zadane 5 dni temu w C i C++ przez hicodyn Początkujący (400 p.)

tutaj link ---> film co sie dzieje

hej, mam taką funkcje do sprawdzania kolizji i generalnie dziala dobrze, ale jesli najezdzam postacia na platforme od gory albo od dolu i cala postac nie znajduje sie jakby w szerokości platformy, to przerzuca mi ja na bok zamiast zostawic na platformie. ktos wie jak to naprawić?

 


void Player::checkCollisions(std::vector<Obstacle> obstacles)
{
	sf::Vector2f playerPos = hitbox.getPosition();

	for (auto& obs : obstacles) {
		sf::FloatRect playerBounds = hitbox.getGlobalBounds();
		sf::FloatRect wallBounds = obs.getObstacle().getGlobalBounds();

		nextPosition = playerBounds;
		nextPosition.left += velocity.x;
		nextPosition.top += velocity.y;

		if (wallBounds.intersects(nextPosition)) {
			//Bottom collision
			if (playerBounds.top < wallBounds.top
				&& playerBounds.top + playerBounds.height < wallBounds.top + wallBounds.height
				&& playerBounds.left < wallBounds.left + wallBounds.width
				&& playerBounds.left + playerBounds.width > wallBounds.left
				)
			{
				this->isPressed = 0;
				velocity.y = 0.f;
				player.setPosition(playerBounds.left, wallBounds.top - playerBounds.height);
				hitbox.setPosition(playerBounds.left, wallBounds.top - playerBounds.height);
			}

			//Top collision
			else if (playerBounds.top > wallBounds.top
				&& playerBounds.top + playerBounds.height > wallBounds.top + wallBounds.height
				&& playerBounds.left < wallBounds.left + wallBounds.width
				&& playerBounds.left + playerBounds.width > wallBounds.left
				)
			{
				velocity.y = 0.f;
				player.setPosition(playerBounds.left, wallBounds.top + wallBounds.height);
				hitbox.setPosition(playerBounds.left, wallBounds.top + wallBounds.height);
			}

			//Right collision
			if (playerBounds.left < wallBounds.left
				&& playerBounds.left + playerBounds.width < wallBounds.left + wallBounds.width
				&& playerBounds.top < wallBounds.top + wallBounds.height
				&& playerBounds.top + playerBounds.height > wallBounds.top
				)
			{
				velocity.x = 0.f;
				player.setPosition(wallBounds.left - playerBounds.width, playerBounds.top);
				hitbox.setPosition(wallBounds.left - playerBounds.width, playerBounds.top);
			}

			//Left collision
			else if (playerBounds.left > wallBounds.left
				&& playerBounds.left + playerBounds.width > wallBounds.left + wallBounds.width
				&& playerBounds.top < wallBounds.top + wallBounds.height
				&& playerBounds.top + playerBounds.height > wallBounds.top
				)
			{
				velocity.x = 0.f;
				player.setPosition(wallBounds.left + wallBounds.width, playerBounds.top);
				hitbox.setPosition(wallBounds.left + wallBounds.width, playerBounds.top);
			}
		}
	}
}

 

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
1 odpowiedź 468 wizyt
pytanie zadane 11 grudnia 2017 w C i C++ przez seba360pl Początkujący (260 p.)
0 głosów
0 odpowiedzi 76 wizyt
pytanie zadane 6 września 2020 w C i C++ przez NieMaJuzNazw Użytkownik (890 p.)
+1 głos
0 odpowiedzi 113 wizyt

88,311 zapytań

136,904 odpowiedzi

305,517 komentarzy

58,593 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Sklep oferujący ćwiczenia JavaScript, PHP, rozmowy rekrutacyjne dla programistów i inne materiały

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...