2017-04-07 94 views
1

我正在學習一個教程,並試圖修改一些代碼。正如現在的代碼所示,一切工作都是爲了讓一個球在一個正方形周圍反彈,然後在底部划槳,我想要做的就是在球從槳上反彈時使球變大。球從15號開始,我可以將它增加1到4,但是在5號和更遠處,有一個錯誤導致球停留在位置並增長到屏幕的一半,然後停留在那裏。我認爲,隨着它的增長,它會回到槳的撞擊箱,然後激活另一個增長並重復。但是,我完全不確定。任何人都可以點亮一下嗎?我會對代碼中的負責變量進行大寫評論。非常感謝您的幫助!一個變量打破了我的簡單程序,爲什麼?

var canvas = document.getElementById("myCanvas"); 
 
var ctx = canvas.getContext("2d"); 
 

 
var x = canvas.width/2; //starting coordinates 
 
var y = canvas.height - 30; 
 

 
var dx = 2; //rate of movement for ball 
 
var dy = -2; 
 

 
var ballRadius = 15; 
 

 
var paddleHeight = 10; 
 
var paddleWidth = 75; 
 
var paddleX = (canvas.width - paddleWidth)/2; 
 

 
var rightPressed = false; 
 
var leftPressed = false; 
 

 
function drawBall() { 
 
    ctx.beginPath(); 
 
    ctx.arc(x, y, ballRadius, 0, Math.PI * 2); 
 
    ctx.fillStyle = "#ff0000"; 
 
    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.width, canvas.height); 
 
    drawBall(); 
 
    drawPaddle(); 
 
    x += dx; 
 
    y += dy; 
 

 
    if (x + dx > canvas.width - ballRadius || x + dx < ballRadius) { //these ifs cause the ball to bounce off walls 
 
    dx = -dx; 
 
    } 
 

 
    if (y + dy < ballRadius) { 
 
    dy = -dy; 
 
    } else if (y + dy > canvas.height - ballRadius) { 
 
    if (x > paddleX && x < paddleX + paddleWidth) { //detects paddlebox detection 
 
     dy = -dy; 
 
     ballRadius += 7; //TROUBLESOME VARIABLE! Work with 1-4 but breaks beyond that. 
 

 
    } else { 
 
     alert("GAME OVER"); 
 
     document.location.reload(); 
 
    } 
 
    } 
 
    if (rightPressed && paddleX < canvas.width - paddleWidth) { 
 
    paddleX += 7; 
 
    } else if (leftPressed && paddleX > 0) { 
 
    paddleX -= 7; 
 
    } 
 
} 
 
document.addEventListener("keydown", keyDownHandler, false); 
 
document.addEventListener("keyup", keyUpHandler, false); 
 

 
function keyDownHandler(e) { 
 
    if (e.keyCode == 39) { 
 
    rightPressed = true; 
 
    } else if (e.keyCode == 37) { 
 
    leftPressed = true; 
 
    } 
 
} 
 

 
function keyUpHandler(e) { 
 
    if (e.keyCode == 39) { 
 
    rightPressed = false; 
 
    } else if (e.keyCode == 37) { 
 
    leftPressed = false; 
 
    } 
 
} 
 

 
setInterval(draw, 10);
* { 
 
    padding: 0; 
 
    margin: 0; 
 
} 
 

 
canvas { 
 
    background: #eee; 
 
    display: block; 
 
    margin: 0 auto; 
 
}
<canvas id="myCanvas" width="480" height="320"></canvas>

+0

你熟悉的段落,以及爲什麼人們使用他們的概念? –

+0

在你長出球之後,'draw()'函數在10毫秒後再次運行,並且它仍然擊中槳。所以它再次增長,並且這一直在不斷重複。 – Barmar

回答

2

的問題是,你的繪製函數excecutes每10ms。所以當你的球擊中槳時,它實際上會觸發球增長多次。我的解決方案是當你增加球的尺寸時,如何超時/延遲,以便在下一次繪圖函數觸發之前有時間移開。繼承人的代碼。

注:打開全屏的片段來查看遊戲更好

var canvas = document.getElementById("myCanvas"); 
 
var ctx = canvas.getContext("2d"); 
 

 
var x = canvas.width/2; //starting coordinates 
 
var y = canvas.height - 30; 
 

 
var dx = 2; //rate of movement for ball 
 
var dy = -2; 
 

 
var ballRadius = 15; 
 

 
var paddleHeight = 10; 
 
var paddleWidth = 75; 
 
var paddleX = (canvas.width - paddleWidth)/2; 
 

 
var rightPressed = false; 
 
var leftPressed = false; 
 

 
function drawBall() { 
 
    ctx.beginPath(); 
 
    ctx.arc(x, y, ballRadius, 0, Math.PI * 2); 
 
    ctx.fillStyle = "#ff0000"; 
 
    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.width, canvas.height); 
 
    drawBall(); 
 
    drawPaddle(); 
 
    x += dx; 
 
    y += dy; 
 

 
    if (x + dx > canvas.width - ballRadius || x + dx < ballRadius) { //these ifs cause the ball to bounce off walls 
 
    dx = -dx; 
 
    } 
 

 
    if (y + dy < ballRadius) { 
 
    dy = -dy; 
 
    } else if (y + dy > canvas.height - ballRadius) { 
 
    if (x > paddleX && x < paddleX + paddleWidth) { //detects paddlebox detection 
 
     dy = -dy; 
 
     setTimeout(function(){ ballRadius += 7; }, 100); 
 
     
 

 
    } else { 
 
     alert("GAME OVER"); 
 
     document.location.reload(); 
 
    } 
 
    } 
 
    if (rightPressed && paddleX < canvas.width - paddleWidth) { 
 
    paddleX += 7; 
 
    } else if (leftPressed && paddleX > 0) { 
 
    paddleX -= 7; 
 
    } 
 
} 
 
document.addEventListener("keydown", keyDownHandler, false); 
 
document.addEventListener("keyup", keyUpHandler, false); 
 

 
function keyDownHandler(e) { 
 
    if (e.keyCode == 39) { 
 
    rightPressed = true; 
 
    } else if (e.keyCode == 37) { 
 
    leftPressed = true; 
 
    } 
 
} 
 

 
function keyUpHandler(e) { 
 
    if (e.keyCode == 39) { 
 
    rightPressed = false; 
 
    } else if (e.keyCode == 37) { 
 
    leftPressed = false; 
 
    } 
 
} 
 

 
setInterval(draw, 10);
* { 
 
    padding: 0; 
 
    margin: 0; 
 
} 
 

 
canvas { 
 
    background: #eee; 
 
    display: block; 
 
    margin: 0 auto; 
 
}
<canvas id="myCanvas" width="480" height="320"></canvas>

相關問題