所以我尝试创造一个乒乓球游戏,乒乓球的桨子是狡猾的.. 我正在使用球和球拍的两个功能,我也使用帆布 有一个用于movment的paddles对象和事件监听器 请帮助:)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Pong</title>
<script type="text/javascript">
function canvas() {
var can = document.getElementById('theCanvas');
can.style.backgroundColor = "black";
var ctx = can.getContext('2d');
var keys = [];
var ball = {
x: (can.width-10)/2,
y: (can.width-10)/2,
dx: 8,
dy: 8
}
var playerOne = {
x: can.width-50,
y: (can.width-50)/2,
H: 100,
W: 20,
hitDir: 0
}
var playerTwo = {
x: 50,
y: (can.width-50)/2,
H: 100,
W: 20,
hitDir: 0
}
ctx.fillStyle ="white";
ctx.fillRect(playerOne.x,playerOne.y,playerOne.W,playerOne.H);
ctx.fillRect(playerTwo.x,playerTwo.y,playerTwo.W,playerTwo.H);
function draw()
{
ctx.clearRect(0,0, 800,800);
ctx.beginPath();
ctx.fillStyle="#0000ff";
ctx.arc(ball.x,ball.y,10,0,Math.PI*2,true);
ctx.closePath();
ctx.fill();
if( ball.x<10 || ball.x>790)
{
ball.dx=-ball.dx
}
if( ball.y<10 || ball.y>790) {
ball.dy=-ball.dy
}
ball.x+=ball.dx;
ball.y+=ball.dy;
ctx.fillStyle ="white";
ctx.fillRect(playerOne.x,playerOne.y,playerOne.W,playerOne.H);
ctx.fillRect(playerTwo.x,playerTwo.y,playerTwo.W,playerTwo.H);
}
setInterval(draw,10);
function move() {
ctx.clearRect(0,0,800,800);
if (keys[38]) {
playerTwo.y-=10;
}
if (keys[40]) {
playerTwo.y+=10;
}
ctx.fillStyle ="white";
ctx.fillRect(playerOne.x,playerOne.y,playerOne.W,playerOne.H);
ctx.fillRect(playerTwo.x,playerTwo.y,playerTwo.W,playerTwo.H);
ctx.clearRect(0,0, 800,800);
ctx.beginPath();
ctx.fillStyle="#0000ff";
ctx.arc(ball.x,ball.y,10,0,Math.PI*2,true);
ctx.closePath();
ctx.fill();
setTimeout(move, 1000/60);
}
move();
document.body.addEventListener("keydown", function (e) {
keys[e.keyCode] = true;
});
document.body.addEventListener("keyup", function (e) {
keys[e.keyCode] = false;
});
}
</script>
</head>
<body onload="canvas()">
<canvas id="theCanvas" width="800" height="800"></canvas>
</body>
</html>
&#13;
答案 0 :(得分:0)
感谢有趣的问题。
您要做的是将两个setInterval / setTimeout组合成一个渲染函数。然后由单个window.requestAnimationFrame函数使用,该函数在浏览器准备好绘制下一帧时调用。这优于setTimeout或setInterval,这可能是“滴答”的原因,因为当浏览器尚未准备好渲染该帧时,您的画布可能会尝试绘制帧。
我还将你的游戏重构为以下伪代码
Rectange