2012-08-05 126 views
0

我在我的游戏(BrickBraker)中有以下代码来检查底部的酒吧的球的collsion。但它仍然说,即使球没有撞到酒吧也会发生碰撞。SurfaceView与碰撞

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

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

以下是我将尝试检查球和电路板之间的碰撞检测:

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

  1. 第一个是,球的左侧不与董事会对齐,但右侧。
  2. 第二个是,球的左侧确实与棋盘对齐,但右侧没有。
  3. 第三个是,球的左侧和右侧与董事会对齐。

这里有一个图像,使其视觉:

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速度,并将 数字改为正数或负数,例如。如果速度是负值,那么 使其为正,反之亦然。

我希望这有助于!

+0

Ty为您的答案。但是如果击球板的左侧,我想让球移向左侧。这就是为什么我这样做。你有一个聪明的解决方案吗? – Stupe 2012-08-05 22:52:32