惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

GbyAI
GbyAI
Hacker News: Ask HN
Hacker News: Ask HN
The Hacker News
The Hacker News
S
Security Affairs
T
Tor Project blog
N
News | PayPal Newsroom
V2EX - 技术
V2EX - 技术
Microsoft Security Blog
Microsoft Security Blog
人人都是产品经理
人人都是产品经理
The Cloudflare Blog
P
Palo Alto Networks Blog
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
Vercel News
Vercel News
W
WeLiveSecurity
Y
Y Combinator Blog
TaoSecurity Blog
TaoSecurity Blog
MongoDB | Blog
MongoDB | Blog
Cloudbric
Cloudbric
大猫的无限游戏
大猫的无限游戏
Blog — PlanetScale
Blog — PlanetScale
G
GRAHAM CLULEY
博客园 - 聂微东
月光博客
月光博客
T
The Exploit Database - CXSecurity.com
C
Cyber Attacks, Cyber Crime and Cyber Security
Latest news
Latest news
H
Help Net Security
U
Unit 42
P
Privacy & Cybersecurity Law Blog
The GitHub Blog
The GitHub Blog
S
Securelist
The Last Watchdog
The Last Watchdog
Stack Overflow Blog
Stack Overflow Blog
H
Hacker News: Front Page
C
Check Point Blog
Schneier on Security
Schneier on Security
D
Darknet – Hacking Tools, Hacker News & Cyber Security
S
Schneier on Security
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
A
Arctic Wolf
P
Privacy International News Feed
WordPress大学
WordPress大学
T
Threatpost
博客园_首页
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
S
Secure Thoughts
Simon Willison's Weblog
Simon Willison's Weblog
www.infosecurity-magazine.com
www.infosecurity-magazine.com
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Jina AI
Jina AI

囧克斯

奔四了,写给40岁的自己 有序退网 我和 Vue.js 的十年 我参与《代码之外 Beyond Code》的故事 博客站迁移至 VitePress 的备忘 写给我的奶奶 中文格式化小工具 zhlint 及其开发心得 vue-mark-display:用 markdown 语法轻松撰写幻灯片 我对技术会议的一些看法 VueConf Hangzhou 见闻 第四届 CSSConf CN 见闻 [译]Web 表单的未来 [译]苹果正在做一些他们的程序员明摆着不想要的东西 [译]为什么我不会无偿加班且你也不应该 [译]如果管理是唯一可走的路,那就完蛋了 [译]如何撰写 Git 提交信息 [译]C 程序的原则 Vue 2.0 来了! Weex 近 4 个月的开源之路 Weex 在 JS Runtime 内的多实例管理 我理解的 SPA 我理解的 Flux 架构 【整理】Vue 2.0 自 beta 1 到 beta 4 以来的主要更新 通过一张图走进 Vue 2.0 Code Review for Vue 2.0 Preview Vue 2.0 发布啦! 务实的小而美 Vue.js 1.0.0 发布了! [译]如何成为一名卓越的前端工程师 手机淘宝前端的图片相关工作流程梳理 [译]如何让办公室政治最小化 Vue.js 源码学习笔记 从原型到发布——“团队时间线” 1.0 开发心得 Vue + webpack 项目实践 用 Koa 写服务体验 webcomponents 笔记 之 配置管理 小秀个人的13~14年摄影作品 (共19张) 由今年D2前端论坛想到的 [译]CSS命名神马的真心难 [译]Git 分支的最佳实践 [译]撰写可测试的 JavaScript [译]语义化版本管理 [译]通过HTML5 Canvas API调节图像的亮度和颜色 [译]JavaScript V8性能小贴士 [译]视觉差,走起! [译]Chrome开发者工具中评估性能的五大新特性 精气神儿 细节无微不至,彩屏让人又爱又恨——新老“神机”大对决:Nokia 1050 vs Nokia 1202 秦升拿到红牌之后…… 用Sass重新整理自己的博客主题样式 Connect中间件使用手册 巧用 RequireJS Optimizer 给传统的前端项目打包 编辑器小调查结果 [译]JSLint 文档 烟火——写给蛇年的傲游和我 小秀个人的全年摄影作品 (共15张) 2012年终毫无正能量的总结 标签?ID?还是CLASS? 微创新=伪创新 HTML5峰会归来 分享bookmarklet一则:随意阅读 国际羽联和中国队之间的恶性循环 ZeroClipboard 学习笔记 “思考人生” 听杨东杰弹吉他 学习精髓 网站装修笔记20120426 网站装修笔记20120414 网站装修笔记20120406 分享Typecho插件:百度统计助手 我的得奖感言 网站装修笔记20120331 用CSS3制作尖角标签按钮样式 分享Typecho插件:Markdown 解析器 + 编辑器 分享Typecho皮肤:我的字很大 汇总自己过去的一些HTML5科普文章 html5中的消息通信简介 + 我的新网站开张 网站装修计划 Typed Arrays 是神马? 文明看球 HTML5中的文件处理 之 File Writer API HTML5中的文件处理 之 File API 独生子女、互相等和不耐烦 IndexedDB技术简介(四) IndexedDB技术简介(三) IndexedDB技术简介(二) IndexedDB技术简介(一) 把博客的字体进一步调大,同时去掉了侧边栏 “模仿别人是为了找到自己” 写给我未婚妻的2011年 写给自己的2011年 “吃了吧,不吃就浪费了” 写给傲游的2011年 所谓专业 写给HTML5的2011年 对HTML5中LocalStorage的一些使用建议 回味一下我2011年看到的最过瘾的5场足球比赛 浅浅浅谈开饭店被顾客吃出“异物”的用户体验 前端的本职 继续对Mac穷追猛打 之 修改原生按钮文字大小的技巧
手把手教你入门EaselJS做HTML5动画
勾三股四 · 2012-01-22 · via 囧克斯

本文摘自 勾三股四 更早时期的 不老歌 博客。


今天借由EaselJS这个脚本库,写一个简单的动画给大家当做为示范。

DEMO演示链接
这个demo的最终效果是游戏割绳子(Cut the Rope)中的小青蛙的动画表情。

首先简单介绍一下EaselJS这个脚本库,它是我最近发现的一个用来绘制Canvas动画的脚本库,比起Canvas的底层API,这个脚本库的接口设计更简单易用,所以做起动画来就易如反掌了。这里有详细的信息文档

素材

我们今天要完成的动画是通过Canvas技术,一帧一帧绘制出来的,那么首先需要每一帧动画的素材。我们从http://cuttherope.ie/找到了一些素材,并把每一帧动画都切割成100*100像素的图像。这里我们选择了小青蛙的两个状态动画:点头的状态和撅嘴的失败的状态,一共19+13=32帧。

在EaselJS中,我们可以把多个连续的图像排列成为一张大图,再用脚本将其切割为多帧动画,所以我们把这些素材按顺序合并成一张100*3200的大图片,这跟CSS Sprites技术有异曲同工之妙。最后的图片保存为了sprites.png

准备工作

首先,导入easeljs脚本库

_script src="easeljs.js">_/script>

然后,创建canvas标签

_canvas id="canvas" width="100" height="100">_/canvas>

准备编写JS

创建舞台(stage)

// create a new stage and point it at our canvas
var stage = new Stage(document.getElementById('canvas'));

创建小青蛙

小青蛙是由一个 BitmapAnimation 类创建出来的全局变量 icon,这类对象可以在舞台中播放动画。而动画是由 sprites.png 中的图片循环播放生成的,这里我们需要通过另一个类创建对象:SpriteSheet,整个小青蛙的创建方法如下:

// create a SpriteSheet using "sprites.png" with a frame size of 100x100
var spriteSheet = new SpriteSheet({
images: ["sprites.png"],
frames: {width: 100, height: 100}
});

// create a BitmapAnimation to display frames from the sprite sheet
icon = new BitmapAnimation(spriteSheet);

播放动画

创建完毕之后,这个小青蛙的对象需要添加到舞台中:

// append into stage and start animations
stage.addChild(icon);
icon.gotoAndPlay(0);
Ticker.addListener(stage);

对上面的代码做一下解释:第一行代码是把小青蛙的对象添加到舞台,用到了舞台的 Stage.prototype.addChild 接口;第二行代码是让动画从第1帧开始播放,用到了 BitmapAnimation.prototype.gotoAndPlay 接口;第三行代码则是开始播放动画,它的原理有点意思,Ticker 是EaselJS中的又一个类,用来作为控制动画播放的“节拍器”。当我们使用 Ticker.addListener 方法时,节拍器会有节奏的触发第一个参数的 tick 函数(默认是20帧/秒),而 stage 对象刚好有一个默认函数 Stage.prototype.tick,会把舞台中的所有动画元素向前播放一帧。这样,小青蛙的动作就会连贯的播放出来了。
我们现在看到的效果就是一只小青蛙连续的点头和撅嘴,是不是很可爱 :-)
此时的阶段性DEMO演示链接 1

加入动画的控制,让小青蛙连续点头

接下来加入一些动画的控制,比如让小青蛙处于循环点头的状态——事实上这才是割绳子游戏中的正常状态。

// bind animation events
icon.tick = function () {
if (icon.currentFrame == 18) {
icon.currentFrame = 0;
}
};

这里给icon.tick赋值一个函数,这个函数会在每一帧动画播放之后被触发。我们在这个函数中判断,如果播放到第19帧时,立即从第1帧继续播放。这样,小青蛙点头的动画就可以重复播放了。设置当前帧数的方法是修改 icon.currentFrame 的值。
此时的阶段性DEMO演示链接 2

加入小青蛙撅嘴状态的切换

在这个基础上,我们再加入让青蛙撅嘴的状态,并且可以通过回车键使小青蛙切换到撅嘴的状态。

window.onkeydown = function (event) {
if (event.keyCode == 13) {
icon.gotoAndPlay(19);
}
};

刷新页面,这时,我们看到,小青蛙还是处在连续点头的状态,当我们按下回车键时,小青蛙立刻从第20帧开始继续播放,即撅嘴。但有个小问题,因为节拍器是循环播放的,所以当撅嘴的动画播放完毕之后,动画会自动跳到第1帧。即重新回到连续点头的状态。
此时的阶段性DEMO演示链接 3

这其实不是我们希望看到的,我们希望小青蛙撅嘴之后,停留在最后一帧,当用户再次按下回车键后,再回到连续点头的状态。所以,我们还会对代码做一些修改。

最终完成

首先,加入toggle函数,通过flag记录当前的状态是连续点头还是撅嘴:

function toggle() {
if (flag) {
icon.gotoAndPlay(0);
}
else {
icon.gotoAndPlay(19);
}
flag = !flag;
}

window.onkeydown = function (event) {
if (event.keyCode == 13) {
toggle();
}
};

然后,绑定 icon 的另一个事件 onAnimationEnd

icon.onAnimationEnd = function () {
icon.paused = true;
icon.currentFrame = 31;
}

这个事件会在动画播放到最后一帧时触发,即第32帧时,我们在这个事件中要处理的就是让动画暂停下来,同时让动画停留在第32帧。

再次保存刷新页面,我们的动画就大功告成了!
DEMO演示链接

总结

以上就是我们对EaselJS脚本库制作动画的一个简单实践。通过这次实践,我们会发现其实动画无非是图片的快速连续播放,而帧的概念、多帧图片合并(sprites)的方法,让动画制作更加简单,我们结合节拍器对动画的每一帧进行控制。除了EaselJS,类似的Canvas脚本库还有一些,这个是我觉得相对简单易懂的。在此推荐给各位!

这应该是我今年最后一篇技术博客了,明年我会继续坚持写博客,多多写一些技术类的文章,多多跟大家分享和探讨HTML5。最后预祝大家,尤其是诸位技术宅男们,新年快乐!工作顺利!

以上