Как применить логику столкновения в Direct2D? - PullRequest
0 голосов
/ 06 ноября 2018

Я делаю платформенную игру, используя 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 для отображения игрока.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...