我创建了一个基于Mozilla开发者的突破游戏的游戏,但在某个时刻,当球与桨碰撞,它在里面zig zags出来。我该如何解决这个问题?下面是我的JavaScript代码:
const canvas = document.getElementById("myCanvas");
const ctx = canvas.getContext("2d");
const ballRadius = 10;
const paddleHeight = 10;
const paddleWidth = 75;
let paddleX = (canvas.width - paddleWidth) / 2;
let rightPressed = false;
let leftPressed = false;
let x = canvas.width / 2;
let y = canvas.height - 30;
let dx = 2;
let dy = -2;
let paddleY = canvas.height - paddleHeight;
function drawBall() {
ctx.beginPath();
ctx.arc(x, y, ballRadius, 0, Math.PI * 2);
ctx.fillStyle = "#0095DD";
ctx.fill();
ctx.closePath();
}
function drawPaddle() {
ctx.beginPath();
ctx.rect(paddleX, canvas.height - paddleHeight, paddleWidth, paddleHeight);
ctx.fillStyle = "#0095DD";
ctx.fill();
ctx.closePath();
}
function draw() {
ctx.clearRect(0, 0, canvas.clientWidth, canvas.clientHeight);
drawBall();
drawPaddle();
// Colisão da bola no eixo X
if (x + dx < 0 + ballRadius || x + dx > canvas.width - ballRadius) {
dx = -dx
}
// Colisão eixo Y
if (y + dy < 0 + ballRadius) {
dy = -dy
}
if (x + dx > canvas.width - ballRadius || x + dx < ballRadius) {
dx = -dx
}
if (y + dy < ballRadius) {
dy = -dy
} else if (y + dy > canvas.height - (ballRadius * 2)) {
if (x > paddleX && x < paddleX + paddleWidth) {
dy = -dy
} else if (y + ballRadius > canvas.height) {
alert("a")
document.location.reload();
clearInterval(interval)
}
}
if (rightPressed) {
paddleX += 7;
if (paddleX + paddleWidth > canvas.width) {
paddleX = canvas.width - paddleWidth
}
} else if (leftPressed) {
paddleX -= 7
if (paddleX < 0) {
paddleX = 0
}
}
x += dx;
y += dy;
}
// Eventos de controle via teclado
document.addEventListener("keydown", keyDownHandler, false);
document.addEventListener("keyup", keyUpHandler, false);
function keyDownHandler(e) {
if (e.key === "Right" || e.key === "ArrowRight") {
rightPressed = true;
} else if (e.key === "Left" || e.key === "ArrowLeft") {
leftPressed = true;
}
}
function keyUpHandler(e) {
if (e.key === "Right" || e.key === "ArrowRight") {
rightPressed = false;
} else if (e.key === "Left" || e.key === "ArrowLeft") {
leftPressed = false;
}
}
const interval = setInterval(draw, 10);
字符串
这是一个问题的gif:
的数据
我尝试了不同的解决方案,但没有解决我的错误。
1条答案
按热度按时间bhmjp9jg1#
当球首先在侧面击中用户的球拍时发生这种情况,使得当球首先击中球拍时,球已经远低于球拍的顶部。当垂直方向翻转时,下一次迭代不足以使球 * 高于 * 球拍-它仍然低于其顶部。问题出现了:垂直方向再次翻转!
我调整了画布的大小,使其在第一次反弹时立即发生(假设用户不移动球拍):
个字符
解决办法很简单:不要 * 翻转 * 垂直方向
dy
,而是强制它为负,像这样:型
如果它已经是负的,那么它不会再被翻转。
下面是与上面相同的代码,但应用了修复: