JavaScript - canvas - putImageData не всегда работает

Возникли проблемы с восстановлением фона на холсте. У меня есть холст, который меняет размер в зависимости от того, что говорят опции (и он может стать очень большим), я рисую изображения по всему нему, и теперь я хочу, чтобы индикатор отображал положение мыши в формате сетки. Проблема в том, что красный прямоугольник рисуется, но фон не перерисовывается в следующий раз curX или же curY изменено

Одна странная часть, которую я замечаю, состоит в том, что когда я перемещаю мышь в черную область, красное поле кажется темно-красным, но когда я перемещаюсь назад и вперед по одному и тому же месту, красное, кажется, становится сильнее. И иногда красные ящики, которые я рисовал раньше, также становятся сильнее, не посещая эти области, как формируется след.

Только иногда фон возвращается, но обычно это происходит, когда я покидаю область.

<canvas id="leveldraw" onmousemove="getMouse(event)" onmouseout="stopMouse()" width="0" height="0"></canvas>

...

var oldBlk = null;
...
function getMouse(e)
{
    var offsetpos = recursive_offset(canvas);
    var oldX = curX;
    var oldY = curY;
    mouseX = e.clientX + offsetpos.x + (canvas.offsetLeft/2);
    mouseY = e.clientY + offsetpos.y + (canvas.offsetTop/2)+24;
    curX = Math.floor(mouseX/24);
    curY = Math.floor(mouseY/24);
    if(oldX!=curX || oldY!=curY)
    {
        if(oldBlk != null)
            ctx.putImageData(oldBlk,(oldX*24)-24,(oldY*24)-24);
        oldBlk = ctx.getImageData((curX*24)-24,(curY*24)-24,72,72);
        ctx.lineWidth="1";
        ctx.strokeStyle="red";
        ctx.rect(curX*24,curY*24,24,24);
        ctx.stroke();
    }
}
function stopMouse()
{
    ctx.putImageData(oldBlk,(curX*24)-24,(curY*24)-24);
    oldBlk = null;
}

recursive_offset(): Получить позицию мыши в прокручиваемом элементе div

Я даже пробовал getImageData на всем холсте, но, похоже, это не сработало. Возможно, он действительно восстановил весь фон при выходе из холста, НО красные коробки вернулись, как только я вернулся на холст.

1 ответ

Решение

Вы должны использовать ctx.beginPath() перед следующей операцией рисования. призвание stroke() или же fill() не очищает стек и будет снова разыгран в следующий раз, что приведет к формированию следа.

Другие вопросы по тегам