SurfaceView与碰撞

时间:2012-08-05 18:42:37

标签: android surfaceview

我的游戏(BrickBraker)中有以下代码,用底部的栏检查球的collsion。但它仍然表示,即使球未击中杆也会发生碰撞。

我在下面使用的代码有什么问题?

if(ball.x + ball.getWidth() > bar.x && ball.x < bar.x + (bar.getWidth()/5)) {
    ...
}

else if(ball.x + ball.getWidth() > bar.x + (bar.getWidth()/5) && ball.x < bar.x + (2*bar.getWidth()/5)) {
    ...
}

else if(ball.x + ball.getWidth() > bar.x + (2*bar.getWidth()/5) && ball.x < bar.x + (3*bar.getWidth()/5)) {
    ...
}

else if(ball.x + ball.getWidth() > bar.x + (3*bar.getWidth()/5) && ball.x < bar.x + (4*bar.getWidth()/5)) {
    ...
}

else if(ball.x + ball.getWidth() > bar.x + (4*bar.getWidth()/5) && ball.x < bar.x + bar.getWidth()) {
    ...
}

1 个答案:

答案 0 :(得分:1)

以下是我将如何检查球与棋盘之间的碰撞检测:

首先,我们将检查球是否与x轴上的板“碰撞”。我们必须检查三种状态:

  1. 第一个是,球的左侧与棋盘不对齐,而右侧则与棋盘对齐。
  2. 第二个是,球的左侧与棋盘对齐,但右侧没有。
  3. 第三个是,球的左右两侧与棋盘对齐。
  4. 这是一个让它变得可视化的图像:

    Example

    这是我们以编程方式应用这些规则的方式:

    // First case
    if(ball.getX() + ball.getWidth() > board.getX() && ball.getX() < board.getX()) {
    
    }
    // Second case
    if(ball.getX() < board.getX() + board.getWidth() && ball.getX() + ball.getWidth > board.getX()) {
    
    }
    // Third case
    if((ball.getX() + ball.getWidth() > board.getX() && ball.getX() < board.getX()) && (ball.getX() < board.getX() + board.getWidth() && ball.getX() + ball.getWidth > board.getX())) {
    
    }
    

    如果满足任何这些条件,则表示球在x轴上与电路板对齐。所以现在我们必须检查它们是否在y轴上对齐,这样我们才能最终知道它们是否相互接触。

    如果符合条件,我们可以创建一个可以从任何if语句调用的方法。

    public boolean checkYAlignment() {
    // Check y alignment
    if(ball.getY == board.getY || ball.getY() < board.getY()) {
    // The ball and board have collided!
    return true;
    }
    else {
    return false;
    }
    }
    

    所以现在上面写的所有代码都以一个方法的形式放在一起,这个方法将返回一个布尔值,表明球和棋盘是否发生了碰撞:

    public boolean checkCollision() {
    // First case
        if(ball.getX() + ball.getWidth() > board.getX() && ball.getX() < board.getX()) {
        return checkYAlignment();
        }
        // Second case
        else if(ball.getX() < board.getX() + board.getWidth() && ball.getX() + ball.getWidth > board.getX()) {
        return checkYAlignment();
        }
        // Third case
        else if((ball.getX() + ball.getWidth() > board.getX() && ball.getX() < board.getX()) && (ball.getX() < board.getX() + board.getWidth() && ball.getX() + ball.getWidth > board.getX())) {
    return checkYAlignment();
        }
    else {
    return false;
    }
    }
    

    我希望这有帮助并有效!

    PS:我写的很晚,请原谅我,如果我出错了,我会尽快纠正。

    <强>更新

    如果你想让球在与球板碰撞时以一定角度跳跃,你可以采取球与棋盘碰撞的角度,并让球以另一个方向以该角度反弹。 有两种方法可以做到这一点:

    • 使用一些三角法来找到角度。
    • 你也可以简单地取球的x速度并改变 数字为正数或负数,例如。如果速度是负的,那么 使其成为积极的,反之亦然。

    我希望这有帮助!