做有态度的前端团队

网易FEG前端团队

canvas学习案例之简单的物理运动

这次主要写2种简单的运动效果,包括匀速直线运动、匀加速直线运动。在码代码之前先了解下canvas动画效果的基本实现原理,其核心思想是先定义一个初始状态,然后定义一个定时器,定时器内执行一个方法,在这个方法中要清除当前的画面,然后重新绘制需要变化的效果。由于人眼存在残影,所以短时间内的中断的变化可以看成是连续的变化。

以下代码都是基于下面的html结构

1
2
3
<canvas id="canvas" width="728" height="400">
你的浏览器不支持canvas,请跟换其他浏览器试一试
</canvas>
匀速直线运动

首先了解下概念:是指运动快慢不变(即速度不变)、沿着直线的运动。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
var canvas = document.getElementById('canvas'),
    ctx = canvas.getContext('2d'),
    canWid = canvas.width,
    canHei = canvas.height;
ctx.fillStyle = '#0c0';
setInterval(function () {
    if (startPoint < (-30)) {
        speed = 0;
        startPoint = canWid + 30;
    }
    run(ctx);
}, 80)
var speed = 0, //定义速度为0
    startPoint = canWid + 30; //小球开始的起点
function run(ctx) {
    speed = -6;
    ctx.clearRect(0, 0, canWid, canHei); //清除画布
    startPoint += speed; //关键点重新计算坐标,每次都减少6
    ctx.beginPath();
    ctx.arc(startPoint, canHei / 2, 30, 0, 2 * Math.PI);
    ctx.closePath();
    ctx.fill();
}
匀加速直线运动

匀变速直线运动的定义:在直线运动中,把加速度的大小和方向都不改变的运动(加速度为正时),称之为匀加速直线运动。
2个基本的公式:
速度公式: 速度 = 初始速度 + 加速度x时间
位移公式: 位移 = 初始速度x时间 + 0.5x加速度x时间x时间

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
var canvas = document.getElementById('canvas'),
    ctx = canvas.getContext('2d'),
    canWid = canvas.width,
    canHei = canvas.height,
    ballRadius = 30;
ctx.fillStyle = '#0c0';
setInterval(function() {
    if (startPoint < (-1)*ballRadius) {
        v0 = 0;
        v = 0;
        a = 10;
        time = 0;
        s = 0;
        startPoint = canWid + 30;
    }
    run(ctx);
}, 70)
 
var v0 = 0,
    v = 0,
    a = 10,
    time = 0,
    s = 0,
    startPoint = canWid + ballRadius;
function run(ctx) {
    time += 0.1; //控制时间的变化
    s = -(0.5 * a * (time * time)); //根据公式计算位移
    startPoint += s;
    ctx.clearRect(0, 0, canWid, canHei);
    ctx.beginPath();
    ctx.arc(startPoint, canHei / 2, ballRadius, 0, 2 * Math.PI);
    ctx.closePath();
    ctx.fill();
}

其中setInterval定时器可以用requestAnimationFrame来代替。
关于requestAnimationFrame的用法可以参考这篇文章http://feg.netease.com/archives/451.html

手机阅读请扫描下方二维码:

分享到:

    已有 98 条评论

    1. admin

      12345678 ali-40.gif ali-41.gif ali-42.gif ali-43.gif ali-44.gif ali-45.gif ali-46.gif ali-47.gif ali-48.gif ali-49.gif ali-50.gif ali-51.gif ali-53.gif ali-54.gif ali-55.gif ali-56.gif ali-57.gif ali-58.gif ali-59.gif ali-60.gif ali-61.gif

    2. ughueuqsisfghlnlwlzw

      12345678 ali-40.gif ali-41.gif ali-42.gif ali-43.gif ali-44.gif ali-45.gif ali-46.gif ali-47.gif ali-48.gif ali-49.gif ali-50.gif ali-51.gif ali-53.gif ali-54.gif ali-55.gif ali-56.gif ali-57.gif ali-58.gif ali-59.gif ali-60.gif ali-61.gif

      1. admin

        12345678 ali-40.gif

        1. admin

          12345678 ali-40.gif ali-40.gif ali-40.gif ali-40.gif ali-40.gif

      2. admin

        12345678 ali-40.gif

      3. admin

        12345678 ali-40.gif

      4. admin

        12345678 ali-40.gif

    3. 12345678 ali-40.gif ali-41.gif ali-42.gif ali-43.gif ali-44.gif ali-45.gif ali-46.gif ali-47.gif ali-48.gif ali-49.gif ali-50.gif ali-51.gif ali-53.gif ali-54.gif ali-55.gif ali-56.gif ali-57.gif ali-58.gif ali-59.gif ali-60.gif ali-61.gif

    4. admin

      ughueuqsisfghlnlwlzw

    5. admin%0d%0aCRLF-Header:CRLF-Value

      12345678 ali-40.gif ali-41.gif ali-42.gif ali-43.gif ali-44.gif ali-45.gif ali-46.gif ali-47.gif ali-48.gif ali-49.gif ali-50.gif ali-51.gif ali-53.gif ali-54.gif ali-55.gif ali-56.gif ali-57.gif ali-58.gif ali-59.gif ali-60.gif ali-61.gif

    6. admin

      12345678 ali-40.gif ali-41.gif ali-42.gif ali-43.gif ali-44.gif ali-45.gif ali-46.gif ali-47.gif ali-48.gif ali-49.gif ali-50.gif ali-51.gif ali-53.gif ali-54.gif ali-55.gif ali-56.gif ali-57.gif ali-58.gif ali-59.gif ali-60.gif ali-61.gif

    7. admin

      12345678 ali-40.gif ali-41.gif ali-42.gif ali-43.gif ali-44.gif ali-45.gif ali-46.gif ali-47.gif ali-48.gif ali-49.gif ali-50.gif ali-51.gif ali-53.gif ali-54.gif ali-55.gif ali-56.gif ali-57.gif ali-58.gif ali-59.gif ali-60.gif ali-61.gif

    8. admin

      12345678 ali-40.gif ali-41.gif ali-42.gif ali-43.gif ali-44.gif ali-45.gif ali-46.gif ali-47.gif ali-48.gif ali-49.gif ali-50.gif ali-51.gif ali-53.gif ali-54.gif ali-55.gif ali-56.gif ali-57.gif ali-58.gif ali-59.gif ali-60.gif ali-61.gif

    9. admin

      12345678 ali-40.gif ali-40.gif ali-40.gif ali-40.gif ali-40.gif ali-40.gif ali-40.gif

    10. admin

      12345678 ali-40.gif ali-40.gif ali-40.gif ali-40.gif ali-40.gif ali-40.gif ali-40.gif

    11. admin

      12345678 ali-40.gif ali-40.gif ali-40.gif ali-40.gif ali-40.gif ali-40.gif ali-40.gif

    12. admin

      12345678 ali-40.gif ali-40.gif ali-40.gif ali-40.gif ali-40.gif ali-40.gif ali-40.gif

    13. admin

      12345678 ali-40.gif ali-40.gif ali-40.gif ali-40.gif ali-40.gif ali-40.gif ali-40.gif ali-40.gif ali-40.gif

    14. shhsdhdf

      ali-45.gif ali-45.gif ali-45.gif ali-45.gif ali-45.gif ali-45.gif ali-45.gif ali-45.gif ali-45.gif ali-45.gif

    15. 1

      1 ali-40.gif ali-40.gif ali-41.gif ali-41.gif ali-42.gif ali-42.gif ali-43.gif ali-43.gif ali-44.gif ali-44.gif ali-45.gif ali-45.gif ali-46.gif ali-46.gif ali-47.gif ali-47.gif ali-48.gif ali-48.gif ali-49.gif ali-49.gif ali-50.gif ali-50.gif ali-51.gif ali-51.gif ali-52.gif ali-52.gif ali-53.gif ali-53.gif ali-54.gif ali-54.gif ali-55.gif ali-55.gif ali-56.gif ali-56.gif ali-57.gif ali-57.gif ali-58.gif ali-58.gif ali-59.gif ali-59.gif ali-60.gif ali-60.gif ali-61.gif ali-61.gif

    16. 1

      1 ali-40.gif ali-40.gif ali-41.gif ali-41.gif ali-42.gif ali-42.gif ali-43.gif ali-43.gif ali-44.gif ali-44.gif ali-45.gif ali-45.gif ali-46.gif ali-46.gif ali-47.gif ali-47.gif ali-48.gif ali-48.gif ali-49.gif ali-49.gif ali-50.gif ali-50.gif ali-51.gif ali-51.gif ali-52.gif ali-52.gif ali-53.gif ali-53.gif ali-54.gif ali-54.gif ali-55.gif ali-55.gif ali-56.gif ali-56.gif ali-57.gif ali-57.gif ali-58.gif ali-58.gif ali-59.gif ali-59.gif ali-60.gif ali-60.gif ali-61.gif ali-61.gif

    17. 1

      555

    18. 1

      1 ali-40.gif ali-40.gif ali-41.gif ali-41.gif ali-42.gif ali-42.gif ali-43.gif ali-43.gif ali-44.gif ali-44.gif ali-45.gif ali-45.gif ali-46.gif ali-46.gif ali-47.gif ali-47.gif ali-48.gif ali-48.gif ali-49.gif ali-49.gif ali-50.gif ali-50.gif ali-51.gif ali-51.gif ali-52.gif ali-52.gif ali-53.gif ali-53.gif ali-54.gif ali-54.gif ali-55.gif ali-55.gif ali-56.gif ali-56.gif ali-57.gif ali-57.gif ali-58.gif ali-58.gif ali-59.gif ali-59.gif ali-60.gif ali-60.gif ali-61.gif ali-61.gif

    19. 1

      1 ali-40.gif ali-40.gif ali-41.gif ali-41.gif ali-42.gif ali-42.gif ali-43.gif ali-43.gif ali-44.gif ali-44.gif ali-45.gif ali-45.gif ali-46.gif ali-46.gif ali-47.gif ali-47.gif ali-48.gif ali-48.gif ali-49.gif ali-49.gif ali-50.gif ali-50.gif ali-51.gif ali-51.gif ali-52.gif ali-52.gif ali-53.gif ali-53.gif ali-54.gif ali-54.gif ali-55.gif ali-55.gif ali-56.gif ali-56.gif ali-57.gif ali-57.gif ali-58.gif ali-58.gif ali-59.gif ali-59.gif ali-60.gif ali-60.gif ali-61.gif ali-61.gif

    20. 1

      1

    21. 1

      1

    22. 1

      555

    23. 1

      1

    24. 1

      1

    25. 1

      1

    26. 1

      1

    27. 1

      1

    28. 1

      1

    29. 1

      555

    30. 1

      1

    31. 1

      1

    32. 1

      555

    33. 1

      1

    34. 1

      555

    35. 1

      1

    36. 1

      1

    37. 1

      1

    38. 1

      1

    39. 1

      1

    40. 1

      1

    41. 1

      1

    42. 1

      1

    43. 1

      1

    44. 1

      1

    45. 1

      1

    46. 1

      1

    47. 1

      1

    48. 1

      1

    49. 1

      1

    50. 1

      1

    51. 1

      1

    52. 1

      1

    53. 1

      1

    54. 1

      1

    55. 1

      1

    添加新评论

    ali-40.gifali-41.gifali-42.gifali-43.gifali-44.gifali-45.gifali-46.gifali-47.gifali-48.gifali-49.gifali-50.gifali-51.gifali-52.gifali-53.gifali-54.gifali-55.gifali-56.gifali-57.gifali-58.gifali-59.gifali-60.gifali-61.gif