我目前正在尝试学习JavaScript,并遵循了有关编写Breakout游戏的教程。我在本教程后添加了一些内容。我添加的一件事是随着比赛的进行,球变得更快。现在我有以下问题。
我的桨叶厚10像素,但在某些时候,球的移动速度比每帧/更新10像素快。因此,它经常直接穿过被弹起的桨。我已经将FPS / UPS从60倍增加到120倍,并将球速除以2。
当然,我可以进一步提高fps,但我希望有一个处理该问题的更有效/更优雅的版本。
这是我用来让球从球拍反弹的功能:
function ballPaddleHandling() {
var paddleTopEdgeY = canvas.height-PADDLE_DIST_FROM_EDGE;
var paddleBottomEdgeY = paddleTopEdgeY + PADDLE_THICKNESS;
var paddleLeftEdgeX = paddleX;
var paddleRightEdgeX = paddleLeftEdgeX + PADDLE_WIDTH;
if( ballY > paddleTopEdgeY && // below the top of paddle
ballY < paddleBottomEdgeY && // above bottom of paddle
ballX > paddleLeftEdgeX && // right of the left side of paddle
ballX < paddleRightEdgeX) { // left of the left side of paddle
ballSpeedY *= -1;
var centerOfPaddleX = paddleX+PADDLE_WIDTH/2;
var ballDistFromPaddleCenterX = ballX - centerOfPaddleX;
ballSpeedX = ballDistFromPaddleCenterX * 0.35;
if(bricksLeft == 0) {
gameWon = true;
//brickReset();
} // out of bricks
} // ball center inside paddle
} // end of ballPaddleHandling
如果您想查看我的所有代码,可以在这里进行:https://jpst.it/1cHKn
最佳答案
也许您的问题是:当您将球置于新的位置时,新的坐标从一个帧到另一个帧都位于球拍下,因此球永远不会穿过球拍,它只是在帧之间传送到球拍之后。
也许您需要:计算球的轨迹,当检测到球将在桨叶Y位置之后,从一帧到另一帧,检查桨叶是否在轨迹的中间并将球放在新球上位置位于桨叶的上限