为什么我的电弧不是每帧都增长?
why does my arc doesn't grow every frame?
我正在尝试制作日出的动画,为此我需要一个不断变大的圆圈。目前我使用的是弧线,但我的太阳并不是每一帧都在生长,所以它只是保持静止。我试过调用另一个函数,但我不确定该怎么做,或者我已经制作的代码是否缺少某些东西。这是我到目前为止编写的代码。
<!doctype html>
<html>
<head>
<title>Animacion</title>
</head>
<body onload="call()">
<!--canvas-->
<canvas id="canvas" width="300" height="300" style="border: 1px solid black"></canvas>
<script>
function call() {
window.requestAnimationFrame(draw);
}
function draw() {
//context
var canvas = document.getElementById('canvas');
var ctx = canvas.getContext('2d');
ctx.globalCompositeOperation = 'destination-over';
ctx.clearRect(0, 0, 300, 300);
ctx.fillStyle = "green";
ctx.strokeStyle = "green";
ctx.save();
//ground
ctx.beginPath();
ctx.rect(0, 200, 300, 100);
ctx.fill();
ctx.stroke();
ctx.closePath();
ctx.save();
//sun size
var sunSize = 50;
//sun
ctx.beginPath();
ctx.strokeStyle = "yellow";
ctx.fillStyle = "yellow";
ctx.arc(145, 220, sunSize, sunSize, 0, Math.PI * 2, true);
ctx.fill();
ctx.stroke();
sunSize = sunSize + 5;
ctx.fill();
ctx.stroke();
ctx.closePath();
ctx.save();
//sky
ctx.save();
ctx.beginPath();
ctx.strokeStyle = "cyan";
ctx.fillStyle = "cyan";
ctx.rect(0, 0, 300, 300);
ctx.fill();
ctx.stroke();
ctx.closePath();
ctx.save();
window.requestAnimationFrame(draw);
}
call();
</script>
</body>
</html>
我试过在 draw()
中使用另一个功能,但它基本上什么都不做,并且抹去了我拥有的天空。
您在 draw()
函数中初始化了 sunSize
,因此每次运行时都会将 sunSize
重置为 50。将 sunSize
移到 <script>
部分下方的绘图函数之外;
<script>
var sunSize = 50;
function call(){
window.requestAnimationFrame(draw);
}
etc, etc
此外,使用 sunSize = sunSize + 5
而不是使用 sunSize += 5
。他们的意思是完全相同的东西,只是写得更快。 5虽然可能有点快。尝试使用 0.1 或 0.2
我正在尝试制作日出的动画,为此我需要一个不断变大的圆圈。目前我使用的是弧线,但我的太阳并不是每一帧都在生长,所以它只是保持静止。我试过调用另一个函数,但我不确定该怎么做,或者我已经制作的代码是否缺少某些东西。这是我到目前为止编写的代码。
<!doctype html>
<html>
<head>
<title>Animacion</title>
</head>
<body onload="call()">
<!--canvas-->
<canvas id="canvas" width="300" height="300" style="border: 1px solid black"></canvas>
<script>
function call() {
window.requestAnimationFrame(draw);
}
function draw() {
//context
var canvas = document.getElementById('canvas');
var ctx = canvas.getContext('2d');
ctx.globalCompositeOperation = 'destination-over';
ctx.clearRect(0, 0, 300, 300);
ctx.fillStyle = "green";
ctx.strokeStyle = "green";
ctx.save();
//ground
ctx.beginPath();
ctx.rect(0, 200, 300, 100);
ctx.fill();
ctx.stroke();
ctx.closePath();
ctx.save();
//sun size
var sunSize = 50;
//sun
ctx.beginPath();
ctx.strokeStyle = "yellow";
ctx.fillStyle = "yellow";
ctx.arc(145, 220, sunSize, sunSize, 0, Math.PI * 2, true);
ctx.fill();
ctx.stroke();
sunSize = sunSize + 5;
ctx.fill();
ctx.stroke();
ctx.closePath();
ctx.save();
//sky
ctx.save();
ctx.beginPath();
ctx.strokeStyle = "cyan";
ctx.fillStyle = "cyan";
ctx.rect(0, 0, 300, 300);
ctx.fill();
ctx.stroke();
ctx.closePath();
ctx.save();
window.requestAnimationFrame(draw);
}
call();
</script>
</body>
</html>
我试过在 draw()
中使用另一个功能,但它基本上什么都不做,并且抹去了我拥有的天空。
您在 draw()
函数中初始化了 sunSize
,因此每次运行时都会将 sunSize
重置为 50。将 sunSize
移到 <script>
部分下方的绘图函数之外;
<script>
var sunSize = 50;
function call(){
window.requestAnimationFrame(draw);
}
etc, etc
此外,使用 sunSize = sunSize + 5
而不是使用 sunSize += 5
。他们的意思是完全相同的东西,只是写得更快。 5虽然可能有点快。尝试使用 0.1 或 0.2