Java Android开发-对象无理由移动

Java Android开发-对象无理由移动,java,android,collision-detection,game-physics,Java,Android,Collision Detection,Game Physics,我正在尝试在Eclipse的SDK中为Android的一个学校项目制作一个弹球式游戏 有一个非常奇怪和非常令人沮丧的问题,对象在没有任何代码的情况下移动。基本上,每个墙实例包含4个线对象,用于与球的碰撞检测。这些线第一次起作用,但一旦球与它们碰撞一次,该线就会以某种方式移动到屏幕上的另一个位置。 我一直在调试它,不会问我是否已经试过了所有的东西,但老实说,没有理由让线路移动到任何地方。我处理碰撞的方法是将球推离墙壁1px,然后给定新的dx和dy(速度)移动。下面是检查碰撞的代码,后面是处理碰撞以

我正在尝试在Eclipse的SDK中为Android的一个学校项目制作一个弹球式游戏

有一个非常奇怪和非常令人沮丧的问题,对象在没有任何代码的情况下移动。基本上,每个墙实例包含4个线对象,用于与球的碰撞检测。这些线第一次起作用,但一旦球与它们碰撞一次,该线就会以某种方式移动到屏幕上的另一个位置。 我一直在调试它,不会问我是否已经试过了所有的东西,但老实说,没有理由让线路移动到任何地方。我处理碰撞的方法是将球推离墙壁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();
        }
    }
}
因此,当我现在运行此程序时,球在第一次撞击墙时会从墙上反弹,然后撞击的线(墙的边缘)会移动到其他位置,但不可见,因为墙是作为一个单元绘制的,所以组成它的线不会影响绘图。 如果我注释掉“this.x=…”和“this.y=…”的行,那么这个问题就不会再发生了。此外,如果我在上述函数中取消注释设置球位置的测试重置行,那么该行也不会移动。但一旦我运行这个,它就会再次发生

我要发疯了,想知道为什么会发生这种事。请给我一些建议。
谢谢大家!

是否打算使用按位&?(请参见代码中的**)您的“!hadCollision”测试将失败,并且您还将掩盖墙的长度。我相信你是想用&&

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();
        }
    }
}
for(i=0;i
克里斯,你抓得好!我肯定是指那里。然而,这仍然没有解决问题。还有其他建议吗?谢谢有什么行为改变吗?还可以检查Y是否>LineY。如果是,则设置Y=liney+this.radius+1.0f。。。。当然这应该是直线-这个半径。。。因为Y>LineY意味着你在上面,所以你不想再把它放在上面。令人惊讶的是,&&'修复没有改变行为。至于lineY部分,Android的左上角是(0,0),因此通过将其设置为lineY+this.radius+1.0f,我将球放在线下1px处。它在第一次碰撞时也能起作用,但后来这条线不知怎么神秘地移动了。我现在解决了这个问题。。问题是RectF方法intersect()实际上会更改调用它的RectF,因此,当找到交集时,会设置线边界。谢谢你的时间,克里斯!
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();
        }
    }
}