xin's blog

Just have a little faith.
  首页  :: 管理

运行时共享库

Posted on 2010-12-05 16:00  greatxin  阅读(1145)  评论(0)    收藏  举报
有这么个情况, 如果美工做好一个素材, 编码员A做工程中的一个模块要用到这个素材, 编码员B做工程中的一个模块也用到这个素材, 而当各自的工程完工整合在一起后, 发现素材不好看需要更换素材, 这就悲剧了, 因为需要将素材分别派发给A,B两个编码员分别重新运行各自的工程然后再整合. 两个还看不出什么, 如果一个工程被分出五十份, 那就有的换了, 特别对于游戏中的面板, 基本风格都是统一的. 这就需要RSL上场了.
在文档类中, 将A, B两个项目文件同时显示出来, 它们均是一个面板 + 一段文字(以作区别). 面板是相同的.

 A.as


package

{

    import flash.display.Sprite;

    import flash.text.TextField;

    import ui.Form;

    

    public class Module extends Sprite

    {

        public 
function Module()

        {

            
var form:Form = new Form();

            
this.addChild(form);

            
var ttf:TextField = new TextField();

            form.addChild(ttf);

            ttf.text 
= "a";

        }

    }

}
 

 Form作为面板类, 如果不用RSL, 我们就不得不用美工做好的素材进行制作, 然后运行得到A.swf. 但是用了rsl这里就可以随便定义一个Form类, 因为它会被统一替换掉.

 B.as

package

{

    import flash.display.Sprite;

    import flash.text.TextField;

    

    public class ModuleB extends Sprite

    {

        public 
function ModuleB()

        {

            
var form:Form = new Form();

            
this.addChild(form);

            
var ttf:TextField = new TextField();

            form.addChild(ttf);

            ttf.text 
= "b";

        }

    }

}

 这里的Form和A的一样随便写, 无论什么样式, 保证不要有错误就行了, 因为后面在文档类中Form类会被替换掉.

 文档类

package

{

    import flash.display.DisplayObject;

    import flash.display.Loader;

    import flash.display.Sprite;

    import flash.events.Event;

    import flash.net.URLRequest;

    import flash.system.ApplicationDomain;

    import flash.system.LoaderContext;

    

    public class Main extends Sprite

    {

        private 
var _rslLoader:Loader;

        private 
var _rslURL:String = "rsl.swf";

        private 
var _loaderContext:LoaderContext;

        private 
var _appDomain:ApplicationDomain;

        
//

        private 
var _loader1:Loader;

        private 
var _loader2:Loader;

        private 
var _loader3:Loader;

        private 
var _url1:String = "module.swf";

        private 
var _url2:String = "moduleb.swf";

        

        public 
function Main()

        {

            
this.init();

        }

        
/**

         * 初始化

         
*/        

        private 
function init():void

        {

            
this._appDomain = new ApplicationDomain(ApplicationDomain.currentDomain);

            
this._loaderContext = new LoaderContext(falsethis._appDomain);

            
this._rslLoader = new Loader();

            
this._rslLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, complete_rslLoader);

            
this._rslLoader.load(new URLRequest(this._rslURL), this._loaderContext);

        }

        
/**

         * 加载rsl库

         
*/        

        private 
function complete_rslLoader(evt:Event):void

        {

            
this._loader1 = new Loader();

            
this._loader2 = new Loader();

            
this._loader1.contentLoaderInfo.addEventListener(Event.COMPLETE, complete_loader1);

            
this._loader2.contentLoaderInfo.addEventListener(Event.COMPLETE, complete_loader2);

            

            
this._loader1.load(new URLRequest(this._url1), this._loaderContext);

            
this._loader2.load(new URLRequest(this._url2), this._loaderContext);

        }

        
/**

         * 三个加载处理函数

         
*/        

        private 
function complete_loader1(evt:Event):void

        {

            
this.addChild(this._loader1 as DisplayObject);

        }

        private 
function complete_loader2(evt:Event):void

        {

            
this.addChild(this._loader2 as DisplayObject);

            
this._loader2.y = this._loader1.y + this._loader1.height + 2;

        }

        

    }

}

 这里首先加载了RSL.swf文件, 这个文件就是专门定义了那些共享的类文件, 比如要用到的Form.as, 在A.swf和B.swf文件中的Form.as类在文档类运行后会被RSL.swf中的Form替换掉.

 定义一个Form.as:


package

{

    import flash.display.Sprite;



    public class Form extends Sprite

    {

        public 
function Form()

        {

            
this.graphics.beginFill(0x00ff00);

            
this.graphics.drawRect(004020);

        }

    }

}

 

然后在rsl的main类中把这个类实例化一个实例出来:

 

package

{

    import flash.display.Sprite;

    

    public class RSL extends Sprite

    {

        public 
function RSL()

        {

            
var form:Form = new Form();

            trace(
"rsl>>new ");

        }

    }

}

 重要的是

1, 谁先加载进来, 它与后加载的swf文件有重复类使用的情况, 后加载的swf运行时都是使用首先加载进来的swf文件中的类. 这也就是rsl的好处所在, 可以把所有共享的类文件统一写在rsl.swf里, 然后将它首先加载进来就ok了. 避免了修改一个共享文件, 其他所有swf都要重新编译的麻烦.
2, 并不是说直接加载进来就行了, 这里在Main里和平时使用的加载有一处不一样:
this._appDomain = new ApplicationDomain(ApplicationDomain.currentDomain);
this._loaderContext = new LoaderContext(false, this._appDomain);
然后所有的加载函数里第二个参数均设置为this._loaderContext, 且其他工程要在共享库rsl.swf加载完成后再开始加载 :
this._rslLoader.load(new URLRequest(this._rslURL), this._loaderContext);
this._loader1.load(new URLRequest(this._url1), this._loaderContext);
this._loader2.load(new URLRequest(this._url2), this._loaderContext);
即让它们加载在相同的应用程序域.