移動していないアイテム(背景画像、静止アイテムなど)の再描画を防ぐために、キャンバスに「ダーティゾーン」を設定しようとしています。つまり、移動しているプレーヤーの後ろに描画された背景のみを再描画する必要があります。
編集:提案されているように、これがそのjsfiddleです http://jsfiddle.net/7kbzj/3/
「update」メソッドはそこでは機能しないので、「movesprite」リンクをクリックして実行できるmoveSprite()です...基本的に、クリッピングゾーンはクリックするたびに右に10px移動する必要があります。クリッピングマスクは初期位置に留まり、再ペイントのみが行われます。奇妙な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);
}
切り抜きの動作を確認するために、切り取りたい領域に別の色の背景(青いもの)を描画します...結果は悪く、最初の切り取られた領域だけが青く塗られます:(
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);
}
function setDirtyArea(x,y,w,h) {
ctx.restore();
// define new dirty zone
ctx.beginPath();
ctx.rect(x, y, w, h);
ctx.clip();
}
ブルーゾーンが画面の右側に向かって伝播するのを見てみたいです...助けてください、何が悪いのかわかりません!ありがとう、J。