Mam problem otóż programowałem kolizje pomiędzy graczem a ścianą w sfml-u i wszystko było cacy.
Ściana lewa jest kolizja,prawa jest kolizja góra i dół to samo, myśle okej więc zacząłem tworzyć mape i dopiero wtedy pojawił się problem , otóż jak mam pare ścian obok siebie i próbuję iść wzdłóż nich dotykając ich żeby sprawdzić czy kolizja działa to albo gracz skacze jakoś śmiesznie pomiędzy następnymi ścianami albo w nie wchodzi co najśmieszniejsze jest to jedynie błąd dotyczący górnej i dolnej kolizji zaś z lewej i prawej strony wszystko ładnie działa pomocy !!!
w - ściana
wCb - kolizja ściany
Ply - gracz
Cb - kolizja gracza
Walls - vector ścian
void Level1State::UpdateCollision()
{
for (auto& w : Walls)
{
if (w.wCb.intersects(Ply->Cb))
{
Ply->Velocity.x = 0.0f;
Ply->Velocity.y = 0.0f;
cout << "collision" << endl;
//Top Collision
if (Ply->Cb.top < w.wCb.top
&& Ply->Cb.top + Ply->Cb.height < w.wCb.top + w.wCb.height
&& Ply->Cb.left < w.wCb.left + w.wCb.width
&& Ply->Cb.left + Ply->Cb.width> w.wCb.left)
{
Ply->Velocity.x = 0.0f;
Ply->Velocity.y = 0.0f;
Ply->PlayerMesh.setPosition(Ply->Cb.left + Ply->Cb.width / 2, w.wCb.top - Ply->Cb.height/2 - 1);
}
//Bottom Collision
else if (Ply->Cb.top > w.wCb.top
&& Ply->Cb.top + Ply->Cb.height> w.wCb.top + w.wCb.height
&& Ply->Cb.left < w.wCb.left + w.wCb.width
&& Ply->Cb.left + Ply->Cb.width > w.wCb.left)
{
Ply->Velocity.x = 0.0f;
Ply->Velocity.y = 0.0f;
Ply->PlayerMesh.setPosition(Ply->Cb.left + Ply->Cb.width / 2, w.wCb.top + w.wCb.height + Ply->Cb.height/2 + 1);
}
//Left Collision
if (Ply->Cb.left < w.wCb.left
&& Ply->Cb.left + Ply->Cb.width < w.wCb.left + w.wCb.width
&& Ply->Cb.top < w.wCb.top + w.wCb.height
&& Ply->Cb.top + Ply->Cb.height > w.wCb.top)
{
Ply->Velocity.x = 0.0f;
Ply->Velocity.y = 0.0f;
Ply->PlayerMesh.setPosition(w.wCb.left - Ply->Cb.width/2 - 1, Ply->Cb.top + Ply->Cb.height / 2);
}
//Right Collision
else if (Ply->Cb.left > w.wCb.left
&& Ply->Cb.left + Ply->Cb.width > w.wCb.left + w.wCb.width
&& Ply->Cb.top < w.wCb.top + w.wCb.height
&& Ply->Cb.top + Ply->Cb.height > w.wCb.top)
{
Ply->Velocity.x = 0.0f;
Ply->Velocity.y = 0.0f;
Ply->PlayerMesh.setPosition(w.wCb.left + w.wCb.width + Ply->Cb.width/2 + 1, Ply->Cb.top + Ply->Cb.height / 2);
}
}
else
{
Ply->Velocity.x = 1.0f;
Ply->Velocity.y = 1.0f;
}
if (w.wCb.intersects(Ply->Bcb))
{
cout << "You Shooted The Wall" << endl;
}
}
}