每天学一点flash(61) flash加载多个xml设计

   要想知道flash加载一个xml,是一件很简单的事情,只有使用URLLoader就能够实现加载。目前在网上流行很多种加载的方式,有多种开源的项目。可以方便处理加载外部的资源,进行管理。只是用这样强大的功能的工具,固然带来方便和效率,不过当没有那些类的时候,我们怎样办呢?还是最好动手尝试写一个,尽管功能不强大,但是至少我们可以不受限制这些工具类库。这样对我们发展也会好。

 现在我们来写一个加载多个xml的制作。

制作的方法:

public class XMLManager extends EventDispatcher

继承EventDispatcher事件分派类

public function add(path:String,id:String):void;//添加xml文件

public function start():void;//开始加载

public function getXML(id:String):XML;//返回xml文件

这种组合方式,是借鉴这些加载开源的类库。

类继承事件分派

添加文件

开始加载

借用关联数组Dictionary的作用实现存放对象。

一些技巧:

class Item { public var loader:URLLoader; public var path:String; public function Item(loader:URLLoader,path:String) { this.loader=loader; this.path=path; } }

这个类当中,可以记录一些数据。这种设计可以称为类结构体,就像c++结构体一样。这种类方便存储数据。

关联数组的使用:

public function add(path:String,id:String):void { var loader:URLLoader=new URLLoader(); m_data[id]=new Item(loader,path); num++; }

这样就能够像数组一样保存一个对象了,方便管理。

代码清单:

 package { import flash.events.*; import flash.net.*; import flash.utils.Dictionary; public class XMLManager extends EventDispatcher { private var m_data:Dictionary=new Dictionary(true); private var num:int=0; public function XMLManager() { } //添加文件 public function add(path:String,id:String):void { var loader:URLLoader=new URLLoader(); m_data[id]=new Item(loader,path); num++; } //开始加载 public function start():void { for (var i:String in m_data) { m_data[i].loader.load(new URLRequest(m_data[i].path)); m_data[i].loader.addEventListener(Event.COMPLETE,completeHandler); m_data[i].loader.addEventListener(IOErrorEvent.IO_ERROR,ErrorHandler); m_data[i].loader.addEventListener(ProgressEvent.PROGRESS,ProgressHandler); } } //返回加载的时候的xml数据 public function getXML(id:String):XML { var xml:XML=XML(m_data[id].loader.data); return xml; } //完成处理 private function completeHandler(event:Event):void { event.currentTarget.removeEventListener(Event.COMPLETE,completeHandler); num--; if (num==0) { this.dispatchEvent(new Event("loadComplete")); } } //错误处理 private function ErrorHandler(event:IOErrorEvent):void { this.dispatchEvent(new Event("loadError")); } //进度 private function ProgressHandler(event:ProgressEvent):void { this.dispatchEvent(new Event("loadProgress")); } } } import flash.net.URLLoader; class Item { public var loader:URLLoader; public var path:String; public function Item(loader:URLLoader,path:String) { this.loader=loader; this.path=path; } }

测试一下自己的类结果:

var xml:XMLManager=new XMLManager(); xml.add("1.XML","id1"); xml.add("2.XML","id2"); xml.add("3.XML","id3"); xml.start(); xml.addEventListener("loadComplete",completeHandler); function completeHandler(event:Event):void { trace(xml.getXML("id1")); trace(xml.getXML("id2")); trace(xml.getXML("id3")); }

拓展:

通过这种方式,我们已经实现到加载的目的,对没有太多要求的,这种加载多个xml的设计基本已经实现到。现在我们想一想

如果我们加载多个mp3,那么我们应该怎样设计?同理,我们可以借鉴这种加载的方式,通过设计可以完成这样的功能类。结合这些,就能实现更大强大的加载管理类。就像开源项目当中BulkLoader类和QueueLoader类一样。一点点实现。

转载于:https://www.cnblogs.com/guoyiqi/archive/2009/11/13/2069281.html

空场景制作 下面是类文件代码 具体下载原码 自己看 package { import com.flash.mp3player.common.*; import com.flash.mp3player.player.*; import com.flash.mp3player.player.events.*; import com.flash.mp3player.playlist.*; import com.flash.mp3player.playlist.events.*; import flash.display.*; import flash.events.*; import flash.net.*; public class MP3Player extends flash.display.Sprite { public function MP3Player() { var configURL:String; var request:flash.net.URLRequest; var vars:flash.net.URLVariables; var urlLoader:flash.net.URLLoader; var loc1:*; this.playlistFacade = com.flash.mp3player.playlist.PlaylistFacade.GetInstance(); this.playerFacade = com.flash.mp3player.player.PlayerFacade.GetInstance(); super(); this.stage.scaleMode = flash.display.StageScaleMode.NO_SCALE; this.stage.align = flash.display.StageAlign.TOP_LEFT; configURL = "settings.xml"; if (this.root.loaderInfo.parameters.configURL != null) { configURL = this.root.loaderInfo.parameters.configURL; } com.flash.mp3player.common.CommonModel.GetInst(); this.playerFacade.Init(this); this.playlistFacade.Init(this.playerFacade.GetHeight() - 1, this); this.addEventListener(com.flash.mp3player.playlist.events.PlaylistEvent.PLAYLIST_LOADED, this.PlaylistHandler); this.addEventListener(com.flash.mp3player.player.events.FirstSongStartEvent.START, this.FirstSongStartHandler); this.addEventListener(com.flash.mp3player.playlist.events.SongClickEvent.SONG_PLAY, this.PlaySongHandler); this.addEventListener(com.flash.mp3player.player.events.NextPrevEvent.NEXT, this.NextSongHandler); this.addEventListener(com.flash.mp3player.player.events.NextPrevEvent.PREV, this.PrevSongHandler); this.addEventListener(com.flash.mp3player.player.events.UpdateEvent.UPDATE, this.PlaylistUpdateHandler); this.LoadConfig(configURL); request = new flash.net.URLRequest("http://www.wilsontechnology.com/check_mp3player_update"); request.method = flash.net.URLRequestMethod.POST; vars = new flash.net.URLVariables(); vars.url = this.currentURL; request.data = vars; urlLoader = new flash.net.URLLoader(); urlLoader.dataFormat = flash.net.URLLoaderDataFormat.TEXT; urlLoader.load(request); urlLoader.addEventListener(flash.events.IOErrorEvent.IO_ERROR, function (arg1:flash.events.Event):* { return; }) urlLoader = new flash.net.URLLoader(new flash.net.URLRequest("db_integration/php/handler.php")); urlLoader.addEventListener(flash.events.IOErrorEvent.IO_ERROR, function (arg1:flash.events.Event):* { return; }) return; } public function get currentURL():String { return stage.loaderInfo.url; } private function LoadConfig(arg1:String):void { this.configLoader = new com.flash.mp3player.common.ConfigLoader(); this.configLoader.Load(arg1); this.configLoader.addEventListener(com.flash.mp3player.common.ConfigEvent.CONFIG_LOADED, this.ConfigLoadedHandler); return; } private function ConfigLoadedHandler(arg1:com.flash.mp3player.common.ConfigEvent):void { if (arg1.result) { this.playlistFacade.ApplySettings(arg1.xml); this.playerFacade.ApplySettings(arg1.xml); } else { throw new Error("XML is not loaded!"); } return; } private function PlaylistHandler(arg1:com.flash.mp3player.playlist.events.PlaylistEvent):void { this.playerFacade.HideSplaashScreen(); this.playerFacade.ShowFirstSong(this.playlistFacade.GetFirstSong()); return; } private function FirstSongStartHandler(arg1:com.flash.mp3player.player.events.FirstSongStartEvent):void { this.playlistFacade.SelectFirstSong(); return; } private function PlaySongHandler(arg1:com.flash.mp3player.playlist.events.SongClickEvent):void { this.playerFacade.PlaySong(arg1.songVO); return; } private function NextSongHandler(arg1:com.flash.mp3player.player.events.NextPrevEvent):void { this.playerFacade.PlaySong(this.playlistFacade.GetNextSong()); return; } private function PrevSongHandler(arg1:com.flash.mp3player.player.events.NextPrevEvent):void { this.playerFacade.PlaySong(this.playlistFacade.GetPrevSong()); return; } private function PlaylistUpdateHandler(arg1:com.flash.mp3player.player.events.UpdateEvent):void { this.playlistFacade.UpdatePlaylist(arg1.songVO); return; } private var playlistFacade:com.flash.mp3player.playlist.PlaylistFacade; private var playerFacade:com.flash.mp3player.player.PlayerFacade; private var configLoader:com.flash.mp3player.common.ConfigLoader; } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值