绘制带有设置超时的画布上的图像
drawImage on a canvas with setTimeout
我用几块画在画布上用画图构建了一个图像。
我现在想尝试以 1 个 1 的方式加载它们,或者尝试对它们进行动画处理,或者在它们最初加载后修改用于构成完整图像的片段的大小。
我无法让他们使用setTimeout
函数,这甚至是一个合适的方法吗? 还是有更好的方法?
这是我用几张图像构建的原始工作画布:https://codepen.io/anon/pen/MyaMOK
这是我尝试将它们以 1 个 1 和setTimeout
加载:
setTimeout(function(){
ctx.drawImage(img, piece.sx, piece.sy, piece.sWidth, piece.sHeight, piece.x, piece.y, piece.w, piece.h);
},100*tileCount);
https://codepen.io/anon/pen/RaWzgJ
它似乎只在右下角加载 1 个"块",而没有其他"块",尽管这种方法似乎在setTimeout
之外工作正常。
任何人都可以提出可行的解决方案吗?
通了。
将setTimeout
函数移到 for 循环之外,并从内部将变量传递给它,更新的工作代码笔在这里:
https://codepen.io/anon/pen/RaWzgJ
我采用了您的代码并通过在setTimeout
函数之前和setTimeout
函数的callback
内添加console.log
来修改它。
结果是循环按预期工作。每次迭代都会更新piece
对象。
但是,只有在整个循环耗尽后才调用setTimeout
函数,令我惊讶的是,piece
对象采用了相同的值。
据我说,它之所以表现得像这样,是这样的:
-
setTimeout
函数仅注册callback
函数(稍后执行),但不阻塞循环(它是异步的)。 -
因此,循环继续,而不会在
setTimeout
内执行任何回调,并且piece
会从外部更新。 -
当循环耗尽时,
callback
函数开始执行。但是,所有回调都引用同一个piece
对象(由于hoisting
并且因为javascipt不是块范围的),因此它们都获得相同的值。 -
结论:所有图像片段都得到了正确的输出,但它们被输出在同一个地方,一个在另一个之上。
为什么将setTimeout
放入另一个函数中有效:
将setTimeout
放入另一个函数中是有效的,因为调用新函数会创建一个具有自己的piece
对象的新作用域,即它不再从同一全局piece
对象共享。
- 如何使用url加载程序在webpack中导入多个图像
- nodejs-expressjs上传图像并显示它们
- 使用JSP从服务器检索和显示图像
- 角度:在ng重复上切换图像
- 画廊图像未显示
- Phonegap-(安卓/iphone)多个图像的图像库出现问题
- Javascript排序的图像弹出窗口..可以't单独弹出
- 绘制带有设置超时的画布上的图像
- 更改图像超时循环 Javascript
- Javascript 图像超时
- 超时后,图像不会重新出现在其正确位置
- 将图像替换为另一个图像,然后在超时后再次替换 - Javascript
- 图像滑块的角度 js 超时
- 图像设置超时的替代方法
- 向右滑动一个图像,同时打开一个超时的新窗口url
- 如何在设置超时期间删除图像
- 超时后如何更改下一个图像
- 我如何测试如果一个URL是一个有效的图像与超时的图像请求与javascript
- 更改图像转换超时
- 在Div背景中加载图像时设置超时时间