HTML Canvas 剪辑区域 - 上下文还原?

Jem*_*Jem 2 html canvas image clipping clip

我试图在我的画布上设置一个“脏区”以防止重新绘制未移动的项目(背景图像、静态项目等),即只需要重新绘制移动玩家背后的背景

编辑:正如建议的那样,这是它的 jsfiddle http://jsfiddle.net/7kbzj/3/

“更新”方法在那里不起作用,所以它是 moveSprite(),您可以通过单击“移动精灵”链接来运行...基本上,每次单击时,剪切区域都应向右移动 10 像素。剪贴蒙版停留在初始位置,只发生重绘。奇怪的o_O

所以当我初始化我的画布时,一旦背景被绘制,设置我使用 ctx.save() 方法:

function init() {
    canvas = document.getElementById('kCanvas');
    ctx = canvas.getContext('2d');  

    ctx.fillStyle = "rgb(0,128,0)";
    ctx.fillRect (0,0,320,240);

    ctx.save();

    setInterval(function () { update(); }, tpf);
}
Run Code Online (Sandbox Code Playgroud)

为了看到剪裁的效果,我在我想剪裁的区域画了一个不同颜色的背景(蓝色的)......结果很糟糕,只有第一个剪裁的区域被涂成蓝色:(

function update() {
    setDirtyArea(x,y,w+1,h)

    ctx.fillStyle = "rgb(0,0,128)";
    ctx.fillRect (0,0,320,240);

    x++;

    // paint image
    ctx.clearRect(x,y,w,h);
    ctx.drawImage(imageObj, x, y);
Run Code Online (Sandbox Code Playgroud)

}

function setDirtyArea(x,y,w,h) {
   ctx.restore();   
   // define new dirty zone
   ctx.beginPath();
   ctx.rect(x, y, w, h);
   ctx.clip();
}
Run Code Online (Sandbox Code Playgroud)

我很想看到蓝色区域向屏幕右侧传播……请帮忙,我不明白出了什么问题!谢谢,J。

jar*_*lli 5

您需要使用 save 和 restore 方法包装框的实际绘制和剪辑。并包含 closePath 方法。我已经修改了您的小提琴,使其按照我认为您正在尝试的方式工作。

http://jsfiddle.net/jaredwilli/7kbzj/7/

ctx.save(); // save the context
    // define new dirty zone
    ctx.beginPath();
        ctx.rect(x, y, w, h);
        ctx.clip();

ctx.restore(); // restore the context
Run Code Online (Sandbox Code Playgroud)

我还了解到,使用 save 和 restore 可能会变得非常复杂,并且无法了解您所处的上下文。它提出了一个非常庞大的画布应用程序,我正在处理,我发现缩进画布代码有很大帮助。特别是保存/恢复。我什至认为它应该被视为最佳实践,所以知道并做到这一点的人越多越好。

希望这可以帮助。