Canvas 匀速运动

好了,数学烧脑问题先放一边,我们接下来开始物理烧脑问题

物理烧脑问题有哪些呢?

恒速运动,加速运动,摩擦力,空气阻力,水浮力/水压力,磁场,电场... 不敢多说了,我怕被打

我们从最简单的开始,最简单的是啥? 恒速运动

恒速运动

想必大家对 恒速运动 不陌生,会开车的都知道,比如高速公路保持 120km/h 的速度行驶

不会开车也没关系,看看你手机上的时间,如果不出意外,秒针每隔 1 秒增加 1

所以,恒速运动 就是物体在单位时间内 ( △t ) 运动的距离是一个恒定的值 ( △S ),我们称这个速度为速率 v

也就是 v = △S

例如上图小球在单位时间内 1s 移动的距离都是 25,所以速率 v = 25

那么物体在某个时间移动的总距离就是

S = v * t 

例如小球运动了 3s 有后距离原点 (0) 的距离为 25*3 = 75

匀速动画

知道了匀速运动的原理就好办了,我们就可以做匀速动画了

<!DOCTYPE html>
<meta charset="utf-8">
<canvas id="canvas-1" width="400" height="100">
</canvas>
<script>
var c = document.getElementById('canvas-1');
var ctx = c.getContext('2d');

// 小球
var ball = {
  x: 10,
  y: 50,
  direction:1,
  radius: 10,
  color: 'black',
  draw: function() {
    ctx.beginPath();
    ctx.arc(this.x, this.y, this.radius, 0, Math.PI * 2, true);
    ctx.closePath();
    ctx.fillStyle = this.color;
    ctx.fill();
  }
};

function animate_it (){
    ctx.clearRect(0,0,c.width,c.height);
    ball.draw();

    if ( ball.direction == 1 )
    {
        ball.x += 100/60;
    }else {
        ball.x -= 200/60;
    }


    if (ball.x <= 0 ){
        ball.x = 0;
        ball.direction = 1;
    }

    if ( ball.x > 400 ){
        ball.x = 400;
        ball.direction = 0;
    }

    window.requestAnimationFrame(animate_it);
}

window.requestAnimationFrame(animate_it);

</script>

代码很简短

if (ball.x <= 0 ){
    ball.x = 0;
    ball.direction = 1;
}

if ( ball.x > 400 ){
    ball.x = 400;
    ball.direction = 0;
}

上面这段代码用于边界检测

if ( ball.direction == 1 )
{
    ball.x += 100/60;
}else {
    ball.x -= 200/60;
}

如果从左往右跑,匀速速率为 100/60 ,如果从右往左跑,速率变成 200/60

为什么我们不直接计算值呢? 因为 60 是 requestAnimationFrame() 回调时间
我们这样赋值就可以很明显的知道,每秒运动了多少

范例 2

我们让小球随意四处运动,碰到了墙壁(边界)就自动回弹吧)

<!DOCTYPE html>
<meta charset="utf-8">
<canvas id="canvas-2" width="400" height="100">
</canvas>
<script>
var c2 = document.getElementById('canvas-2');
var ctx2 = c2.getContext('2d');

// 小球
var ball2 = {
  x: 10,
  y: 10,
  vx: -100/60,
  vy: -100/30,
  direction:1,
  radius: 10,
  color: 'black',
  draw: function() {
    ctx2.beginPath();
    ctx2.arc(this.x, this.y, this.radius, 0, Math.PI * 2, true);
    ctx2.closePath();
    ctx2.fillStyle = this.color;
    ctx2.fill();
  }
};

function animate_it2 (){
    ctx2.clearRect(0,0,c2.width,c2.height);
    ctx2.strokeRect(0,0,c2.width,c2.height);
    ball2.draw();

    ball2.x += ball2.vx;
    ball2.y += ball2.vy;


    if (ball2.x <= 0 ){
        ball2.x = 0;
        ball2.vx = - ball2.vx;
    }

    if ( ball2.y <= 0 ) {
        ball2.y = 0;
        ball2.vy =  - ball2.vy;
    }

    if ( ball2.x > c2.width  ){
        ball2.x = c2.width;
        ball2.vx = -ball2.vx;
    }

    if ( ball2.y > c2.height ){
        ball2.y = c2.height;
        ball2.vy = - ball2.vy;
    }

    window.requestAnimationFrame(animate_it2);
}

window.requestAnimationFrame(animate_it2);

</script>

Canvas 基础教程

关于   |   FAQ   |   我们的愿景   |   广告投放   |  博客

  简单教程,简单编程 - IT 入门首选站

Copyright © 2013-2022 简单教程 twle.cn All Rights Reserved.