>[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)