水平碰撞不起作用AABB C ++

时间:2018-09-27 00:09:01

标签: c++ aabb

更新

再次更改了碰撞代码,并为AABB制作了一个组件,现在看来问题仅在于水平碰撞,它无法充分推动对象,但与Y轴的代码相同,因此不应有问题。

(它确实检测出水平碰撞的分辨率是问题所在)

image

void Hermes_Player::Collision(GameObject * other)
{
    if (other->GetTag() == "wall") {
        AABB* myAABB = dynamic_cast<AABB*>(this->GetComponent("aabb"));
        AABB* otherAABB = dynamic_cast<AABB*>(other->GetComponent("aabb"));
        if (abs(myAABB->lastCenter.x - otherAABB->lastCenter.x) < myAABB->halfCenter.x + otherAABB->halfCenter.x) {
            std::cout << "y" << std::endl;
            if (myAABB->center.y < otherAABB->center.y) {
                int distance = (myAABB->halfCenter.y + otherAABB->halfCenter.y) - (otherAABB->center.y - myAABB->center.y);
                this->Position.y -= distance;
                myAABB->center.y = (myAABB->center.y - distance);
            }
            if (myAABB->center.y > otherAABB->center.y) {
                int distance = (myAABB->halfCenter.y + otherAABB->halfCenter.y) - (myAABB->center.y - otherAABB->center.y);
                this->Position.y += distance;
                myAABB->center.y = (myAABB->center.y + distance);
            }
        }
        else
        {
            std::cout << "x" << std::endl;

            int dist = myAABB->halfCenter.x + otherAABB->halfCenter.x;
            int dif = (this->Size.x + other->Size.x) /2- abs(dist);
            if (myAABB->center.x < otherAABB->center.x) {
                int distance = (myAABB->halfCenter.x + otherAABB->halfCenter.x) - (otherAABB->center.x - myAABB->center.x);
                this->Position.x -= distance;
                myAABB->center.x = (myAABB->center.x - distance);
            }
            if (myAABB->center.x > otherAABB->center.x) {
                int distance = (myAABB->halfCenter.x + otherAABB->halfCenter.x) - (myAABB->center.x - otherAABB->center.x);
                this->Position.x += distance;
                myAABB->center.x = (myAABB->center.x + distance);
            }
            std::cout << this->Position.x << std::endl;
        }
    }
}

2 个答案:

答案 0 :(得分:1)

我没有调试/读取整个代码,但这看起来是一个经典问题。一旦检测到碰撞,就可以通过单一方向和穿透力来解决它。

发生的事情是,在移动和碰撞后,在一个轴上解析可能会导致另一轴仍然存在碰撞。从那里,一切都崩溃了。

或者可能是您与两个对象碰撞,解决了第二个对象会使您回到已调整的对象中。

至少,在向后调整位置之后,您需要检查所有对象的所有位置是否都清晰可见。

答案 1 :(得分:1)

这可能不是您要查找的内容,但是尝试同时解析X和Y轴可能会非常复杂。

一种解决方案可能是独立移动每个轴并分别解决它们的冲突。

您必须执行两次碰撞检测,但是它使分辨率变得更加简单,IE无需检查碰撞分辨率是否会导致更多碰撞,您只需停止沿第一个与之碰撞的对象的边缘移动即可。

这是一篇文章,在我开发自己的2D平台器时对我有帮助,并建议这种做法:

http://higherorderfun.com/blog/2012/05/20/the-guide-to-implementing-2d-platformers/