嵌入式动画片段中的gotoAndPlay

时间:2013-05-31 07:41:16

标签: actionscript-3 flex air

我正在开发一个带有嵌入式SWF的Air 2.6项目。

我正在使用以下嵌入代码:

[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有一个标有'respond'的框架。但是,无论是否使用gotoAndPlay调用标签,它都会不停地播放。

并且,在动画结束时,调用了一个Event.COMPLETE,我的代码没有接收到它。

我已经在我构建它的CS5中测试了sub_circle资产,并且在该环境中它不会动画直到调用'respond',并且我的脚本可以听到它触发的事件。

这是从SWF处理嵌入资产的正确方法吗?

1 个答案:

答案 0 :(得分:0)

从swf中嵌入单独的符号通常不是一个好主意:

  1. 它减慢了项目的编译速度,因为编译器必须转换swf格式。
  2. 从时间轴中嵌入删除所有AS代码(我没有检查,但也可能会删除标签,这可能是您出问题的原因)。
  3. 我建议嵌入hole swf文件并在运行时加载它的字节,稍微多一些代码来处理异步加载,但使用更加自由和灵活:

    1. 你安全的所有as3代码
    2. 您可以选择ApplicationDomain加载类的位置
    3. 如果您想将as代码和art / sounds资源分开,您可以随时轻松地从嵌入切换到运行时swf加载。
    4. 使用AssetsManager将资源整理到库中(使用api,如load(ByteArray or URL)getSkin(name):DisplyObject
    5. 适用于您资产的代码示例:

      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;
      
          }
      }
      }