[問題] 讀取數量不確定的XML檔案

看板Flash作者 (搬新家~無名881~^^)時間14年前 (2011/07/28 22:23), 編輯推噓2(204)
留言6則, 3人參與, 最新討論串1/1
不好意思打擾了 最近在試著寫讀取不確定數量的XML檔案,遇到一些問題, 希望有前輩能幫幫忙指點解惑 ____________________________________________________________________________ 因為想要讓遊戲每次按鈕觸發不同狀況下有不同的效果動畫大致情況如下 ex 狀況一~由a、b、c三種動畫random其中一種 狀況二~由d、e、f三種動畫random其中一種 etc…… 所以現在我有10個xml檔案 首先是select.xml 它列出其他九個xml檔的名稱,希望這樣以後要新增檔案時只要加入新檔案後 增加新檔案名稱在這份xml上,不要再去動as上的程式碼 select的內容現在如下 <select> <hatsure>hatsure-0.xml,hatsure-1.xml,hatsure-2.xml</hatsure> <riich1>riich1-0.xml,riich1-1.xml,riich1-2.xml</riich1> <riich2>riich2-0.xml,riich2-1.xml,riich2-2.xml</riich2> </select> 上面列了三種情況(hatsure riich1 riich2)下可讀取哪些檔案的名稱 而九份檔案的內容大同小異如下 <hatsure> <hatsureSize>640,480</hatsureSize> <hatsurePosition>0,0</hatsurePosition> <hatsureFlvName>Candies_2d.flv</hatsureFlvName> - <timeline> <yokokuData>50,yokoku02.swf,10,20,28</yokokuData> <yokokuData>150,yokoku02.swf,10,20,28</yokokuData> </timeline> </hatsure> 格式都是一樣的,差別僅在每個標籤所包的內容不同(歹勢好像是廢話^^"), 還有<yokokuData>這一項,不同檔案內的數量不一樣 比如上列是兩項 有的檔案會有三到四項,這個項目要可以增減。 ___________________________________________________________________________ 狀況大致如上 一開始我用兩層for迴圈包起來去讀,一直出現錯誤, 現在的寫法是這樣的…… (因為排版有點亂,也可以從這裡看http://www.megaupload.com/?d=UKEU7ZJ0 ) public class LoadXmlFile extends MovieClip{ public var i:int; public var a:int; public var xmlSaveArray:Array=new Array(); public var hatsureArray:Array=new Array(); public var riich1Array:Array=new Array(); public var riich2Array:Array=new Array(); public var hatsureXmlArray:Array=new Array(); public var hatsureDataArray:Array; public var hatsureXmlLoader:URLLoader; public var hatsureNumSand1:int; public var yokokuNumSand1:int; //建構式先讀入記載檔案名稱的select.xml public function LoadXmlFile() { var xmlLoader:URLLoader=new URLLoader(); xmlLoader.addEventListener(Event.COMPLETE,doXmlLoderComplete); function doXmlLoderComplete(e:Event):void{ XML.ignoreWhitespace = true; var xmlDataSaver:XML = new XML(xmlLoader.data); //把xmlDataSaver裡的資料存進xmlSaveArray裡,以便待會整理成可以取用的資料(內容 為接下來要取的xml檔檔名們) xmlSaveArray.push(xmlDataSaver.hatsure,xmlDataSaver.riich1, xmlDataSaver.riich2); //用doLoader這個function來把存進xmlSaveArray裡的資料分存到三個Array裡,以 便之後取得總共有幾筆(要存幾份xml),及那些xml的檔名 doLoader(); } var xmlURL:URLRequest = new URLRequest("select.xml"); xmlLoader.load(xmlURL); } //用doLoader這個function來把存進xmlSaveArray裡的資料分存到三個Array裡,以便之 後取得總共有幾筆(要存幾份xml),及那些xml的檔名 public function doLoader() { hatsureArray = xmlSaveArray[0].split(","); riich1Array = xmlSaveArray[1].split(","); riich2Array = xmlSaveArray[2].split(","); trace(hatsureArray[1]); //先試做只存hatsureArray裡列出那些xml的部份 doNextLoader(); } public function doNextLoader() { //找出裡面有幾個檔案名稱 hatsureNumSand1=hatsureArray.length; //有幾個檔存幾次 for(a=0;a<hatsureNumSand1;a++){ //每回初始化一次hatsureXmlLoader hatsureXmlLoader=new URLLoader(); hatsureXmlLoader.addEventListener(Event.COMPLETE,function (e:Event){hatsureXmlLoaderComplete(e,a)}); //每回讀不同名稱的檔案 var hatsureURL:URLRequest = new URLRequest(hatsureArray[a]); hatsureXmlLoader.load(hatsureURL); trace("hatsureArray[a]:"+hatsureArray[a]); } } public function hatsureXmlLoaderComplete(e:Event,hatsureA:int):void{ XML.ignoreWhitespace = true; var hatsureDataSaver:XML = new XML(hatsureXmlLoader.data); //因為之後的程式要用random的方式決定使用哪一份檔案的資料,所以存成二維陣列 ,以後想用hatsureXmlArray[i],i用random的方式來取用資料 hatsureXmlArray[hatsureA]=new Array(); hatsureXmlArray[hatsureA].push(hatsureDataSaver.hatsureSize, hatsureDataSaver.hatsurePosition,hatsureDataSaver.hatsureFlvName); yokokuNumSand1 = hatsureDataSaver.timeline.yokokuData.length(); //yokokuData的資料筆數不同份xml不固定,所以先知道筆數後,用迴圈放進Array中 for (i=0; i<yokokuNumSand1; i++) { hatsureXmlArray[hatsureA].push(hatsureDataSaver.timeline.yokokuData[i]); } //讀完整理資料和removeEventListener removeXmlListener(hatsureA); hatsureA=0; } public function removeXmlListener(resiveA:int){ hatsureDataArray[resiveA] =new Array(); hatsureDataArray[resiveA] = hatsureXmlArray[resiveA].split(","); hatsureXmlLoader.removeEventListener(Event.COMPLETE,hatsureXmlLoaderComplete); trace("done"); } } } _____________________________________________________________________________ 但出來的結果如下…… 執行階段錯誤 hatsure-1.xml hatsureArray[a]:hatsure-0.xml hatsureArray[a]:hatsure-1.xml hatsureArray[a]:hatsure-2.xml hatsureXmlArray:,, yokokuNumSand1(3):0 TypeError: Error #1009: null のオブジェクト参照のプロパティまたはメソッドにア クセスすることはできません。 at testgame::LoadXmlFile/removeXmlListener() at testgame::LoadXmlFile/hatsureXmlLoaderComplete() at Function/<anonymous>() at flash.events::EventDispatcher/dispatchEventFunction() at flash.events::EventDispatcher/dispatchEvent() at flash.net::URLLoader/onComplete() hatsureXmlArray:,, yokokuNumSand1(3):0 TypeError: Error #1009: null のオブジェクト参照のプロパティまたはメソッドにア クセスすることはできません。 at testgame::LoadXmlFile/removeXmlListener() at testgame::LoadXmlFile/hatsureXmlLoaderComplete() at Function/<anonymous>() at flash.events::EventDispatcher/dispatchEventFunction() at flash.events::EventDispatcher/dispatchEvent() at flash.net::URLLoader/onComplete() hatsureXmlArray:640,480,0,0,Candies_2d.flv,50,yokoku02.swf,10,20,28,150,yokoku02.swf,10,20,28 yokokuNumSand1(3):2 TypeError: Error #1009: null のオブジェクト参照のプロパティまたはメソッドにア クセスすることはできません。 at testgame::LoadXmlFile/removeXmlListener() at testgame::LoadXmlFile/hatsureXmlLoaderComplete() at Function/<anonymous>() at flash.events::EventDispatcher/dispatchEventFunction() at flash.events::EventDispatcher/dispatchEvent() at flash.net::URLLoader/onComplete() ____________________________________________________________________________ 說真的我試了三天真的好難 如果上面我的寫法很糟要全改的話也絕對沒問題的^^"請指點我一條明路吧!感謝!!! -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 122.50.49.65

07/29 02:23, , 1F
哇...日文版...
07/29 02:23, 1F

07/29 02:28, , 2F
雖然直接查1009錯誤應該就能知道是什麼錯誤,嘗試翻譯..
07/29 02:28, 2F

07/29 02:30, , 3F
"無法存取空物件參照的屬性或方法"
07/29 02:30, 3F

07/29 17:20, , 4F
感覺起來不是讀取失敗,而是許多方法對應到不存在的
07/29 17:20, 4F

07/29 17:20, , 5F
變數,也許是宣告不正確?
07/29 17:20, 5F

07/29 18:11, , 6F
你忘了給 hatsureDataArray 實體
07/29 18:11, 6F
文章代碼(AID): #1ECN3uHN (Flash)