我只是试图通过一种通用方法来检查矩形之间的碰撞。如果你击中一个矩形的顶部停止移动。然而,无论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;
}
}
但是,如果它们相距更远,则代码可以完美呈现。
我还注意到,如果矩形位于另一个矩形的左侧,矩形可以通过其他矩形,但如果它进一步向右,它会挂起,好像它落在矩形上一样。上面图像工作的唯一原因是因为最右边的第一个下降,左边的任何一个矩形的任何东西都会挂起,如果它落在左边的矩形之后
我只是不知道我到底做错了什么,非常感谢任何帮助!
答案 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;
}
}