【问题标题】:HTML clear animationHTML清晰动画
【发布时间】:2013-10-16 00:22:57
【问题描述】:

我正在尝试使用 if 语句清除画布动画,但是当我单击清除按钮时没有任何反应,任何建议。我还需要删除对象以节省内存吗,或者一旦我清除画布它就会释放内存

    <canvas id="demo" width=720 height=550></canvas>
    <input type="button" id="clear" value="Clear">

.

var doChange = true;
window.onload=function(){

var demo= document.getElementById('demo');
var ctx = demo.getContext('2d');

document.getElementById('clear').addEventListener('click', function() {
doChange=false;
ctx.clearRect(0, 0, demo.width, demo.height);
console.log("clear");
}, false);

var animObjects = [];

animObjects.push(new animRectangle(ctx, 0, 90, 80,80, 'yellow', 3, 3));



 loop(doChange);


function loop(doChange) {

if(doChange==true){

    ctx.clearRect(0, 0, demo.width, demo.height);

    for(var i = 0, ao; ao = animObjects[i]; i++) {
        ao.update();
    }

    requestAnimationFrame(loop);
}

}

function animRectangle(ctx, x, y, XSize,YSize, color, dx, dy) {

var me = this;

this.x = x;
this.y = y;
this.XSize = XSize;
this.XSize = XSize;
this.color = color;
this.dx = dx;
this.dy = dy;

var bool = 0;

this.update = function() {

    if (me.x < 0 || me.x > ctx.canvas.width-80){
        me.dx = -me.dx;
    }
    if (me.y < 50 || me.y > 200){
        me.dy = -me.dy;
    }
    me.x += me.dx;
    me.y += me.dy;

    render();
}

function render() {
    ctx.beginPath();
    ctx.rect(me.x, me.y, me.XSize, me.XSize);
    ctx.closePath();
    ctx.fillStyle = me.color;
    ctx.fill();
}
return this;
}

【问题讨论】:

  • 我对代码做了一些更改,但它仍然不起作用,现在它只是清除对象但没有动画我认为 if 语句有问题

标签: javascript html animation canvas


【解决方案1】:

问题是您在函数中使用本地变体覆盖了全局 doChange。当 rAF 传入它的使用时间时,它将始终为“真”(&gt; 0)并且由于您不进行显式测试(=====),非零值将始终为“真” ”。

我还建议您在条件检查中执行所有操作(在这种情况下),并且不要将它们分段,因为您的代码是异步的。

例如,修改这个 sn -p 只设置标志:

document.getElementById('clear').addEventListener('click', function() {
    doChange = false; /// set global flag to false
}, false);

然后在循环中进行条件检查并将操作移到里面:

function loop() { // can't pass arguments in here as rAF will pass in used time
                  // and it will override the global doChange

    if (doChange === true) { /// explicitly check for boolean using ===

        ctx.clearRect(0, 0, demo.width, demo.height);

        for(var i = 0, ao; ao = animObjects[i]; i++) {
            ao.update();
        }

        requestAnimationFrame(loop);

    } else {
        ctx.clearRect(0, 0, demo.width, demo.height);

    }
}

请注意,您的条件在此处的工作方式将在单击检查时结束。如果您希望循环继续运行,您必须将 rAF 移出条件检查块。

【讨论】:

  • 非常感谢您的清晰解释,我一直在尝试这样做,我还需要删除对象(animObjects)以释放内存
  • @KarishKarish 没问题。作为程序员,我们无法在 JavaScript 中控制内存 GC。您可以尝试取消引用所有实例,但由浏览器决定是否清除未使用的对象。
【解决方案2】:

您的“演示”变量似乎没有定义,您想使用“画布”变量。试试这个(在你的第二个代码 sn-p 中将 'demo' 更改为 'canvas',第 3 行和第 4 行):

var canvas = document.getElementById('demo');
var ctx = canvas.getContext('2d');

【讨论】:

  • 谢谢,我对代码做了一些修改,但还是不行,现在它只是清除对象但没有动画我认为 if 语句有问题
  • 不客气。我看不到你实际循环动画的位置,也许这​​是一个我没有注意到的内置函数,我不确定。然而,这里有一个很好的画布动画示例,请查看:stackoverflow.com/questions/19223390/…
  • 这没关系。可以直接引用所有具有 id 的元素。最佳实践当然可以讨论,但这段代码的唯一结果是 OP 使用了对同一元素的两个引用 - 两者都可以工作,但不是最佳的。
猜你喜欢
  • 1970-01-01
  • 2015-07-14
  • 1970-01-01
  • 1970-01-01
  • 2012-09-12
  • 2020-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多