有这么个情况, 如果美工做好一个素材, 编码员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";
}
}
}
{
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(false, this._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;
}
}
}
{
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(false, this._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(0, 0, 40, 20);
}
}
}
然后在rsl的main类中把这个类实例化一个实例出来:

package
{
import flash.display.Sprite;
public class RSL extends Sprite
{
public function RSL()
{
var form:Form = new Form();
trace("rsl>>new ");
}
}
}
{
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);
即让它们加载在相同的应用程序域.
浙公网安备 33010602011771号