【问题标题】:Javascript Canvas Animation (Stick Figure Movement)Javascript 画布动画(简笔画运动)
【发布时间】:2018-08-13 15:04:14
【问题描述】:

我一直在到处寻找展示如何制作动画的地方。我已经看到你可以将积木移动到一个区域并向后移动,上下移动一个圆圈,但对于移动他的身体的人物却没有。我使用 css 动画,但想尝试 javascript 画布。这个人物有什么办法可以在 Canvas 上做一个挥动的动画吗?我假设需要 setTimeout?

<canvas id="canvas" width="400px" height="400px" >
Your browser does not support HTML5 Canvas element
</canvas>

<script>
var canvas = document.getElementById("canvas");
context = canvas.getContext("2d"); // get Canvas Context object

context.beginPath();
context.fillStyle = "black"; // #000000
context.arc(200.width, 50, 30, 0, Math.PI * 2, true);
context.fill(); //fill the circle  

context.beginPath(); 
context.lineWidth = 6;
context.stroke();

//body
context.beginPath();
context.moveTo(200, 80);
context.lineTo(200, 180);
context.strokeStyle = "black";
context.stroke();

//arms
context.beginPath();
context.strokeStyle = "black";
context.moveTo(200, 100);
context.lineTo(150, 130);
context.moveTo(200, 100);
context.lineTo(250, 130);
context.stroke();

//legs
context.beginPath();
context.strokeStyle = "black";
context.moveTo(200, 180);
context.lineTo(150, 280);
context.moveTo(200, 180);
context.lineTo(250, 280);
context.stroke();
</script>     

【问题讨论】:

    标签: javascript html animation canvas


    【解决方案1】:

    首先,由于我们要一遍又一遍地绘制一个框架,我们需要将绘制代码放入draw function

    Window 对象上有一个名为requestAnimationFrame 的方法,只要它可用,它就会始终调用此draw 函数。这可以防止窗口耗尽所有内存,并且如果在动画运行时翻转选项卡,则会暂停动画。 setTimeoutsetInterval 曾经用于此目的,但不要再使用它们了。

    由于所发生的只是draw 函数一直被调用,为了只定期更改绘图,我们设置了一个变量(在本例中称为wave)来确定手臂的绘制方式。

    timestamp 用于确定在调用 draw 时自上次绘制以来是否经过了 900 毫秒。如果还没有,我们会一直调用该函数,直到该持续时间过去。通常我们希望它更快,但由于我们使用“波浪”作为示例,并且我们只有两种绘图状态(向上或向下)它工作正常。

    let timestamp = Date.now();
    let wave = false;
    
    
    draw();
    

    var canvas = document.getElementById("canvas");
    context = canvas.getContext("2d"); // get Canvas Context object
    let timestamp = Date.now();
    let wave = false;
    
    
    draw();
    
    function draw() {
    if(Date.now() < (timestamp+900)) return requestAnimationFrame(draw);
    
    context.clearRect(0, 0, window.innerWidth, window.innerHeight);
    context.beginPath();
    context.fillStyle = "black"; // #000000
    context.arc(200, 50, 30, 0, Math.PI * 2, true);
    context.fill(); //fill the circle  
    
    context.beginPath(); 
    context.lineWidth = 6;
    context.stroke();
    
    //body
    context.beginPath();
    context.moveTo(200, 80);
    context.lineTo(200, 180);
    context.strokeStyle = "black";
    context.stroke();
    
    //arms
    context.beginPath();
    context.strokeStyle = "black";
    context.moveTo(200, 100);
    context.lineTo(150, 130);
    if(wave) { 
    context.moveTo(200, 100);
    context.lineTo(250, 130);
    wave = false;
    }
    else {
    context.moveTo(200, 100);
    context.lineTo(250, 70);
    wave = true;
    }
    context.stroke();
    
    //legs
    context.beginPath();
    context.strokeStyle = "black";
    context.moveTo(200, 180);
    context.lineTo(150, 280);
    context.moveTo(200, 180);
    context.lineTo(250, 280);
    context.stroke();
    timestamp = Date.now();
    requestAnimationFrame(draw);
    }
    <canvas id="canvas" width="400px" height="400px" >
    Your browser does not support HTML5 Canvas element
    </canvas>

    【讨论】:

    • 完美!很好的解释。谢谢!
    • 很高兴能帮上忙!
    • 还有更多的方法吗?你有网站例子吗?如果我想让他跳起来挥手,然后向右走怎么办?如果你想让我给你更多的声誉,我可以提出另一个问题。 @zfrisch
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-08
    相关资源
    最近更新 更多