Javascript动画(二):动起来了的小球

Javascript动画(一)了解了requestAnimationFrame函数,这一节我们使用这个函数来实现一个简单的动画。

第一步:画静止不动的小球

html

<div id="container">
	<canvas id="canvas"></canvas>
</div>

css

body{
    text-align: center;
}
#container{
    margin-top: 30px;
    display: inline-block;
    border-radius: 10px;
    box-shadow: 0 0 10px 0 #999;
    padding: 20px;
}
canvas{
    background-color: #fff;
    border: 1px solid #000;
}

javascript

var cvs = document.getElementById('canvas'),    // 获取画布元素
    ctx = cvs.getContext('2d');                 // 获取画面上下文对象,用于画图
cvs.width = 800;        // 设置画布宽度
cvs.height = 600;       // 设置画布高度

// 小球相关属性
var ball = {
  x: 50,    // x坐标
  y: 50,    // y坐标
  r: 30,    // 小球半径
  color: 'blue',    // 小球填充颜色
  vx: 1,            // 小球x轴速度  px/帧
  vy: 1             // 小球y轴速度  px/帧
};

/**
 * 将小球画到画布上显示出来
 */
function draw() {
  ctx.fillStyle = ball.color;
  ctx.beginPath();
  ctx.arc(ball.x, ball.y, ball.r, 0, Math.PI * 2, false);
  ctx.closePath();
  ctx.fill();
}

// 调用画图函数
draw();

这样就将静止的小球给画出来了静止的小球

第二步:让小球动起来

引入Javascript动画(一)写的requestAnimationFrame的polyfill文件

<script src="../requestAnimationFrame-polyfill.js"></script>

小球动起来,就是要在每一帧的时候更改小球的位置,编写如下update函数

/**
 * 更新小球位置,基于帧速率
 * @param dt 此帧离上帧间隔时间
 */
function update(dt) {
  ball.x += ball.vx;
  ball.y += ball.vy;
  if (ball.x - ball.r <= 0 ) {                  // 小球碰到了左边
    ball.x = ball.r;
    ball.vx *= -1;
  } else if (ball.x + ball.r >= cvs.width) {    // 小球碰到了右边
    ball.x = cvs.width - ball.r;
    ball.vx *= -1;
  }
  if (ball.y - ball.r <= 0 ) {                  // 小球碰到了上边
    ball.y = ball.r;
    ball.vy *= -1;
  } else if (ball.y + ball.r >= cvs.height) {    // 小球碰到了下边
    ball.y = cvs.height - ball.r;
    ball.vy *= -1;
  }
}

编写动画循环函数

// 调用画图函数
// draw();	// 已放到动画循环函数内

var lasttime = undefined;
function animate(time) {
  if (lasttime === undefined) {
    lasttime = time;
  } else {
    var dt = time - lasttime;
    lasttime = time;
    update(dt);                 // 更新小球位置
    draw();                     // 更新后,将小球画出来
  }
  requestAnimationFrame(animate);
}

requestAnimationFrame(animate); // 调用requestAnimationFrame,使浏览器在最佳时机执行回调函数

运行程序几秒后
动的小球

怎么会是这样的呢? canvas在每次作画时,并不会自动清除上次的绘画结果,所以要看到单个小球的话,需使用clearRect函数主动清除上次的绘画结果。
修改draw函数:

function draw() {
  ctx.clearRect(0, 0, cvs.width, cvs.height);		// 添加此行代码
  // 其它代码不改动
}

此次就不上图了,自己运行看下吧~ 0.0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值