“完美”碰撞检测算法修复

时间:2013-06-27 00:41:33

标签: java algorithm collision

我正在制作一个游戏,我需要让我的物体碰撞,但我有许多快速的小物体和正常的碰撞算法(形状的交点等)不起作用,因为位置+速度迭代推进了墙壁和从来没有真正的交叉点。

所以我开始构建我自己的(也许它已经存在,但我没有在任何地方看到)碰撞算法基于保存对象的最后位置。

请参阅以下图片:

enter image description here

这个想法在图像的第1帧和第2帧中得到了证明。基本上通过检查最后一个矩形的左侧和新矩形的右侧之间是否有墙,我检查碰撞时从不跳过区域,并且没有跳过墙的风险(所以我想)。

这是算法的代码:

    private void bounce(GameElement b, Terrain t)
{
    Rectangle tR = t.getRectangle();
    int tRleft = tR.x;
    int tRright = tR.x+tR.width;
    int tRup = tR.y;
    int tRdown = tR.y+tR.height;

    Rectangle bRnow = b.getRectangle();
    int bRnowLeft = bRnow.x;
    int bRnowRight = bRnow.x+bRnow.width;
    int bRnowUp = bRnow.y;
    int bRnowDown = bRnow.y+bRnow.height;

    Rectangle bRlast = b.getRectangleLast();
    int bRlastLeft = bRlast.x;
    int bRlastRight = bRlast.x+bRlast.width;
    int bRlastUp = bRlast.y;
    int bRlastDown = bRlast.y+bRlast.height;

    boolean leftRight = false, rightLeft=false, upDown=false, downUp=false;
    boolean betweenX = false, betweenY = false;

    if(bRnow.x>bRlast.x)leftRight=true;
    if(bRnow.x<bRlast.x)rightLeft=true;
    if(bRnow.y>bRlast.y)upDown=true;
    if(bRnow.y<bRlast.y)downUp=true;

    if(bRlastRight>tRleft && bRlastLeft<tRright) betweenX = true;
    if(bRlastDown>tRup && bRlastUp<tRdown) betweenY=true;

    if(leftRight)
        if((tRleft>bRnowLeft || tRleft>bRlastLeft) && tRleft<bRnowRight && betweenY)
        {
            b.setX(tR.x-bRnow.width - 1);
        }

    if(rightLeft)
        if((tRright<bRnowRight || tRright<bRlastRight) && tRright>bRnowLeft && betweenY)
        {
            b.setX(tR.x+tR.width + 1);
        }

    if(upDown)
        if((tRup>bRnowUp || tRup>bRlastUp) && tRup<bRnowDown && betweenX)
        {
            b.setY(tR.y-bRnow.height - 1);
        }

    if(downUp)
        if((tRdown<bRnowDown || tRdown<bRlastDown) && tRdown>bRnowUp && betweenX)
        {
            b.setY(tR.y+tR.height + 1);
        }   
}

它被称为弹跳,因为它不是真正有组织的atm,我仍然需要考虑如何构造算法,使它变得更加通用和实用(也希望得到帮助)

这种做碰撞的方法目前有一个错误,如图3所示(对不起绘制圆圈,它们应该是正方形),因为FAST对象仍然通过对角线:/另一方面,直接击中墙壁非常整洁。

我如何改进,优化和组织此算法?或者是否有更好的算法,我只是想什么都没有?感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

轴对齐的边界框树通常非常适合检测对象碰撞。 Here is a tutorial with some code - 其示例用于3D碰撞检测,但数据结构可以很容易地适应2D碰撞检测。