我只是想采用一种通用方法来检查矩形之间的碰撞。如果您碰到矩形的顶部,请停止移动。然而,无论 x 坐标如何,我的矩形似乎都会停止。我有三个掉落的矩形和一个不动的静态矩形,它们应该都落在这个静态矩形的顶部,但是当我运行代码时会发生这种情况。
这是碰撞处理程序代码
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;
}
错误就在这里,这里是react方法
public void react(int occurence){
if(occurence == Tuples.HIT_BOTTOM){
velocity.y = 0;
}
}
但是,如果它们相距较远,代码看起来就会完美。
我还注意到,如果该矩形位于另一个矩形的左侧,则该矩形可能会穿过其他矩形,但如果它完全向右,它将被挂起,就好像它落在该矩形上一样。上面的图像起作用的唯一原因是因为最右边的首先下降,如果它落在左边的矩形之后,另一个矩形左边的任何东西也会被挂起
我只是不明白我到底做错了什么,非常感谢任何帮助!
最佳答案
将条件中的 iPos 更改为更通用的内容,如果 Ipos 或 kPos 是您需要检查的内容,则将像 allocateDx 和 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;
}
}
关于java - 碰撞处理程序未按 libgdx java 指定的方式工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33201947/