我目前正在尝试学习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位置之后,从一帧到另一帧,检查桨叶是否在轨迹的中间并将球放在新球上位置位于桨叶的上限

08-19 08:59