我正试图在Eclipse的SDK中为Android的学校项目制作弹球式游戏。
有一个非常奇怪且超级令人沮丧的问题,其中对象在没有任何代码告诉他们的情况下移动。基本上,每个Wall实例包含4个Line对象,用于与Ball进行碰撞检测。这些线条第一次起作用,但是一旦球与它们碰撞一次,那么该线会以某种方式移动到屏幕上的另一个位置。 我一直在调试它,并且不会问我是否还没有尝试过所有的东西,但是老实说没有理由将Line转移到任何地方。我处理碰撞的方法是将球推离距离墙壁1px,然后给予新的dx和dy(速度)移开。下面是检查碰撞的代码,然后是处理碰撞以改变球的位置和速度的函数。两者都是Ball类中的方法。
GameElement[] walls = currLevel.getWalls();
int i, j;
Line[] lines;
Line line;
RectF lineBounds;
boolean hadCollision = false;
for (i = 0; i < walls.length & !hadCollision; i++) {
lines = walls[i].getLines();
for (j = 0; j < lines.length & !hadCollision; j++) {
lineBounds = lines[j].getBounds();
if (lineBounds.intersect(point)) {
paint.setColor(Color.BLUE); // Colour ball blue.
reactToCollision3(lines[j]);
// TEST RESET!!!
//this.x = (float)(648+40);
//this.y = (float)(900-30);
hadCollision = true;
//printWallsLines();
}
}
}
和处理碰撞的功能是:
public void reactToCollision3 (Line line) {
float liney = line.sy;
float linex = line.sx;
if (line.rotation == 0.0) { // HORIZONTAL EDGE
if (this.y > liney) { // Ball moving upward hits the bottom of a wall.
this.y = liney + this.radius + 1.0f;
} else { // Ball moving downward hits the top of a wall.
this.y = liney - this.radius - 1.0f;
}
this.dy *= -1.0f;
} else { // VERTICAL EDGE
if (this.x > linex) { // Ball moving leftward hits right edge of a wall.
this.x = linex + this.radius + 1.0f;
} else { // Ball moving rightward hits left edge of a wall.
this.x = linex - this.radius - 1.0f;
}
this.dx *= -1.0f;
}
因此,当我现在运行时,球会在第一次碰到它时从墙上反弹,然后它击中的那条线(墙的边缘)会移到别处,但是因为墙不可见绘制为一个单位,因此构成它的线条不会影响绘图。 如果我注释掉“this.x = ...”和“this.y = ...”的行,那么这个问题就不会再发生了。此外,如果我取消注释测试RESET线以在上述功能中设置球的位置,那么线也不会移位。但是一旦我运行它,它就会再次发生。
我疯了,想知道为什么会这样。请给我一些建议。 谢谢!
答案 0 :(得分:0)
您是否打算使用按位&amp;? (参见代码中的**)您对“!hadCollision”的测试将失败,您也将屏蔽您的墙长。我相信你的意思是使用&amp;&amp;
for (i = 0; i < walls.length **&** !hadCollision; i++) {
lines = walls[i].getLines();
for (j = 0; j < lines.length **&** !hadCollision; j++) {
lineBounds = lines[j].getBounds();
if (lineBounds.intersect(point)) {
paint.setColor(Color.BLUE); // Colour ball blue.
reactToCollision3(lines[j]);
// TEST RESET!!!
//this.x = (float)(648+40);
//this.y = (float)(900-30);
hadCollision = true;
//printWallsLines();
}
}
}