2016-11-29 86 views
1

这是我第一个更大的编程项目,所以我几乎是一个初学者,他遇到了一个问题,这个问题让我现在几周感到困惑。也许有人可以帮忙。 :)当与一个矩形的边缘碰撞时,球会跳跃

我正在构建一个简单的2D游戏。您可以通过俯仰和偏航智能手机来控制球。每当球碰到矩形障碍物的确切边缘时,它首先陷入它,然后随机跳出。当障碍物建立一条直线时,它不会发生。

经过一段时间的调试,我很确定这个错误必须存在于游戏物理部分的某个地方。这里是代码:

 float var = gameView.screenSize()/2; 
    // If the player touches the barrier, its speed will invert 
    for(RectF r : barrier) { 
     if(playerSpeedX > 0 && playerX > r.left - var && playerX < r.right + var && playerY >= r.top && playerY <= r.bottom) { playerX = r.left - var; playerSpeedX = -playerSpeedX;} // left 
     if(playerSpeedX < 0 && playerX > r.left - var && playerX < r.right + var && playerY >= r.top && playerY <= r.bottom) { playerX = r.right + var; playerSpeedX = -playerSpeedX;} // right 
     if(playerSpeedY > 0 && playerY > r.top - var && playerY < r.bottom + var && playerX >= r.left && playerX <= r.right) { playerY = r.top - var; playerSpeedY = -playerSpeedY;} // top 
     if(playerSpeedY < 0 && playerY > r.top - var && playerY < r.bottom + var && playerX >= r.left && playerX <= r.right) { playerY = r.bottom + var; playerSpeedY = -playerSpeed;} //bottom 
    } 

var描述了障碍物的一半大小。

也许有人可以帮助我。提前致谢。 :)

+0

如果障碍物是*矩形* *单个*值“*障碍物大小的一半*”是什么意思?一个维度只适用于* square *(一个相当特殊的矩形)。 – Clifford

+0

你确定你不是指“*球大小的一半*”,这似乎更可能给出代码。 – Clifford

+0

应该没关系,游戏区被划分为16:9的网格,所以球和障碍物的网格大小相同。是的,障碍都是正方形,对不起。 –

回答

0

如果有必要的信息,我已经做了一些假设,并提出了更好的理解和调试能力的代码。这可以帮助你自己解决问题,但无论如何,如果要求他人协助,玩具应该如何提出这个问题。只是为了清楚起见一个条件if块,其他人可能会遵循相同的模式:

// If the player touches the barrier, its speed will invert 
    for(RectF r : barrier) 
    { 
     if(playerSpeedX > 0 &&     // If moving right and ... 
      playerX > r.left - var &&   // ... ball edge past left of r and 
      playerX < r.right + var &&   // ... ball edge not past right of r and 
      playerY >= r.top &&     // ... ball centre below top of r and 
      playerY <= r.bottom)     // ... ball centre above top of r 
     { 
      playerX = r.left - var;   // Move ball to the left 
      playerSpeedX = -playerSpeedX; // Change motion direction 
     } 

     ... 
    } 

我不能肯定这些假设是正确的,但建议或许第二和第三布尔子表达式在有条件的威力从>更改为>=,那么\\Move ball to the left声明就不必要了。

除了清晰和明确地评论每个子表达式的目的的能力之外,以这种方式布置代码的优点是当在面向行的源代码级调试器中执行代码时,可以验证行为每个子表达式和语句都是独立的,而不是让所有事情都立即发生,并且不知道为什么(或者至少不那么明显)。在任何情况下,使用debugger都是更有效的方法来解决发布问题,例如在SO上发布问题。