碰撞处理程序不能像指定的libgdx java一样工作

时间:2015-10-18 18:56:49

标签: java libgdx

我只是试图通过一种通用方法来检查矩形之间的碰撞。如果你击中一个矩形的顶部停止移动。然而,无论x坐标如何,我的矩形似乎都会停止。我有三个矩形下降和一个不移动的静态矩形,它们应该全部落在这个静态矩形之上,但是当我运行代码时会发生这种情况。 What happens during execution

这是碰撞处理程序代码

    float distanceY, furthestLeft;
public void update() {

    for (int i = 0; i < stageObjects.size(); i++) {
        iPos = stageObjects.get(i).getPosition();
        iDim = stageObjects.get(i).getDimensions();
        for(int k = 0; k < stageObjects.size(); k++){
            kPos = stageObjects.get(k).getPosition();
            kDim = stageObjects.get(k).getDimensions();
            if(k == i){
                continue;
            }
                distanceY = assignDy();
                furthestLeft = assignDx();
             //DistanceY is the subtraction of one objects y coordinate and 
            // if it equals 0 then they are colliding and the furthest left 
            // is the bottom right x coord of the furthest left objects x 
            //coord so it should check if this x is contained within an
            // objects left x coord to right x coord
            if(distanceY <= 1 && distanceY >= 0 && furthestLeft >= iPos.x && furthestLeft <= iPos.x + iDim.x){
                stageObjects.get(i).react(Tuples.HIT_BOTTOM);
                stageObjects.get(k).react(Tuples.HIT_FROM_TOP);
                System.out.println("Collision: " + stageObjects.get(i).toString() + " with " + 
                stageObjects.get(k).toString());
            }

        }
    }

}


}


public float assignDy(){
    if(kPos.y > iPos.y){
        return Math.abs(kPos.y - (iPos.y + iDim.y));
    }else
        return Math.abs(iPos.y - (kPos.y + kDim.y));
}

public float assignDx(){
    if(kPos.x > iPos.x){
        return kPos.x + kDim.x;
    }else
        return iPos.x + iDim.x;
}

错误在于此处,这是反应方法

    public void react(int occurence){
    if(occurence == Tuples.HIT_BOTTOM){
        velocity.y = 0;
    }
}

但是,如果它们相距更远,则代码可以完美呈现。

enter image description here

我还注意到,如果矩形位于另一个矩形的左侧,矩形可以通过其他矩形,但如果它进一步向右,它会挂起,好像它落在矩形上一样。上面图像工作的唯一原因是因为最右边的第一个下降,左边的任何一个矩形的任何东西都会挂起,如果它落在左边的矩形之后

我只是不知道我到底做错了什么,非常感谢任何帮助!

1 个答案:

答案 0 :(得分:1)

将条件中的iPO更改为更通用的内容,如果Ipos或kPos是您需要检查的内容,则将assignDx和dy等变量分配给ccheck

    public void assignOx(Vector2 ox){
    if(kPos.x > iPos.x){
        ox.x = iPos.x;
        ox.y = iPos.x + iDim.x;
    }else{
        ox.x = kPos.x;
        ox.y = kPos.x + kDim.x;
    }
}