我正在尝试实现类似于您在卡通杂烩上看到的效果(示例链接),其中形状用作掩蔽层,用于保持静态的下方纹理。我已经开始尝试这个想法,通过创建一个渲染循环来清除画布,保存它的状态,然后绘制一个矩形剪辑区域,然后绘制占据整个画布宽度和高度的背景纹理。
这是绘图功能:
function draw()
{
context.clearRect(0,0, 640, 480);
context.save();
x += velocityX;
y += velocityY;
context.rect(x, y, 40, 40);
context.clip();
context.drawImage(image, 0,0, 640, 480);
context.restore();
}
基本上它只是以每秒 60 帧的速度运行,更新矩形的位置并在剪切区域内剪切背景图像。(我知道代码的结构并不完美,但我只是在尝试看看这种效果是否可能在画布上实现)。
我似乎遇到的问题是循环的前一次迭代中的剪辑区域悬而未决,从而产生了您在上面的小提琴中看到的奇怪效果。我已经尝试draw()
在循环步骤中重新排序所有内容,但似乎唯一有效的是canvas.width = canvas.width
清除屏幕的技巧。我想避免这种清除屏幕的方法,因为它似乎在 IE 中不起作用,而且它还会破坏 canvas state
。clearRect()
应该可以清除屏幕。我究竟做错了什么?