作者bluenicole (搬新家~无名881~^^)
看板Flash
标题[问题] 读取数量不确定的XML档案
时间Thu Jul 28 22:23:48 2011
不好意思打扰了
最近在试着写读取不确定数量的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
1F:推 osanaosana:哇...日文版... 07/29 02:23
2F:→ osanaosana:虽然直接查1009错误应该就能知道是什麽错误,尝试翻译.. 07/29 02:28
3F:→ osanaosana:"无法存取空物件参照的属性或方法" 07/29 02:30
4F:→ KawasumiMai:感觉起来不是读取失败,而是许多方法对应到不存在的 07/29 17:20
5F:→ KawasumiMai:变数,也许是宣告不正确? 07/29 17:20
6F:推 jeaby:你忘了给 hatsureDataArray 实体 07/29 18:11