0

我正在开发一个带有嵌入式 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 有一个标有“响应”的框架。但是,无论是否使用 gotoAndPlay 调用标签,它都会不停地播放。

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

我已经在我构建它的 CS5 中测试了 sub_circle 资产,并且在那个环境中,它在调用“响应”之前不会动画,并且它触发的事件可以被我的脚本听到。

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

4

1 回答 1

0

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

  1. 它会减慢项目的编译速度,因为编译器必须转码 swf 格式。
  2. 嵌入从时间线中删除所有 AS 代码(我没有检查,但也可能是删除标签,这可能是您的问题的原因)。

我建议嵌入hole swf文件并在运行时加载它的字节,多一点代码来处理异步加载,但使用起来更加自由和灵活:

  1. 你保护所有 as3 代码
  2. 您可以选择 ApplicationDomain 在哪里加载类
  3. 如果您想将 as 代码和艺术/声音资产分开,您可以随时轻松地从嵌入切换到通过 url 加载运行时 swf。
  4. 使用 AssetsManager 将您的资产组织到库中(使用 api like 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;

    }
}
}
于 2013-05-31T08:16:52.187 回答