這篇開始來講Starling裡的Animation。Juggle是個簡單的Class,用來控制動畫的進行。他負責管理經由add()加進來的實現IAnimatable介面的物件,然後當Juggler的advanceTime()被呼叫時,它會負責去呼叫這些IAnimatable的advanceTime(),讓動畫進行下去;而當某個IAnimatable到達complete狀態時,則會被Juggler踢出去。我們就只要負責每個frame去呼叫Juggler的advanceTime()就好。而Starling class裡有個預設的juggler,當Starling.current正在運行時,Starling.juggler在每個frame時會自動被呼叫advanceTime()。通常我們把遊戲裡的動畫加到Starling.juggler裡,而一些特殊的動畫,例如遊戲暫停時要撥放的動畫,再加到另一個我們新增的Juggler,然後每個frame去呼叫它的advanceTime()。這裡講的每個frame,我們是使用EnterFrameEvent.ENTER_FRAME,而不是Event.ENTER_FRAME,因為EnterFrameEvent可以取得passedTime,這個passTime是指跟上一次事件發生經過的時間,可以傳給Juggle的advanceTime()的第一個參數。用經過時間來播放動畫,這樣就不會受frame數不穩定而影響動畫撥放的時間。

而要實現IAnimatable介面,只要實作advanceTime()這個方法,並且要設定一個complete條件,當達到這個條件時將自己的isComplete設為true,這樣就可以自動被Juggle移除。在Starling裡面,實現IAnimatable介面的除了Juggle以外,目前還有三種:Tween、DelayedCall以及MovieClip。接下來我們先來談前兩個。Tween的概念跟native的Tween或其他Tween API類似。Tween建構式可傳入三個參數,第一個是要產生動畫的目標,第二個是時間,第三個是transition,也就是ease function。transition可以查一下Transition Class,目前支援的function比起TweenMax這類的API要少得多,看看之後會不會新增,或者有沒有Extension可以用。新增了一個Tween之後,接著要設定要被改變的屬性。一般的數值型屬性可以使用animate()來設定,第一個參數是屬性名稱,使用字串來輸入,例如"x","rotation"等;第二個是目標值,例如0.5,20等等。常用的位移,改變大小,改變alpha值分別有對應的方法可以使用。也有onStart,onUpdate,onComplete等function可以設定。設定完Tween就使用Juggler的add將tween加進動畫執行。

DelayCall,顧名思義就是過一定時間之後再去呼叫某function。DelayedCall的建構式,第一個指定要call的function,第二個是delay時間,第三個是function需要的參數,用一個Array依序填入。設定好一樣要加到Juggler才會跑。

我們來寫個範例,在場景上放一個Button跟一個Image,當這個Button triggered,產生一個Tween去讓Image做些動畫,這個Tween我們交給Starling.juggler自動執行。當這個Tween執行完,我們新增一個DelayedCall,讓它停一小段時間之後,呼叫一個function,讓Image與Button回到原來的狀態。而這個DelayCall我們故意加到一個我們新增的Juggler,然後監聽EnterFrameEvent.ENTER_FRAME去呼叫這個Juggler的advanceTime()。程式碼如下:

publicclassGame6extendsSprite
{
  privatevar _container:Sprite;
  privatevar _image:Image;
  privatevar _button:Button;
  [Embed(source ="/assets/btnBg.png")]
  privatestaticconstBtnBitmap:Class;
  [Embed(source ="/assets/btnDownBg.png")]
  privatestaticconstBtnDownBitmap:Class;
  [Embed(source ="/assets/head.png")]
  privatestaticconstHeadBitmap:Class;
  privatevar _juggler:Juggler;
 
  publicfunctionGame6()
  {
    super();
    addEventListener(Event.ADDED_TO_STAGE, init);
  }
 
  privatefunction init(e:Event):void
  {
    removeEventListener(Event.ADDED_TO_STAGE, init);
 
    _container =newSprite();
    addChild(_container);
    addChild(newStats());
 
    //新增一個Juggler
    _juggler =newJuggler();
   
    //新增一個Image
    _image =newImage(Texture.fromBitmap(newHeadBitmap()));
    _image.x =300;
    _image.y =200;
    _image.pivotX = _image.width >>1;
    _image.pivotY = _image.height >>1;
    _container.addChild(_image);
 
    //新增一個Button
    var btnTexture:Texture=Texture.fromBitmap(newBtnBitmap());
    var btnDownTexture:Texture=Texture.fromBitmap(newBtnDownBitmap());
    _button =newButton(btnTexture,"Tween", btnDownTexture);
    _button.x =200;
    _button.y =30;
    _container.addChild(_button);
    _button.addEventListener(Event.TRIGGERED, buttonTriggered);//監聽_button triggered事件
  }
 
  privatefunction buttonTriggered(e:Event):void
  {
    _button.enabled =false;//_button disable
    var tween:Tween=newTween(_image,2,Transitions.EASE_OUT_BOUNCE);//新增一個Tween,控制_image
    tween.animate("rotation",Math.PI /2);//增加旋轉動畫
    tween.moveTo(300,400);//增加位移動畫
    tween.fadeTo(0.5);//改變alpha
    tween.scaleTo(0.5);//改變大小
    tween.onComplete = tweenComplete;//結束時呼叫tweenComplete
    Starling.juggler.add(tween);//將tween加到Starling.juggler自動執行
  }
 
  privatefunction tweenComplete():void
  {
    var delayedCall:DelayedCall=newDelayedCall(imageBack,0.5);//新增一個DelayedCall,過0.5秒呼叫imageBack()
    //Starling.juggler.add(delayedCall);//可以直接加到Starling.juggler自動執行,但我們故意加到新增的_juggler
    _juggler.add(delayedCall);//將delayedCall加到_juggler
    addEventListener(EnterFrameEvent.ENTER_FRAME, onEnterFrame);//要手動監聽EnterFrameEvent.ENTER_FRAME,去呼叫_juggle.advanceTime()
  }
 
  privatefunction onEnterFrame(e:EnterFrameEvent):void
  {
    _juggler.advanceTime(e.passedTime);//手動執行_juggler.advanceTime(),將e.passedTime傳入
  }
 
  privatefunction imageBack():void
  {
    removeEventListener(EnterFrameEvent.ENTER_FRAME, onEnterFrame);//移除監聽
    //讓image回到原來狀態,_button enable
    _image.x =300;
    _image.y =200;
    _image.alpha =1;
    _image.rotation =0;
    _image.scaleX = _image.scaleY =1;
    _button.enabled =true;
  }
}

Demo如下:

http://dl.dropbox.com/u/9231233/blog/111116_starling_ianimatable/index.html

一起來玩鳥 Starling Framework(6)Juggler、Tween、以及DelayCall的更多相关文章

  1. 一起來玩鳥 Starling Framework 簡介

    開場 Starling Framework是一套Flash 2D遊戲開發"工具",是使用Flash最新的Stage3D API建構出來的一套Framework.最大優點在於使用GP ...

  2. 一起來玩鳥 Starling Framework(5)Multi-Touch

    這篇來談談Starling的Multi-Touch.前一篇也提到,Multi-Touch一樣是監聽TouchEvent.TOUCH,然後由TouchEvent的e.getTouches()取回多點的資 ...

  3. 一起來玩鳥 Starling Framework(2)效能測試以及Image與Texture

    上一篇我們放了一個Quad與TextField在舞台上慢慢轉.眼尖的可能會發現轉起來邊緣有點鋸齒,這可以透過設定Starling的反鋸齒來解決,在Main.as裡,新增了_starling之後,可以加 ...

  4. 一起來玩鳥 Starling Framework(1)一定要的Hello World!

    雖然已經一堆Hello World的介紹文章跟影片了,但中文資料畢竟是比較少,所以不能免俗的來一篇中文版Hello World.首先開啟一個AS3.0專案,fps不用客氣,設為60,Starling很 ...

  5. 一起來玩鳥 Starling Framework(7)MovieClip

    承上一篇,我們接著來講最後一個IAnimatable類別,MovieClip.Starling的MovieClip跟native的MovieClip不太一樣,它只能接收一個Vector.<Tex ...

  6. 一起來玩鳥 Starling Framework(9)Particle

    最後,來看看Starling裡一個很炫的功能:Particle.Particle屬於extension,所以要另外下載檔案:Starling-Extension-Particle-System.下載之 ...

  7. 一起來玩鳥 Starling Framework(4)TouchEvent,Touch,以及TouchPhase

    這一篇來介紹一下TouchEvent.我們先來談單點的touch,下一篇再介紹MultiTouch.翻過Starling文件的應該會發現,Starling裡面沒有MouseEvent,而是整合在Tou ...

  8. 一起來玩鳥 Starling Framework(3)Button!

    週末夜來介紹個簡單的DisplayObject就好.不論是在電腦上或行動裝置上,跟使用者互動次數最多的,大概就是按鈕了.因此,Starling有個Button類別,來做出這個常用的互動元件. 同樣是因 ...

  9. 一起來玩鳥 Starling Framework(8)BitmapFont

    所謂BitmapFont,就是事先將我們會用到的字型,會用到的字,輸出成一張圖片,類似Sprite sheet,以及一個xml格式的Data file,然後我們一次將這文字圖片轉成Texture,up ...

随机推荐

  1. 如何利用好chrome控制台这个神器好好调试javascript代码

    上面的文章已经大致介绍了一下console对象具体有哪些方面以及基本的应用,下面简单介绍一下如何利用好chrome控制台这个神器好好调试javascript代码(这个才是我们真正能用到实处的地方) 1 ...

  2. Quorum一致性协议

    Quorum一致性协议 一个分布式数据库系统中通常是一系列密切关联的操作组成完整的系统. 分布式系统最基本的要保证一致性, 分区性通常是无法避免的, 在这种情况下尽力通过软件协议做到最大可用性. 根据 ...

  3. 设置iSCSI的发起程序(客户端)(三)

    iSCSI 发起程序是一种用于同 iSCSI 目标器认证并访问服务器上共享的LUN的客户端.我们可以在本地挂载的硬盘上部署任何操作系统,只需要安装一个包来与目标器验证. 初始器客户端设置 功能 可以处 ...

  4. D - Interesting Calculator 【数值型BFS+优先队列】

    There is an interesting calculator. It has 3 rows of buttons. Row 1: button 0, 1, 2, 3, ..., 9. Pres ...

  5. lca最短公共祖先模板(hdu2586)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2586 #include<iostream> #include<cstdio> ...

  6. AxureRP7超强部件库打包下载

    摘要: 很多刚刚开始学习Axure的朋友都喜欢到网上搜罗各种部件库(组件库)widgets library ,但是网络中真正实用的并且适合你使用的少之又少,最好的办法就是自己制作适合自己工作内容的部件 ...

  7. luogu P3305 [SDOI2013]费用流

    题目链接 bz似乎挂了... luogu P3305 [SDOI2013]费用流 题解 dalao告诉我,这题 似乎很水.... 懂了题目大意就可以随便切了 问1,最大流 问2,二分最大边权求,che ...

  8. 5.6(java学习笔记) queue

    一.queue接口 queue的中文意思是队列,是一种以先进先出方式处理数据的集合. 队列还提供额外的插入.提取和检查操作.这些方法都以两种形式存在:一种在操作失败时抛出异常,另一种返回特殊值(根据操 ...

  9. TZOJ 5347: 数据结构实验:删除链表元素

    描述 完成链表的创建.元素查找和删除等操作. 部分代码已经给出,请补充完整,提交时请勿包含已经给出的代码. void PrintLinkList(Node *head) { int flag = 0; ...

  10. Problem R: 零起点学算法13——求2个时间之间的分钟数

    #include<stdio.h> int main() { int a1,b1,a2,b2,s; scanf("%d:%d",&a1,&b1); sc ...