当与矩形边缘碰撞时球会跳跃

时间:2016-11-29 22:27:29

标签: collision 2d-games

这是我的第一个更大的编程项目,所以我几乎是一个初学者,他遇到了一个问题,这个问题让我好几个星期了。也许有人可以帮忙。 :)

我正在构建一个简单的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描述了障碍物大小的一半。

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

1 个答案:

答案 0 :(得分:1)

如果没有必要的信息,我已经做了一些假设,并列出了更好的可理解性和调试能力的代码。仅这一点可以帮助您自己解决问题,但无论如何,如果要求其他人提供帮助,玩具应该如何呈现问题。为清晰起见,仅显示了一个条件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上发布问题。