这是我的第一个更大的编程项目,所以我几乎是一个初学者,他遇到了一个问题,这个问题让我好几个星期了。也许有人可以帮忙。 :)
我正在构建一个简单的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 :(得分: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上发布问题。