水平碰撞不起作用 AABB C++
Horizontal Collision not working AABB C++
更新
再次更改了碰撞代码并为AABB制作了一个组件,现在看来问题仅在于水平碰撞,它没有将物体推到它认为足够的位置但是与Y轴的代码相同所以它应该没问题。
(它确实检测到水平碰撞分辨率是问题)
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;
}
}
}
我没有 debug/read 你的整个代码,但这看起来像是一个经典问题。一旦检测到碰撞,就可以通过单一方向和穿透来解决它。
发生的情况是,在移动和碰撞之后,解决一个轴可能会使另一个轴仍然存在碰撞。从那里开始,一切都崩溃了。
或者可能是您与两个物体发生碰撞,解决第二个物体会使您回到已经调整过的物体。
至少,调回位置后,您需要检查所有物体是否都清晰。
这可能不是您要查找的内容,但尝试同时解析 X 轴和 Y 轴可能相当复杂。
一个解决方案可能是独立步进每个轴并分别解决它们的碰撞。
你必须执行两次碰撞检测,但它使解决更简单,IE 不检查碰撞解决是否导致更多碰撞你只是停止沿着第一个碰撞对象的边缘移动。
这篇文章在我开发自己的 2D 平台游戏时帮助了我,它推荐了这种做法:
http://higherorderfun.com/blog/2012/05/20/the-guide-to-implementing-2d-platformers/
更新
再次更改了碰撞代码并为AABB制作了一个组件,现在看来问题仅在于水平碰撞,它没有将物体推到它认为足够的位置但是与Y轴的代码相同所以它应该没问题。
(它确实检测到水平碰撞分辨率是问题)
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;
}
}
}
我没有 debug/read 你的整个代码,但这看起来像是一个经典问题。一旦检测到碰撞,就可以通过单一方向和穿透来解决它。
发生的情况是,在移动和碰撞之后,解决一个轴可能会使另一个轴仍然存在碰撞。从那里开始,一切都崩溃了。
或者可能是您与两个物体发生碰撞,解决第二个物体会使您回到已经调整过的物体。
至少,调回位置后,您需要检查所有物体是否都清晰。
这可能不是您要查找的内容,但尝试同时解析 X 轴和 Y 轴可能相当复杂。
一个解决方案可能是独立步进每个轴并分别解决它们的碰撞。
你必须执行两次碰撞检测,但它使解决更简单,IE 不检查碰撞解决是否导致更多碰撞你只是停止沿着第一个碰撞对象的边缘移动。
这篇文章在我开发自己的 2D 平台游戏时帮助了我,它推荐了这种做法:
http://higherorderfun.com/blog/2012/05/20/the-guide-to-implementing-2d-platformers/