专栏首页游戏杂谈as3加载外部资源

as3加载外部资源

在as3的开发中,经常会加载外部共用资源,比如某一个公用的图片或者其它小特效。这时候为了避免重复请求,一般会将这些资源放在一个fla文件中,为每一个资源添加链接。这里以一张图片为例(flower.fla):

这样就生成了一个名为flower.swf文件,将其放在b.com域下,访问路径为:http://b.com/swf/flower.swf

新建一个名为main.fla文件,如果是在fla内加载flower.swf文件,可以这样定义(本地加载文件,不需要设置LoaderContext的securityDomain属性,否则会报错):

ldr = new Loader();
var url:String = 'http://b.com/swf/flower.swf';
var req:URLRequest = new URLRequest(url);
var ldrContext:LoaderContext = new LoaderContext(false, new ApplicationDomain(ApplicationDomain.currentDomain));

ldr.contentLoaderInfo.addEventListener(Event.COMPLETE, onCompleteHandler);
ldr.load(req, ldrContext);

如果需要获取MyFlower这个类

var MyFlower:Class = ldr.contentLoaderInfo.applicationDomain.getDefinition('MyFlower') as Class;

trace(MyFlower + '--' + ApplicationDomain.currentDomain.hasDefinition('MyFlower'));

var bmpData:BitmapData = new MyFlower(359, 629);
var bmp:Bitmap = new Bitmap();
bmp.bitmapData = bmpData;
bmp.x = 0;
bmp.y = 0;

addChildAt(bmp, 0);

因为使用的是子域名加载(new ApplicationDomain(ApplicationDomain.currentDomain)),所以使用当前域ApplicationDomain.currentDomain,是不能获得到MyFlower类的定义。而loader.contentLoaderInfo.applicationDomain无论是以:当前域(ApplicationDomain.currentDoamin)、子域(new ApplicationDomain(ApplicationDoamin.currentDomain))、新域(new ApplicationDomain()),都可以访问到加载的swf。

如果main.swf与flower.swf属于同一域则不需要设置ldrContext的securityDomain属性,而假设main.swf放在a.com下,而flower.swf放在b.com域下,则需要设置该属性(ldrContext.securityDomain = SecurityDomain.currentDomain;)。否则在访问加载的swf时,会报安全沙箱冲突,而main.swf在第一次加载flower.swf时,会先加载b.com根目录下的crossdomain.xml(http://b.com/crossdomain.xml)文件。

完整的Main.as(舞台上先放置了一个从库里拖拽出来的button,而且取消了“自动声明舞台实例”)

package 
{
    import flash.display.Sprite;
    import fl.controls.Button;
    import flash.events.*;
    import flash.display.Loader; 
    import flash.net.URLRequest; 
    import flash.system.ApplicationDomain; 
    import flash.system.LoaderContext; 
    import flash.display.BitmapData;
    import flash.display.Bitmap;
    import flash.system.SecurityDomain;
    import flash.external.ExternalInterface;
            
    public class Main extends Sprite
    {
        public var loadBtn:Button;
        private var ldr:Loader; 
                
        public function Main() 
        {
            initView();
        } 
        
        private function initView():void
        {
            loadBtn.label = '加载swf';
            
            loadBtn.addEventListener(MouseEvent.CLICK, onClickHandler);
        }
        
        private function onClickHandler(evt:MouseEvent):void
        {
            if (ldr == null)
            {
                ldr = new Loader();
                
            }
            
            var url:String = 'http://b.com/swf/flower.swf';
            var req:URLRequest = new URLRequest(url);
            var ldrContext:LoaderContext = new LoaderContext(false, new ApplicationDomain(ApplicationDomain.currentDomain));
            ldrContext.securityDomain = SecurityDomain.currentDomain;
                
            ldr.contentLoaderInfo.addEventListener(Event.COMPLETE, onCompleteHandler);
            ldr.load(req, ldrContext);
        }
        
        private function onCompleteHandler(evt:Event):void
        {
            var MyFlower:Class = ldr.contentLoaderInfo.applicationDomain.getDefinition('MyFlower') as Class;
            
            trace(MyFlower + '--' + ApplicationDomain.currentDomain.hasDefinition('MyFlower'));
            
            var bmpData:BitmapData = new MyFlower(359, 629);
            var bmp:Bitmap = new Bitmap();
            bmp.bitmapData = bmpData;
            bmp.x = 0;
            bmp.y = 0;
            
            addChildAt(bmp, 0);
        }
    
    }
}

点击“加载swf”按钮后,最终的效果图:

有兴趣可以扩展阅读更多(很经典的文章):

教程:深入理解Flash的沙箱 – Application Domains

教程:深入理解Flash的沙箱 – Security Domains

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Flex + XML的图片轮显

    逻辑部分与JavaScript有些类似,在解析XML时,单独写了一个as类来处理,btn的外观使用了CSS进行控制,资源全部放在名为assets文件夹目录下,工...

    meteoric
  • flex+php截图Demo

    一、直接将byteArray转为bitmap通过loader(flash.display.Loader)显示在舞台上;

    meteoric
  • JavaScript检测flash player的版本号

    meteoric
  • win10 uwp 使用 asp dotnet core 做图床服务器客户端 服务器端客户端

    本文告诉大家如何在 UWP 做客户端和 asp dotnet core 做服务器端来做一个图床工具

    林德熙
  • Java新特性:数据类型可以扔掉了?

    然而到了 JDK 10 时,我们就有了新的选择,JDK 10 中新增了 var 局部变量推断的功能,使用它我们可以很 happy 的忘记数据类型这件事了,那它是...

    macrozheng
  • Java新特性:数据类型可以扔掉了?

    然而到了 JDK 10 时,我们就有了新的选择,JDK 10 中新增了 var 局部变量推断的功能,使用它我们可以很 happy 的忘记数据类型这件事了,那它是...

    Java中文社群-磊哥
  • Go教程:03-数据类型

    Go 语言数据类型包含基础类型和复合类型两大类. 基础数据类型包括:布尔型、整型、浮点型、复数型、字符型、字符串型、错误类型. 复合数据类型包括:指针、数组、切...

    mojocn
  • [UWP]用Win2D实现镂空文字

    后来试玩了Win2D,这次就用Win2D实现文字的镂空效果,配合PointLight做一个内敛不张扬的番茄钟。

    dino.c
  • shell中的括号(小括号,中括号,大括号)

        ①命令组。括号中的命令将会新开一个子shell顺序执行,所以括号中的变量不能够被脚本余下的部分使用。括号中多个命令之间用分号隔开,最后一个命令可以没有...

    雪影
  • 2018网络创业项目:速成应用小程序开发制作代理

    速成应用小程序工具平台、海量行业模板,可视化编辑工具、小程序可视化编辑工具!在线拖拉组件,全自主布局,基于微信UI设计规则的产品架构,成熟的模板套用,一键生成小...

    速成应用小程序

扫码关注云+社区

领取腾讯云代金券