【问题标题】:Object gets stuck after collision物体碰撞后卡住
【发布时间】: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

碰撞后:http://imgur.com/219TgFL.

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 我将如何实现偏移。我是否必须在碰撞矩形周围制作一个稍大的矩形,看看是否会发生碰撞?

标签: c++ opengl glut


【解决方案1】:

与其检查当前位置,不如检查将来的位置并决定是否可以移动。换句话说:使边界矩形更大,但不是您绘制的实际内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-05
    • 1970-01-01
    • 1970-01-01
    • 2013-12-24
    • 1970-01-01
    • 2023-03-15
    相关资源
    最近更新 更多