我正在开发一个带有嵌入式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处理嵌入资产的正确方法吗?
答案 0 :(得分:0)
从swf中嵌入单独的符号通常不是一个好主意:
我建议嵌入hole swf文件并在运行时加载它的字节,稍微多一些代码来处理异步加载,但使用更加自由和灵活:
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;
}
}
}