2013-05-31 76 views
0

我正在使用嵌入式SWF的Air 2.6項目。gotoAndPlay嵌入式動畫片段

我使用下面的嵌入代碼:

[Embed(source = "../../assets/click_feedback.swf", symbol="sub_circle")] 
    [Bindable] 
    public static var click_feedback:Class; 

而下面的代碼來獲取click_feedback類的一個實例:

private var cfb:MovieClip = new Assets.click_feedback() as MovieClip 

的問題是:

資產sub_circle有一個標籤爲「迴應」的框架。但是,無論標籤是否使用gotoAndPlay調用,它都會不停地播放。

而且,在動畫結束時,會出現一個名爲Event.COMPLETE的代碼,它不會被我的代碼拾取。

我已經測試了CS5中創建它的sub_circle資產,並且在該環境中它不會動畫,直到調用'respond',並且它的觸發事件可以被我的腳本聽到。

這是從SWF處理嵌入資產的正確方法嗎?

回答

0

從一般SWF單獨符號的嵌入是不是一個好主意:

  1. 它減慢你的項目的編譯,因爲編譯器必須轉碼SWF格式。
  2. 嵌入從時間線中刪除所有AS代碼(我沒有檢查,但可能是它刪除了標籤,也可能是您的問題的原因)。

我建議嵌入孔swf文件並加載它字節在運行時,多一點的代碼來處理異步加載,但更多的自由和靈活性在使用中:

  1. 您的安全,所有的AS3代碼
  2. 您可以選擇ApplicationDomain在哪裏加載類
  3. 如果您想要將代碼和藝術/聲音資產分開,您可以隨時輕鬆地通過網址從嵌入轉換爲運行時swf。
  4. 整理資產庫與AssetsManager(與API像load(ByteArray or URL)getSkin(name):DisplyObject

適合您的資產代碼示例:

package 
{ 
import flash.display.DisplayObject; 
import flash.display.Loader; 
import flash.display.MovieClip; 
import flash.display.Sprite; 
import flash.display.StageAlign; 
import flash.display.StageScaleMode; 
import flash.events.Event; 
import flash.system.ApplicationDomain; 
import flash.system.LoaderContext; 
import flash.utils.ByteArray; 

[SWF(width="800", height="200", backgroundColor="0x8B8B8B")] 
public class astest extends Sprite 
{ 
    [Embed(source="../../assets/click_feedback.swf", mimeType="application/octet-stream")] 
    private static const common_art:Class; 

    private var loader:Loader; 
    private var domain:ApplicationDomain = ApplicationDomain.currentDomain; 

    public function astest() 
    { 
     init(); 
    } 

    public function init():void 
    { 
     stage.scaleMode = StageScaleMode.NO_SCALE; 
     stage.align = StageAlign.TOP_LEFT; 

     var loaderContext:LoaderContext = new LoaderContext(false, domain); 
     loaderContext.allowCodeImport = true; 
     loader.loadBytes(new common_art() as ByteArray, loaderContext); 
    } 

    private function onLoaded(event:Event):void 
    { 
     var clip:MovieClip = getSkin("sub_circle") as MovieClip; 
     addChild(clip); 
    } 

    private function getSkin(name:String):DisplayObject 
    { 
     if(domain.hasDefinition(name)) 
     { 
      var clazz:Class = domain.getDefinition(name) as Class; 
      return new clazz() as DisplayObject; 

     } 

     return null; 

    } 
} 
} 
+0

感謝。 HOwever,我得到這個錯誤'[Fault] exception,information = SecurityError:Error#3226:當LoaderContext.allowCodeImport爲false時無法導入SWF文件。'有任何想法嗎? –

+1

只是將_LoaderContext.allowCodeImport_標誌設置爲_true_)我更新了代碼(在as3項目中測試過,所以錯過了這個) – fsbmain

+0

謝謝fsbmain。現在完美運作。 –