【发布时间】:2018-03-23 19:41:43
【问题描述】:
我目前正在尝试学习 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
【问题讨论】:
-
通常我们做的是计算物体(桨)是否在主物体(球)的路径中而不是物体是否与主物体重叠对象。这将问题简化为两条线是否重叠。在您的情况下,您必须考虑桨叶上的 4 条线。
-
ballY += ballSpeedY;那部分可以让球通过桨。在更换ballY之前,您应该检查是否会发生碰撞。 -
@James 如果球每次移动超过一个桨高度,它可能永远不会“碰撞”(在修改 Y 之前高于桨,之后低于它)
-
@IrkenInvader 对,这就是我的观点。但是在实际移动球之前,很容易检查球是否会穿过球拍。
-
我认为他们的意思是为球的开始/停止位置和每个桨角开始/停止构建线。 (开始 = 帧前的位置,停止 = 绘制帧后的结束位置)超级有用的糟糕绘图:i.imgur.com/yCzPrww.png
标签: javascript performance collision-detection frame-rate game-loop