>[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>&nbsp;</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>接下来就是添加图形等布置操作,等到你布置好舞台后,就需要调用&ldquo;update&rdquo;方法,展示新的舞台内容。</p> <div class="cnblogs_code"> <pre>stage.update();</pre> </div> <p>&nbsp;</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>如果想控制&ldquo;runGame&rdquo;中的刷新,可以设置暂停。</p> <p>&ldquo;setPaused&rdquo;方法可以修改&ldquo;e&rdquo;中的&ldquo;<span style="color: #808080;">paused</span>&rdquo;属性。</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>&nbsp;</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类仅仅提供了画图,但并不会显示,如果要显示,就需要&ldquo;Shape&rdquo;类的帮忙。</p> <p>&nbsp;</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>&nbsp;</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>类,下面的代码接上面的&ldquo;g&rdquo;。</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>&nbsp;</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>&nbsp;</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>用链式写法来写更新长度的那段代码,&ldquo;<span style="color: #808080;">updateLoaderBar</span>&rdquo;是在&ldquo;<span style="color: #808080;">startLoad</span>&rdquo;函数中的。</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,将会直接显示完整的绿色,因为后面的&ldquo;<span style="color: #808080;">drawRect(0, 0, LOADER_WIDTH, 40)</span>&rdquo;,又设置了一遍宽度。</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>如果把&ldquo;endStroke&rdquo;去掉,就会发现多了根右边框,之所以会多是前面的&ldquo;<span style="color: #808080;">drawRect</span>&rdquo;影响了展示。</p> <p><img src="https://images2015.cnblogs.com/blog/211606/201604/211606-20160413222118988-703939014.jpg" alt="" /></p> <p>&nbsp;</p> <p><span style="color: #008000;"><strong><span style="font-size: 16px;">2)一点小改造</span></strong></span></p> <p>后面再观察一下发现,其实可以不用每次来画边框,边框可以在&ldquo;<span style="color: #808080;">buildLoaderBar</span>&rdquo;函数中定义。</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>相应的&ldquo;<span style="color: #808080;">updateLoaderBar</span>&rdquo;函数也要做些修改,<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>&nbsp;</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>