我尝试加载XML数据,然后将其用于将来的方法。
Main.as:
public class Main extends MovieClip{
var xmlM:XmlManager;
var xmlGenerated:Boolean = false;
public function Main(){
trace("Main() called");
addEventListener(Event.ENTER_FRAME, update);
}
public function update(e:Event) {
trace("update() called");
if (!xmlGenerated) {
this.generateXmlContent();
xmlGenerated = true;
}
}
public function generateXmlContent() {
trace ("generateXmlContent() called");
var xmlM = new XmlManager("loaded.xml");
xmlM.printData();
}
}
XmlManager.as:
public class XmlManager {
private var levelXML:XML;
private var myLoader:URLLoader;
private var dataString:String;
public function XmlManager(file:String){
trace("XmlManager() called");
levelXML = new XML();
var XML_URL:String = file;
var myXMLURL:URLRequest = new URLRequest(XML_URL);
myLoader = new URLLoader(myXMLURL);
myLoader.addEventListener("complete", startApp);
}
private function startApp(eventDataLoaded:Event){
trace("startApp() called");
levelXML = XML(myLoader.data);
dataString = levelXML;
}
public function printData(){
trace("printData() called");
trace(dataString);
}
}
当我加载数据时,我得到了一个Main()调用的跟踪,调用了update(),调用了generateXmlContent(),调用了XmlManager(),调用了printData(),调用了null,startApp(),调用了update()。
这意味着main运行中的所有代码首先包括输入框架方法,生成xml类但是在返回null时不传递或生成数据。
对我来说这意味着我没有为我生成Xml。我已经读过AS3中的XML加载是异步的,但是下面使用我的布尔条件仍然不起作用,因为我在我的主类中使用它作为生成数据的方法。
非常感谢您的帮助。
答案 0 :(得分:0)
如果您修复了代码中的多个错误,它应该适用于XML加载。第一个是关于存储xml原始数据的变量,第二个是如何创建XML:
private function startApp(eventDataLoaded:Event){
trace("startApp() called");
dataString = myLoader.data;
levelXML = new XML(dataString);
}
您应该等待XML,您不能实例化Xml管理器并立即访问加载的XML。另外,如果在启动主循环之前加载XML,那么在循环中加载XML并不是一个好主意。
您能否告诉我们如何等待XML完全加载?
var xmlM:XmlManager;
private function Main():void {
trace("Main() called");
//Load xml first
xmlM = new XmlManager();
//Wait for XML
xmlM.loadWithCallback("loaded.xml", onLoadXml);
}
public function update(e:Event) {
trace("update() called");
trace(xmlM.levelXML);
}
private function onLoadXml():void {
trace("XML is loaded, start game");
addEventListener(Event.ENTER_FRAME, update);
}
对XmlManager进行了一些小改动:
public class XmlManager {
private var _levelXML:XML;
private var _dataString:String;
private var _loader:URLLoader;
private var completeCallback:Function;
public function XmlManager() {
trace("XmlManager() called");
_loader = new URLLoader();
_loader.addEventListener(Event.COMPLETE, onComplete, false, 0, true);
}
public function loadWithCallback(url:String, onLoadXml:Function):void {
completeCallback = onLoadXml;
_loader.load(new URLRequest(url));
}
private function onComplete(e:Event):void {
trace("XML loaded");
_dataString = _loader.data;
_levelXML = new XML(_dataString);
completeCallback();
completeCallback = null;
}
public function printData() {
trace("printData() called");
trace(_dataString);
}
public function get levelXML():XML {
return _levelXML;
}
public function get dataString():String {
return _dataString;
}
}