>[warning]## 制作动画或小游戏——CreateJS基础类
>
* * * * *
<div class = "post">
<div id="cnblogs_post_body" class="blogpost-body"><p>前面曾经记录过Canvas的基础知识《<span style="color: #3366ff;"><a href="http://www.cnblogs.com/strick/p/5310787.html" target="_blank"><span style="color: #3366ff;">让自己也能使用Canvas</span></a></span>》,在实际使用中,用封装好的库效率会高点。</p>
<p>使用成熟的库还能对基础知识有更深入的理解,CreateJS是基于HTML5开发的一套模块化的库和工具,有4个模块,<span style="color: #3366ff;"><a href="https://github.com/CreateJS" target="_blank"><span style="color: #3366ff;">github地址在这里</span></a></span>。</p>
<p>最近看到有个<span style="color: #3366ff;"><a href="http://www.createjs.cc/" target="_blank"><span style="color: #3366ff;">中文网</span></a></span>,很多API都翻译了出来,不过就是翻译的比较生硬。</p>
<p>我参考了国外写的一本书《<span style="color: #3366ff;"><a href="http://download.csdn.net/download/loneleaf1/9487928" target="_blank"><span style="color: #3366ff;">HTML5.Games.with.CreateJS</span></a></span>》,再根据自己的一些理解整理了一下这个库的使用。</p>
<p>下面所有的demo代码都可以在<span style="color: #3366ff;"><a href="http://codepen.io/strick/pen/BKYdRP" target="_blank"><span style="color: #3366ff;">这里查看到</span></a></span>。</p>
<p> </p>
<h1>一、Stage</h1>
<p><span style="color: #3366ff;"><a href="http://www.createjs.cc/easeljs/docs/classes/Stage.html" target="_blank"><span style="color: #3366ff;">Stage</span></a></span>(舞台)就是展现图形、执行动画的地方,必须先创建Stage,然后才能做后续操作。</p>
<p>有两种方式的初始化:</p>
<div class="cnblogs_code">
<pre>stage = <span style="color: #0000ff;">new</span> createjs.Stage(document.getElementById('canvas'<span style="color: #000000;">));
stage </span>= <span style="color: #0000ff;">new</span> createjs.Stage('canvas');<span style="color: #008000;">//</span><span style="color: #008000;">直接使用canvas的ID</span></pre>
</div>
<p>接下来就是添加图形等布置操作,等到你布置好舞台后,就需要调用“update”方法,展示新的舞台内容。</p>
<div class="cnblogs_code">
<pre>stage.update();</pre>
</div>
<p> </p>
<h1>二、Ticker</h1>
<p><span style="color: #3366ff;"><a href="http://www.createjs.cc/easeljs/docs/classes/Ticker.html" target="_blank"><span style="color: #3366ff;">Ticker</span></a></span>类是一个定时器,主要就是定时刷新舞台,理想的帧速率是60FPS,在这个类中也可以手动的修改这个速度。</p>
<div class="cnblogs_code">
<pre><span style="color: #0000ff;">var</span><span style="color: #000000;"> stage;
</span><span style="color: #0000ff;">function</span><span style="color: #000000;"> init() {
stage </span>= <span style="color: #0000ff;">new</span> createjs.Stage('canvas');<span style="color: #008000;">//</span><span style="color: #008000;">直接使用canvas的ID</span>
createjs.Ticker.addEventListener("tick"<span style="color: #000000;">, runGame);
createjs.Ticker.setFPS(</span>60<span style="color: #000000;">);
}
</span><span style="color: #0000ff;">function</span><span style="color: #000000;"> runGame(e) {
stage.update();
}</span></pre>
</div>
<p>如果想控制“runGame”中的刷新,可以设置暂停。</p>
<p>“setPaused”方法可以修改“e”中的“<span style="color: #808080;">paused</span>”属性。</p>
<div class="cnblogs_code">
<pre>createjs.Ticker.setPaused(<span style="color: #0000ff;">true</span><span style="color: #000000;">);
</span><span style="color: #0000ff;">function</span><span style="color: #000000;"> runGame(e) {
</span><span style="color: #0000ff;">if</span>(!<span style="color: #000000;">e.paused)
stage.update();
}</span></pre>
</div>
<p> </p>
<h1>三、Graphics</h1>
<p><span style="color: #008000;"><strong><span style="font-size: 16px;">1)初始化方式</span></strong></span></p>
<p>接下来可以画一些图出来,<span style="color: #3366ff;"><a href="http://www.createjs.cc/easeljs/docs/classes/Graphics.html" target="_blank"><span style="color: #3366ff;">Graphics</span></a></span>类可以画矢量图(vector)或位图(bitmap)。</p>
<div class="cnblogs_code">
<pre><span style="color: #0000ff;">var</span> g = <span style="color: #0000ff;">new</span><span style="color: #000000;"> createjs.Graphics();
g.beginStroke(</span>'#000'<span style="color: #000000;">);
g.beginFill(</span>'#FF6600'<span style="color: #000000;">);
g.drawRect(</span>0,0,100,100);</pre>
</div>
<p>也可以链式的写法。</p>
<div class="cnblogs_code">
<pre><span style="color: #0000ff;">var</span> g = <span style="color: #0000ff;">new</span> createjs.Graphics().beginStroke('#000').beginFill('#FF6600').drawRect(0,0,100,100);</pre>
</div>
<p>Graphics类仅仅提供了画图,但并不会显示,如果要显示,就需要“Shape”类的帮忙。</p>
<p> </p>
<p><span style="color: #008000;"><strong><span style="font-size: 16px;">2)简写</span></strong></span></p>
<p>Graphics类中的画图方法还有简写:</p>
<p><img src="https://images2015.cnblogs.com/blog/211606/201604/211606-20160412154438301-791242895.jpg" alt="" data-pinit="registered" /></p>
<p> </p>
<h1>四、Shape</h1>
<p><span style="color: #008000;"><strong><span style="font-size: 16px;">1)制作图形</span></strong></span></p>
<p>一旦你创建了一个<span style="color: #000000;">Graphics</span>类,你就需要<span style="color: #3366ff;"><a href="http://www.createjs.cc/easeljs/docs/classes/Shape.html" target="_blank"><span style="color: #3366ff;">Shape</span></a></span>类,下面的代码接上面的“g”。</p>
<div class="cnblogs_code">
<pre><span style="color: #0000ff;">var</span> square = <span style="color: #0000ff;">new</span><span style="color: #000000;"> createjs.Shape(g);
square.x </span>= square.y = 100<span style="color: #000000;">;
stage.addChild(square);</span></pre>
</div>
<p><img src="https://images2015.cnblogs.com/blog/211606/201604/211606-20160412152319879-849956821.jpg" alt="" data-pinit="registered" /></p>
<p>除了正方形,还可以有三角形、圆、多边形等,详细的代码可以在<span style="color: #3366ff;"><a href="http://codepen.io/strick/pen/BKYdRP" target="_blank"><span style="color: #3366ff;">这里看到</span></a></span>。</p>
<p><img src="https://images2015.cnblogs.com/blog/211606/201604/211606-20160412152537832-2122862430.jpg" alt="" data-pinit="registered" /></p>
<p> </p>
<p><span style="color: #008000;"><strong><span style="font-size: 16px;">2)简单的动画</span></strong></span></p>
<p>使用动画就会引入<span style="color: #3366ff;"><a href="http://www.createjs.cc/tweenjs/docs/modules/TweenJS.html" target="_blank"><span style="color: #3366ff;">TweenJS</span></a></span>模块,将会用到上面画正方形的Graphics代码,多了下面两句代码。</p>
<div class="cnblogs_code">
<pre><span style="color: #008000;">//</span><span style="color: #008000;">绕着图形中心滚动</span>
square.regX = square.regY = 50;<span style="color: #008000;">//</span><span style="color: #008000;">设置图形的X和Y轴位移 </span>
<span style="color: #000000;">createjs.Tween.get(square).to({
rotation: </span>360<span style="color: #000000;">
}, </span>3000);</pre>
</div>
<p><img src="https://images2015.cnblogs.com/blog/211606/201604/211606-20160412160531004-27622406.gif" alt="" data-pinit="registered" /></p>
<p> </p>
<h1>五、一个UI元素demo</h1>
<p>接下来制作一个常见的加载条,当年上传、打开某个程序或做其它操作经常能看到,详细代码可以<span style="color: #3366ff;"><a href="http://codepen.io/strick/pen/grewaR" target="_blank"><span style="color: #3366ff;">在这里查看到</span></a></span>。</p>
<p><img src="https://images2015.cnblogs.com/blog/211606/201604/211606-20160413213636926-75146437.jpg" alt="" /></p>
<p><span style="color: #008000;"><strong><span style="font-size: 16px;">1)制作过程</span></strong></span></p>
<p>先设置舞台,再创建创建加载条,最后用定时器累加加载条长度,其实也可以直接在Ticker事件中累加长度,只是速度会快一点。</p>
<div class="cnblogs_code">
<pre><span style="color: #0000ff;">function</span><span style="color: #000000;"> init() {
setupStage();</span><span style="color: #008000;">//</span><span style="color: #008000;">设置舞台</span>
buildLoaderBar();<span style="color: #008000;">//</span><span style="color: #008000;">创建加载条</span>
startLoad();<span style="color: #008000;">//</span><span style="color: #008000;">用定时器累加加载条长度</span>
}</pre>
</div>
<p>用链式写法来写更新长度的那段代码,“<span style="color: #808080;">updateLoaderBar</span>”是在“<span style="color: #808080;">startLoad</span>”函数中的。</p>
<div class="cnblogs_code">
<pre><span style="color: #0000ff;">function</span><span style="color: #000000;"> updateLoaderBar() {
loaderBar.graphics.beginFill(</span>'#00ff00').drawRect(0, 0, LOADER_WIDTH * percentLoaded, 40<span style="color: #000000;">).endFill();
loaderBar.graphics.setStrokeStyle(</span>2).beginStroke("#000").drawRect(0, 0, LOADER_WIDTH, 40<span style="color: #000000;">).endStroke();
}</span></pre>
</div>
<p>先是画里面的蓝色,再画边框。</p>
<p><span style="color: #3366ff;"><a href="http://www.createjs.cc/easeljs/docs/classes/Graphics.html#method_beginFill" target="_blank"><span style="color: #3366ff;">beginFill</span></a></span>和<span style="color: #3366ff;"><a href="http://www.createjs.cc/easeljs/docs/classes/Graphics.html#method_endFill" target="_blank"><span style="color: #3366ff;">endFill</span></a></span>组合使用了一下,endFill是指重新开始画,使得后面的设置不会影响当前的。</p>
<p>如果我去掉endFill,将会直接显示完整的绿色,因为后面的“<span style="color: #808080;">drawRect(0, 0, LOADER_WIDTH, 40)</span>”,又设置了一遍宽度。</p>
<p><img src="https://images2015.cnblogs.com/blog/211606/201604/211606-20160413220703301-608715166.jpg" alt="" /></p>
<p><span style="color: #3366ff;"><a href="http://www.createjs.cc/easeljs/docs/classes/Graphics.html#method_beginStroke" target="_blank"><span style="color: #3366ff;">beginStroke</span></a></span>和<span style="color: #3366ff;"><a href="http://www.createjs.cc/easeljs/docs/classes/Graphics.html#method_endStroke" target="_blank"><span style="color: #3366ff;">endStroke</span></a></span>组合使用,目的和上面的差不多。</p>
<p>如果把“endStroke”去掉,就会发现多了根右边框,之所以会多是前面的“<span style="color: #808080;">drawRect</span>”影响了展示。</p>
<p><img src="https://images2015.cnblogs.com/blog/211606/201604/211606-20160413222118988-703939014.jpg" alt="" /></p>
<p> </p>
<p><span style="color: #008000;"><strong><span style="font-size: 16px;">2)一点小改造</span></strong></span></p>
<p>后面再观察一下发现,其实可以不用每次来画边框,边框可以在“<span style="color: #808080;">buildLoaderBar</span>”函数中定义。</p>
<div class="cnblogs_code">
<pre><span style="color: #0000ff;">function</span><span style="color: #000000;"> buildLoaderBar() {
loaderBar </span>= <span style="color: #0000ff;">new</span><span style="color: #000000;"> createjs.Shape();
loaderBar.x </span>= loaderBar.y = 100<span style="color: #000000;">;
loaderBar.graphics.setStrokeStyle(</span>2).beginStroke("#000").drawRect(0, 0, LOADER_WIDTH, 40<span style="color: #000000;">).endStroke();
stage.addChild(loaderBar);
}</span></pre>
</div>
<p>相应的“<span style="color: #808080;">updateLoaderBar</span>”函数也要做些修改,<span style="color: #3366ff;"><a href="http://www.createjs.cc/easeljs/docs/classes/Graphics.html#method_drawRect" target="_blank"><span style="color: #3366ff;">drawRect</span></a></span>中的X、Y坐标要修改下,宽度也要改变下。</p>
<p>本来以为设置了边宽为2,那么也要偏移2,但其实不是,只需要偏移1就行了。</p>
<div class="cnblogs_code">
<pre><span style="color: #0000ff;">function</span><span style="color: #000000;"> updateLoaderBar() {
loaderBar.graphics.beginFill(</span>'#00ff00').drawRect(1, 1, LOADER_WIDTH * percentLoaded - 2, 38<span style="color: #000000;">).endFill();
}</span></pre>
</div>
<p>如果我把边框的宽度改成4,偏移和宽度又要重新计算了,怪不得写在里面,就方便多了。</p>
<p> </p></div><div id="MySignature"></div>
<div class="clear"></div>
<div id="blog_post_info_block">
<div id="BlogPostCategory"></div>
<div id="EntryTag"></div>
<div id="blog_post_info">
</div>
<div class="clear"></div>
<div id="post_next_prev"></div>
</div>
- 序言
- 第一章、基础引擎
- 第二章、了解API,开始写动画
- 第三章、从文档到动画(1)
- demo1源码
- demo2源码
- demo3源码
- demo4源码
- 第四章、从文档到动画(2)
- 第五章、从文档到动画(3)
- 第六章、精灵Sprite类和简明动画(1)
- 第七章、精灵图片的制作-奔跑的马儿
- 第八章、野人大冒险(项目实战)
- 第九章、绘制动画走秀
- 第十章、createjs的位图渲染(非常重要)
- 第十一章、createjs绘制视频
- 第十二章、createjs与animateCC协作6
- 第十三章、createjs与animateCC协作5
- 十四章、createjs与animateCC协作4
- 十五章、createjs与animateCC协作3
- 十六章、createjs与animateCC协作2
- 十七章、createjs与animateCC协作1
- 十八章、前端转做createjs的误区
- 十九、createjs与白鹭和laya的性能比较
- 二十、createjs近期发现的坑与解决办法
- 二十一、createjs推出新版本stageGL
- 二十二、createjs强制横屏方法
- 二十三、get、set以及简单的封装
- 二十四、createjs新手教程-前端向
- 二五、阻止createjs鼠标穿透的方法
- 二六、Creatine-createjs的游戏引擎
- 二七、createjs性能实测与性能优化实测
- 二八、createjs手势解锁效果demo
- 二九、给createjs新手的一点建议
- 三十、createjs进阶—sprite精灵图2
- 三一、createjs进阶—sprite精灵图1
- 三二、createjs性能优化(持续更新)
- 三三、createjs帧频显示代码
- 三四、createjs做的移动端展示站
- 三五、createjs进阶—createjs的OOP
- 三六、新手写createjs时容易遇到的坑
- 三七、createjs基础教程2-flashcc
- 三八、createjs基础教程1-flashcc
- 三九、stagegl的用法介绍和注意事项
- 四十、stagegl性能实测
- 四一、算法的艺术(附算法特效demo)
- 四二、来一波硬货,常用类
- 四三、面向canvas,更加简单的自适应方式
- 思思、再讲讲自适应-移动端自适应
- 四五、有关遮罩和图层叠加的问题(附刮刮卡demo)