我需要帮助检查我正在创建的游戏中的交叉点:当角色与屏幕上的单个障碍物碰撞时,一切都按预期工作,但是当屏幕上添加了多个障碍物时,角色只能跳出正在检查碰撞的最后一个障碍。角色仍然与其他障碍物正确碰撞(不会通过,不能穿过),但不能跳出它们。 Obs是一个障碍的arraylist。 Ground是布尔值,用于确定是否允许角色跳跃。
public void checkIntersect(ArrayList<Obstacle> obs){
for(Obstacle a: obs){
if(a.getLeft().intersects(this.getRight())){
if(getDx()>0){
sidecollision=true;
setDx(0);
this.x-=1.5f;
}
} if (a.getRight().intersects(this.getLeft())){
sidecollision = true;
setDx(0);
this.x+=1.5f;
} if((a.getTop()).intersects(this.getBottom())){
ground=true;
setDy(0);
this.y-=.10f;
} else if(!(a.getTop()).intersects(this.getBottom())){
ground = false;
//return ground;
} if(a.getBottom().intersects(this.getTop())){
ground=false;
setDy(0);
this.y+=.1f;
}
}
}
以及如何在游戏组件上检查碰撞:
bg.update(quote);
win.fill(clear);
bg.drawBG(win);
for(Obstacle o: obs){
o.draw(win);
o.update(bg);
}
if(quote.isVisible()){
quote.movedrawProtag(win, keys);
quote.checkIntersect(obs);
}
答案 0 :(得分:0)
导致错误的最可能原因是后续调用checkIntersect()
会覆盖ground
的值。这导致ground
的值仅反映最后一次调用checkIntersect()
。要解决此错误,您应在ground
之前将true
设置为false
或checkIntersect()
的默认值。然后,修改checkIntersect()
方法,使其只能将ground
设置为非默认值。当ground
应该是默认值时,不需要设置它。
做这样的事情。我使用的默认值为false
。
public void checkIntersect(ArrayList<Obstacle> obs){
for(Obstacle a: obs){
if(a.getLeft().intersects(this.getRight())){
if(getDx()>0){
sidecollision=true;
setDx(0);
this.x-=1.5f;
}
} if (a.getRight().intersects(this.getLeft())){
sidecollision = true;
setDx(0);
this.x+=1.5f;
} if((a.getTop()).intersects(this.getBottom())){
ground=true;
setDy(0);
this.y-=.10f;
} else if(!(a.getTop()).intersects(this.getBottom())){
// ground = false;
//return ground;
} if(a.getBottom().intersects(this.getTop())){
// ground=false;
// setDy(0);
// this.y+=.1f;
}
}
}
检查碰撞时:
bg.update(quote);
win.fill(clear);
bg.drawBG(win);
for(Obstacle o: obs){
o.draw(win);
o.update(bg);
}
// Set ground to its default value
quote.ground = false;
if(quote.isVisible()){
quote.movedrawProtag(win, keys);
quote.checkIntersect(obs);
}
// If ground has not been set to true, do the default action
if (quote.ground == false) {
setDy(0);
quote.y += .1f;
}