javascript - Canvas 上的图形未正确清除?

标签 javascript html5-canvas

我正试图从我的 Canvas 游戏中榨取最后一点性能;最近我发现清除 Canvas 的性能非常高,所以我试图找到一种方法来代替每帧清除整个 Canvas 。但是,我发现我正在尝试的新方法存在一些问题,即分别清除每个对象的边界框,然后更新它们。

问题是元素在离开 Canvas 时会“落在后面”,而图像的某些部分仍然存在。我尝试简化代码以确保问题不在其余代码中,但我并不高兴。

返回到每帧删除整个 Canvas 也是不可取的,尤其是因为这种新方法要快得多。这是代码(出于某种原因,它不能用作 fiddle )。

var enemyCtx = document.getElementById('enemy').getContext('2d');

var game =
{
    w: 800,
    h: 500
};
var enemies = [];
window.addEventListener('load', function()
{
    for (var i = 0; i < 200; i++)
    {
        enemies[enemies.length] = new Enemy();
    }
    update();
}, false);

var buffer = document.createElement('canvas');
    buffer.width = 42;
    buffer.height = 42;
    var bufferCtx = buffer.getContext('2d');
    drawEnemy(bufferCtx, 5, 5, 32, 32, 'red');

function update()
{
    for (var i = 0; i < enemies.length; i++)
    {
                    enemyCtx.clearRect(    enemies[i].x,
                                enemies[i].y,
                                enemies[i].x + enemies[i].width,
                                enemies[i].y + enemies[i].height);
    }
    for (var i = 0; i < enemies.length; i++)
    {
        enemies[i].x-=5;
        enemyCtx.drawImage(buffer, enemies[i].x-5, enemies[i].y-5);
    }
    requestAnimationFrame(update);
}

function drawEnemy(ctx, x, y, width, height, colour)
{
        ctx.lineWidth = 1;
        ctx.strokeStyle = colour;
        ctx.strokeRect(x + 0.5, y + 0.5, width, height);
}

function Enemy()
{
    this.x = Math.random()*game.w;
    this.y = Math.random()*game.h;
    this.width = 32;
    this.height = 32;
}
(function()
{
    // http://paulirish.com/2011/requestanimationframe-for-smart-animating/
    var lastTime = 0;
    var vendors = ['ms', 'moz', 'webkit', 'o'];
    for(var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x)
    {
        window.requestAnimationFrame = window[vendors[x]+'RequestAnimationFrame'];
        window.cancelAnimationFrame = window[vendors[x]+'CancelAnimationFrame'] || window[vendors[x]+'CancelRequestAnimationFrame'];
    }

    if (!window.requestAnimationFrame) window.requestAnimationFrame = function(callback, element)
    {
        var currTime = new Date().getTime();
        var timeToCall = Math.max(0, 16 - (currTime - lastTime));
        var id = window.setTimeout(function()
        {
            callback(currTime + timeToCall);
        }, timeToCall);
        lastTime = currTime + timeToCall;
        return id;
    };

    if (!window.cancelAnimationFrame) window.cancelAnimationFrame = function(id)
    {
        clearTimeout(id);
    };
}());

& html:

<canvas id="enemy" width="800" height="500"></canvas>​

你们给我的任何见解都会非常有用;谢谢!

最佳答案

经过深思熟虑,我想出了一个解决方案;或许对你们有些帮助。

基本上,图像“留在” Canvas 上,因为 clearRect() 方法需要使用实际的 Canvas 坐标。因为图像离开 Canvas ,所以它的坐标将为负值。

function update()
{
    for (var i = 0; i < enemies.length; i++)
    {
        lx = (enemies[i].x > 0) ? enemies[i].x : 0;
        ly = (enemies[i].y > 0) ? enemies[i].y : 0;
        enemyCtx.clearRect( lx,
                            ly,
                            lx + enemies[i].width + 1,
                            ly + enemies[i].height + 1);
    }
    // ...
}

宽度增加 1 是为了在图像被删除时停止 Canvas 绘制图像的最后一个像素列。希望这会有所帮助。

关于javascript - Canvas 上的图形未正确清除?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13996250/

相关文章:

javascript - 如何优化动态加载 HTML5 游戏世界的 Canvas 渲染?

html - 使用 SVG 路径数据在 Canvas 中绘制路径(SVG 路径到 Canvas 路径)

javascript - React.js 应用程序在服务器中作为空白页面打开,而在本地运行良好

javascript - 如何按顺序执行功能 : 1. 放大 -> 2. 旋转 360 度 -> 3. 调整到放大前的大小 -> 4. 更改颜色(切换)

javascript - 我可以将 "this"作为参数传递给 javascript 中的另一个函数吗

Javascript slider 动态更改变量

javascript - 网络 worker 和 Canvas

javascript - "google is not defined"但包含 Google map API

javascript - 使用 jQuery 比较具有相同类名但不同 id 的多个输入字段

javascript - 使用kinetic js在 Canvas 中显示多个对象