Canvas图像操作的Plus版,帧式动画【玩转Canvas】
【摘要】 文本分享Canvas中关于帧式动画的知识点和使用,相较于复制、裁剪和贴图等功能,帧式动画让功能从平面变得生动了起来,帮助实现更多的创意。
前情提要
前篇了解了Canvas如何操作图片,进行复制、裁剪和贴图。也通过具体实例将API进行了简单的应用,不得不说,这样的方式挺能帮助加深记忆的。
本篇了解一下帧式动画。
帧式动画
先来简单介绍一下帧式动画。
当年动画还是Flash的天下时,我们会学习逐帧动画:
逐帧动画就是一帧一个图像画面,连续多帧就会形成一个动画
帧式动画很类似:
帧式动画通过绘制每一个大小相同的帧(或页面),将每一帧连贯起来,模拟动画效果。
简单帧式动画
- 创建动画的帧计数器,用来实现图像的交替效果,第一帧设为0,第二帧设为1。
- 创建一个计时器,使前面的计数器,在一个特定的帧速率下循环运行。这里我设置的循环速率是100ms/次。
- 使用drawImage()方法改变每一帧图像的拼板显示区域。我设置拼版宽度基数是10。
- 一个简单的帧式动画就完成了,接下来,我们将收获一只摇滚兔🐰
关键代码
function imgLoadFunc() {
imgLoop();
}
// 动画绘制
function imgDrow() {
ctx.fillStyle = '#0f6fb8';
ctx.fillRect(0, 0, 500, 500);
ctx.drawImage(img, 10 * count, 10, 80, 60, 30, 30, 60, 60);
count++;
// 反复摇摆
if (count > 1) {
count = 0;
}
}
// 循环动画
function imgLoop() {
// 定时
window.setTimeout(imgLoop, 100);
imgDrow();
}
复杂帧式动画
前面简单帧式动画,只设置了两帧,相对单一了些。实际开发中,很少会这么简单,一般都是相对复杂的动画效果。所以接下来我们探索一下复杂帧式动画是什么样以及如何实现的。
设计思路
飞机大战的游戏都玩过吧,需要打掉不停下落的物体。下面我就实现一个移动的飞机✈️。
- 创建两个变量x和y储存飞机的x轴和y轴的位置。初始值都设置为50。
- 然后再创建两个变量dx和dy,来表示移动的矢量值。因为是向上移动,所以dy值设置成-1,dx值设置为0。这样坦克会沿着Y轴向上移动,且X轴不变。
- 创建一个需要绘制成动画的飞机的编号数组。
- 设置一个计数器来追踪当前飞机的索引:index,初始值是0.
- 创建动画的帧循环,每次会更新index的值,当index大于飞机的编号数组的长度之后,index值重置成0.
- 这样我们就得到了一个向上移动的飞机✈️了。
关键代码
function draw() {
var canvas = document.getElementById('canvas');
if (canvas.getContext) {
var ctx = canvas.getContext('2d');
// 定义图像
let img = new Image();
// 设置图像的地址
img.src = 'https://p6-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/b9057bd739104dfe95855c7ba694a545~tplv-k3u1fbpfcp-watermark.image';
img.addEventListener('load', imgLoadFunc, false);
let animations = [1, 2, 3, 4, 5, 6, 7, 8];
let index = 0;
let dx = 0;
let dy = -1;
let x = 50;
let y = 50;
function imgLoadFunc() {
imgLoop();
}
// 动画绘制
function imgDrow() {
x = x + dx;
y = y + dy;
ctx.fillStyle = '#0f6fb8';
ctx.fillRect(0, 0, 500, 500);
ctx.drawImage(img, 0, 0, 32, 32, x, y, 32, 32);
index++;
if (index == animations.length) {
index = 0;
}
}
// 循环动画
function imgLoop() {
// 定时
window.setTimeout(imgLoop, 100);
imgDrow();
}
}
}
未完待续
今天对Canvas的帧式动画的分享就到这里了。但是对图像的探索还没结束,我感觉图像操作还有空间,下节继续吧。
我喜欢创作,每一幅作品都是我将想象用一只叫做“代码”的画笔,绘制而成。
当我寻找新的技术的时候,不是创意枯竭,而是我需要新的色彩。
而这个循序渐进的学习过程,虽然缓慢,但是积少成多、聚沙成塔。
作者:非职业「传道授业解惑」的开发者叶一一简介:「趣学前端」、「CSS畅想」系列作者,华夏美食、国漫、古风重度爱好者,刑侦、无限流小说初级玩家。如果看完文章有所收获,欢迎点赞👍 | 收藏⭐️ | 留言📝。
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)