gpt4 book ai didi

javascript - 使用 requestAnimationFrame 设置运动的 Canvas 对象

转载 作者:行者123 更新时间:2023-12-03 02:14:42 24 4
gpt4 key购买 nike

我正在使用 requestAnimationFrame 开始我的运动学习。我想在 Canvas 上放置一个圆圈,然后单击按钮使该圆圈运动。我无意中用下面的代码实现了它。但我不明白。我期望通过这段代码看到的是在 Canvas 上绘制一个圆圈,然后按下按钮时在该圆圈的顶部绘制另一个圆圈。第一个圆圈将保持在屏幕上的静止位置,而另一个圆圈则开始运动。再一次,我意外地实现了我想要的目标,但我不想以此为基础,因为它看起来太错误了。我需要做什么来更正我的代码,以便圆圈出现在屏幕上,然后通过单击按钮启动?

<script>
var canvas = document.querySelector('canvas');
var c = canvas.getContext('2d');

// Creates a ball in location (but why does it disappear?)
c.beginPath();
c.lineWidth = 5;
c.arc(145, 100, 75, 0, Math.PI * 2, true);
c.stroke();

var y = 100;

function ballDrop(){
requestAnimationFrame(ballDrop);
c.clearRect(0, 0, 300, 800);
// Create Ball
c.beginPath();
c.lineWidth = 5;
c.arc(145, y, 75, 0, Math.PI * 2, true);
c.stroke();
y += 1;
}
</script>

最佳答案

您的代码按预期执行,因为:1. 在 Canvas 上绘制一个初始圆圈2. 单击执行 ballDrop 的按钮3. 在 ballDrop 中,您可以清除上下文绘制区域,从而删除所有先前的绘制。这就是为什么你原来的圈子消失了。

一些注意事项:* 您无需继续设置 lineWidth,除非您计划针对该 上下文 更改它* 您应该将 requestAnimationFrame 移至函数末尾。这主要是为了清楚起见,因为 requestAnimationFrame 是异步的(如 setTimeout),因此功能不会真正受到影响。

示例 https://jsfiddle.net/m503wa4g/6/

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<canvas width="300" height="300"></canvas>
<button onclick="ballDrop()">Drop</button>

<script>
var canvas = document.querySelector('canvas');
var c = canvas.getContext('2d');

// Creates a ball in location (but why does it disappear?)
c.beginPath();
c.lineWidth = 5;
c.arc(145, 100, 75, 0, Math.PI * 2, true);
c.stroke();

var y = 100;

function ballDrop() {
c.clearRect(0, 0, 300, 800);
// Create Ball
c.beginPath();
c.arc(145, y, 75, 0, Math.PI * 2, true);
c.stroke();
y += 1;

requestAnimationFrame(ballDrop);
}

</script>
</body>
</html>

关于javascript - 使用 requestAnimationFrame 设置运动的 Canvas 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49414451/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com