Я делаю платформенную игру, используя Direct2D. Я сделал логику столкновения. Это работает хорошо, но у меня проблемы на углу платформ. например. когда мой персонаж прыгает, но чуть ниже вершины платформы в углу, он поднимается над платформой. Точно так же, некоторые из моих платформ имеют коллекцию точек, когда их толкают снизу, но когда мой персонаж сталкивается со стороны и находится чуть ниже дна платформы, коллекция запускается. Пожалуйста скажите мне, как улучшить мою логику столкновения?
Вот мой код столкновения:
D2D1_RECT_F gmsh = g->GetMesh();
//for each wall and platform, check if it falls inside the players bounding box. If yes, check if player is colliding with it
if ((gmsh.left <= boundBox.left && gmsh.right >= boundBox.right) || (gmsh.right <= boundBox.right&&gmsh.right >= boundBox.left))
{
if (g->DetectCollision(collisionMesh))
{
if (collisionMesh.right >= gmsh.left&&collisionMesh.left < gmsh.left && ((collisionMesh.bottom - collisionMesh.top) / 2 + collisionMesh.top > gmsh.top) && ((collisionMesh.bottom - collisionMesh.top) / 2 + collisionMesh.top < gmsh.bottom ))//handle collision from left
{
collisionMesh.right = gmsh.left;
collisionMesh.left = collisionMesh.right - 11;
displayMesh.left = collisionMesh.left - 2;
displayMesh.right = collisionMesh.right + 2;
}
else if (collisionMesh.left <= gmsh.right&&collisionMesh.right > gmsh.right && ((collisionMesh.bottom - collisionMesh.top) / 2 + collisionMesh.top > gmsh.top) && ((collisionMesh.bottom - collisionMesh.top) / 2 + collisionMesh.top < gmsh.bottom ))//handle collision from right
{
collisionMesh.left = gmsh.right;
collisionMesh.right = collisionMesh.left + 11;
displayMesh.left = collisionMesh.left - 2;
displayMesh.right = collisionMesh.right + 2;
}
else if ((collisionMesh.bottom >= gmsh.top) && (collisionMesh.top < gmsh.top) && (collisionMesh.bottom < gmsh.bottom) && ((collisionMesh.right - collisionMesh.left) / 2 + collisionMesh.left + 2 > gmsh.left) && ((collisionMesh.right - collisionMesh.left) / 2 + collisionMesh.left < gmsh.right + 2))//handle collision from top
{
collisionMesh.bottom = gmsh.top;
collisionMesh.top = collisionMesh.bottom - 15;
displayMesh.bottom = collisionMesh.bottom;
displayMesh.top = collisionMesh.top;
ySpeed = 0;
onGround = true;
}
else if ((collisionMesh.top <= gmsh.bottom) && (collisionMesh.bottom > gmsh.top) && (collisionMesh.bottom > gmsh.bottom) && ((collisionMesh.right - collisionMesh.left) / 2 + collisionMesh.left + 2 > gmsh.left) && ((collisionMesh.right - collisionMesh.left) / 2 + collisionMesh.left < gmsh.right + 2))//handle collision from bottom
{
collisionMesh.top = gmsh.bottom;
collisionMesh.bottom = collisionMesh.top + 15;
displayMesh.bottom = collisionMesh.bottom;
displayMesh.top = collisionMesh.top;
ySpeed = 0.5;
g->MoveUp();
}
}
}
g - стена или платформа, g-> DetectCollision (...) использует метод CompareGeomery для проверки перекрытия. collisionMesh - это объект игрока D2D_RECT_F. g-> GetMesh () возвращает D2D_RECT_F, который является границей стены или платформы. displayMesh - это D2D_RECT_F для отображения игрока.