【发布时间】:2015-10-18 18:56:48
【问题描述】:
我只是想用一种通用的方法来检查矩形之间的碰撞。如果你碰到一个矩形的顶部停止移动。然而,无论 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;
}
错误在这里,这里是反应方法
public void react(int occurence){
if(occurence == Tuples.HIT_BOTTOM){
velocity.y = 0;
}
}
但是,如果它们相距较远,则代码看起来完美。
我还注意到,如果矩形位于另一个矩形的左侧,它可能会穿过其他矩形,但如果它进一步向右,它就会像落在矩形上一样被挂起。上图起作用的唯一原因是因为最右边的首先下降,如果它落在左边的矩形之后,那么左边到另一个矩形的任何东西也会被挂起
我只是看不出我到底做错了什么,非常感谢任何帮助!
【问题讨论】:
-
如果您可以在代码中添加一些您认为应该执行的操作,例如您的 if 条件执行的操作,那就太好了。
-
谢谢你,我现在会添加@PinkieSwirl
-
例如:distanceY 总是正数,为什么要测试
distanceY >= -1?您是否更改了代码并且没有调整某些内容? -
@PinkieSwirl 谢谢你现在应该是零改变了!
-
您的代码中有很多错误,我要指出很多错误,因为我无法正确解释它们。这就是为什么我建议以下,使用
Rectangle(一个 libgdx 类)它带有一个重叠方法。然后你只需要确保你不会混淆哪个矩形在顶部/底部(你这样做)。如果你不想使用它,看看它的源代码。要捕获所有可能的“碰撞”,您需要为矩形添加 4*2 检查,左/右/上/下侧两个检查,目前您只有 2 个(也不完全正确)。