Java &引用;“完美”;碰撞检测算法

Java &引用;“完美”;碰撞检测算法,java,algorithm,collision,Java,Algorithm,Collision,我正在做一个游戏,我需要给我的物体碰撞,但我有许多快速的小物体和正常的碰撞算法(形状的交集等)不起作用,因为位置+速度迭代推进墙壁,实际上从来没有交集 因此,我开始构建自己的(可能它已经存在,但我在任何地方都看不到)碰撞算法,该算法基于保存对象的最后位置 请参见下图: 该想法在图像的第1帧和第2帧中进行了演示。基本上,通过检查最后一个矩形的左侧和新矩形的右侧之间是否有墙,我在检查碰撞时从不跳过区域,也不存在跳过墙的风险(因此我认为) 这是算法的代码: private void boun

我正在做一个游戏,我需要给我的物体碰撞,但我有许多快速的小物体和正常的碰撞算法(形状的交集等)不起作用,因为位置+速度迭代推进墙壁,实际上从来没有交集

因此,我开始构建自己的(可能它已经存在,但我在任何地方都看不到)碰撞算法,该算法基于保存对象的最后位置

请参见下图:

该想法在图像的第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);
        }   
}
private void bounce(游戏元素b,地形t)
{
矩形tR=t.getRectangle();
int tRleft=tR.x;
int tRright=tR.x+tR.width;
int tRup=tR.y;
int tRdown=tR.y+tR.height;
矩形bRnow=b.getRectangle();
int brnowleet=bRnow.x;
int bRnowRight=bRnow.x+bRnow.width;
int bRnowUp=bRnow.y;
int bRnowDown=bRnow.y+bRnow.height;
矩形bRlast=b.getRectangleLast();
int bRlastLeft=bRlast.x;
int bRlastRight=bRlast.x+bRlast.width;
int bRlastUp=bRlast.y;
int bRlastDown=bRlast.y+bRlast.height;
布尔值leftRight=false,rightLeft=false,upDown=false,downUp=false;
布尔值betweenX=false,betweenY=false;
如果(bRnow.x>bRlast.x)leftRight=true;
如果(bRnow.xbRlast.y)upDown=true;

如果(bRnow.ytRleft&&bRlastLefttRup&&bRlastUpbRnowLeft | | tRleft>bRlastLeft)&&tRleftbRlastUp)&&tRup轴对齐的边界框树通常非常适合检测对象碰撞。-其示例用于3D碰撞检测,但数据结构可以轻松适应2D碰撞检测。

阅读材料:引用了类似的方法。我不知道完美碰撞会更容易使用圆而不是正方形。这看起来非常复杂,计算成本也很高。对于我正在寻找的东西来说,它似乎只成功地检测到了碰撞点,但没有成功地检测到快速移动对象的碰撞。毕竟,只有在截取边界框的情况下,才会创建树,对吗?如果移动成功的话这是如此之大,以至于从来没有一个边界框截获它不应该工作。。。