【发布时间】:2013-12-01 09:51:22
【问题描述】:
我有两个矩形对象,它们源自一个点并使用鼠标移动。碰撞代码完美运行,但是当物体发生碰撞时,物体突然变得无法移动。
//Here is my collision code
bool collision(GLPoint A, GLPoint B)
{
//Width/Height
int w = 150;
int h = 150;
//Sides of A Rectangle
int leftA = A.x;
int rightA = A.x+w;
int topA = A.y;
int bottomA = A.y+h;
//Sides of B Rectangle
int leftB = B.x;
int rightB = B.x+w;
int topB = B.y;
int bottomB = B.y+h;
if(bottomA <= topB)
return false;
if(topA >= bottomB)
return false;
if(rightA <= leftB)
return false;
if(leftA >= rightB)
return false;
return true;
/*
if(ALeft <= BRight)
return true;
else
return false;*/
}
这是我的代码,如果鼠标在矩形内,我将在其中移动对象。如果鼠标没有碰撞,我可以移动它。但是,当对象与另一个矩形碰撞时,它就会卡住。这是物体碰撞前的照片。 http://imgur.com/3GQnO0x
static int x=iarray[0].x;
static int y=iarray[0].y;
//Set points of 1st Instance
if(mouseX > iarray[0].x && mouseX < iarray[0].x +150 && 750-mouseY < iarray[0].y && 750-mouseY > iarray[0].y-150)
{
if(collision(iarray[0], iarray[1]))
{
cout << "COLLIDING" << endl;
}
else
{
cout << "NOT COLLIDING" << endl;
x = mouseX-75, y = 750-mouseY+50;
}
iarray[0].set(x,y);
}
【问题讨论】:
-
如果发生碰撞,那么您可能仍想更改 x,y 坐标。将行“x = mouseX-75, y = 750-mouseY+50”移出 else 块,否则只会在不碰撞时移动。
-
这通常通过研究状态转换的逻辑来解决——a) 允许将身体移动到不会发生碰撞的位置。 b) 如果你允许碰撞发生,你应该允许一个物体向一个非碰撞位置移动(如果一切都失败了,你可以存储之前的位置,当一切正常时)。
-
你可以检查未来的位置,而不是检查当前的移动,所以在你想要移动的方向上向矩形添加一个偏移量
-
@Xonar,我不确定将矩形准确移动到哪里。我尝试了多种方法将其移动到不会发生碰撞但不是很精确的地方。我希望它能够检测到它是否撞击左侧并从左侧向外移动。你认为我应该扩展我的碰撞方法吗?
-
@Anton 和 Aki 我将如何实现偏移。我是否必须在碰撞矩形周围制作一个稍大的矩形,看看是否会发生碰撞?