javascript - 带有 javascript 的 HTML 画布
问题描述
我有一个 index.hTML 文件,它只是呈现这样的画布
<body>
<canvas>
</canvas>
<script src="./JS/index.js" type="module"></script>
</body>
我有一个用于操作画布的 JavaScript 文件,如下所示
let canvas = document.querySelector('canvas')
canvas.width = window.innerWidth;
canvas.height = window.innerHeight;
const c = canvas.getContext('2d')
class Circle {
constructor(x, y, radius, color){
this.x = x
this.y = y
this.radius = radius
this.color = color
}
draw(){
c.beginPath()
c.arc(this.x, this.y, this.radius, Math.PI*2, false)
c.strokeStyle = this.color
c.stroke()
}
}
function manyCircles (numberOfCircles){
requestAnimationFrame(manyCircles)
c.clearRect(0,0,innerWidth, innerHeight)
for (let i = 0; i <numberOfCircles; i++) {
let x = Math.random()*innerWidth
let y = Math.random() * innerHeight
const circ1 = new Circle(x, y, 50, 'blue')
circ1.draw()
}
debugger
}
manyCircles(5)
这里的目标是每次函数运行时在画布上以随机坐标绘制 5 个圆圈并被清除并循环重复,但显然 for 循环永远运行并且只是用圆圈填充屏幕。但是,如果我有这样的
function manyCircles (){
requestAnimationFrame(manyCircles)
c.clearRect(0,0,innerWidth, innerHeight)
for (let i = 0; i <5; i++) {
let x = Math.random()*innerWidth
let y = Math.random() * innerHeight
const circ1 = new Circle(x, y, 50, 'blue')
circ1.draw()
}
debugger
}
manyCircles()
它似乎有效 有人可以告诉我为什么它适用于第二种情况而不是第一种情况吗?我在这里缺少什么原则
解决方案
如果需要在内部传递参数requestAnimationFrame
,则需要在函数内部进行。
默认情况下,传递给内部回调函数的参数raf
是时间戳。正如评论中所指出的,这是一个越来越庞大的数字。
let canvas = document.querySelector('canvas')
canvas.width = window.innerWidth;
canvas.height = window.innerHeight;
const c = canvas.getContext('2d')
class Circle {
constructor(x, y, radius, color) {
this.x = x
this.y = y
this.radius = radius
this.color = color
}
draw() {
c.beginPath()
c.arc(this.x, this.y, this.radius, Math.PI * 2, false)
c.strokeStyle = this.color
c.stroke()
}
}
function manyCircles(numberOfCircles) {
requestAnimationFrame(function() {
manyCircles(numberOfCircles)
})
c.clearRect(0, 0, innerWidth, innerHeight)
for (let i = 0; i < numberOfCircles; i++) {
let x = Math.random() * innerWidth
let y = Math.random() * innerHeight
const circ1 = new Circle(x, y, 50, 'blue')
circ1.draw()
}
debugger
}
manyCircles(5)
<canvas></canvas>
推荐阅读
- python-2.7 - Python。GZIP 解压错误:解压数据时出现错误 -3:标头检查不正确
- python - 当某些字典重复时,在python中合并两个字典列表
- javascript - 画布游戏空格键滚动浏览器
- c# - C#、Winforms 设置
- node.js - Express-Cassandra 在单个列的同一查询中从 SET 数据类型进行多值搜索
- python - Python类变量更改未保存
- typescript - 是否可以在 TypeScript 中输入检查字符串别名?
- python - LEADER_NOT_AVAILABLE - 码头集装箱
- python - 芹菜函数未调用
- hiveql - 如何在 Hive 中进行逐行计数