Android开发 - 无缘无故移动的对象

时间:2014-04-03 02:15:11

标签: java android collision-detection game-physics

我正试图在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线以在上述功能中设置球的位置,那么线也不会移位。但是一旦我运行它,它就会再次发生。

我疯了,想知道为什么会这样。请给我一些建议。 谢谢!

1 个答案:

答案 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();
        }
    }
}