未在加载函数之外保存的数组 - ActionScript 3 和 XML

Posted

技术标签:

【中文标题】未在加载函数之外保存的数组 - ActionScript 3 和 XML【英文标题】:Arrays not saved outside of the load function - ActionScript 3 and XML 【发布时间】:2014-08-13 16:29:08 【问题描述】:

首先,我真的很抱歉我再次问这个问题,但是在阅读了这个问题的前 3 个答案之后,似乎没有一个给我任何解决方案。

我正在尝试将包含关卡数据的 XML 文件加载到我的 AS3 游戏中。这很简单,XML 被转储到一个我已经检查过的数组中 - 长度、大小以及其中的每个变量都没有问题。

唯一真正的问题是,每当我在函数之外引用它时,我的数组就会被清除。我读到它与 ActionScript 的异步特性有关,我需要一个单独的处理程序……但是,也许我只是个白痴,我确实拥有这样的处理程序。

有人可以看看这里的这段代码,然后用一根大棍子敲我的头,说我做错了什么吗?

package
import flash.net.URLLoader;
import flash.net.URLRequest;
import flash.events.Event;
import flash.display.MovieClip;

public class LevelLoader extends MovieClip

    private var _root:MovieClip;

    public var lvlArray:Array = new Array(); //Tablica (wektor) trzymający nam ułożenie mapy.

    private var xmlFile:XML;// The XML File Holder, duuh.
    private var urlLoader:URLLoader = new URLLoader();//The XML File Loader, duuuh.

    private var variant:int;

    public function LevelLoader(v:int)
        loadXML();
        variant = v;
        trace('Poza: '+lvlArray.length);
    

    // Dośc vokalidów. Ale przeklejam z starego kodu.
    private function loadXML(file:String = "XMLG.xml"):void
    
        urlLoader.addEventListener(Event.COMPLETE, parseXML);
        urlLoader.load(new URLRequest(file));
    

    private function parseXML(e:Event):void
    
        xmlFile = new XML(e.target.data);
        loadArray(variant,xmlFile);
    

    private function loadArray(vars:int,xmlInput:XML):void
    
        //trace(xmlInput.lay[vars].children().length());
        var layLength:int = xmlInput.lay[vars].children().length();
        for (var i:int = 0; i<layLength; i++)
            this.lvlArray.push(xmlInput.lay[vars].field[i].@type);
            //trace(xmlInput.lay[vars].field[i].@type);
             
        saveArray(lvlArray);
        trace('W: '+lvlArray.length);
    

    private function saveArray(arr:Array):void
        lvlArray = arr;
    


附:是的,这些是混合波兰语和英语的 cmets。拜托了,别管它了。

【问题讨论】:

【参考方案1】:

我认为您的数组没有被“清除”,我认为您可能在调用 parseXML 之前尝试引用该数组。

由于您只发布了LevelLoader 的代码,我假设您在其他地方尝试引用LevelLoader.lvlArray。您应该推迟此操作,直到您收到某种“完成”或“加载”事件,您将从您的 loadArray 方法调度(实际上不需要您的 saveArray 方法):

package
    import flash.net.URLLoader;
    import flash.net.URLRequest;
    import flash.events.Event;
    import flash.display.MovieClip;

    public class LevelLoader extends MovieClip

        private var _root:MovieClip;

        public var lvlArray:Array = new Array(); //Tablica (wektor) trzymajacy nam ulozenie mapy.

        private var xmlFile:XML;// The XML File Holder, duuh.
        private var urlLoader:URLLoader = new URLLoader();//The XML File Loader, duuuh.

        private var variant:int;

        public function LevelLoader(v:int)
            variant = v;
            trace('Poza: '+lvlArray.length);
        

        // Dosc vokalidów. Ale przeklejam z starego kodu.
        public function loadXML(file:String = "XMLG.xml"):void
        
            urlLoader.addEventListener(Event.COMPLETE, parseXML);
            urlLoader.load(new URLRequest(file));
        

        private function parseXML(e:Event):void
        
            xmlFile = new XML(e.target.data);
            loadArray(variant,xmlFile);
        

        private function loadArray(vars:int,xmlInput:XML):void
        
            //trace(xmlInput.lay[vars].children().length());
            var layLength:int = xmlInput.lay[vars].children().length();
            for (var i:int = 0; i<layLength; i++)
                this.lvlArray.push(xmlInput.lay[vars].field[i].@type);
                //trace(xmlInput.lay[vars].field[i].@type);
            
            trace('W: '+lvlArray.length);

            dispatchEvent(new Event(Event.COMPLETE));
        

    

无论您在哪里实例化 LevelLoader,您都需要监听此事件:

var lvlLoader:LevelLoader = new LevelLoader(1);
lvlLoader.addEventListener(Event.COMPLETE, onLevelLoaded);
lvlLoader.loadXML();

private function onLevelLoaded(e:Event):void 
    var lvlLoader:LevelLoader = e.target as LevelLoader;
    lvlLoader.removeEventListener(Event.COMPLETE, onLevelLoaded);

    // you may NOW reference lvlLoader.lvlArray
    trace(lvlLoader.lvlArray.length);

请注意,我已将loadXML 方法公开,以便在您添加事件侦听器之后 调用它。

【讨论】:

非常感谢您的帮助,@Marcela,唉,恐怕它并没有起到太大作用。我在 Loading 类之外引用 lvlArray (因此是公开的,所以我不必费心获取和设置数组)。本质上,主场景代码唤起了... var Level:LevelLoader = new LevelLoader(0);这个类的全部目的是让我可以将这个单个数组的加载代码转储到一个整洁的地方,然后在我构建我的关卡时引用这个数组。 对不起,您的评论不清楚,我不明白剩下的问题。 也许我写这篇文章很仓促,或者我是个白痴,但你的建议与我目前所拥有的内容发生了很大的冲突,或者我又是一个智障。我会尝试以更清晰的方式再次保留它。本质上,LevelLoader 类将我的 XML 加载到 lvlArray 中,以便我的主类稍后可以获取所述数组(包含关卡数据)并将其切碎以构建所述关卡。存在 LevelLoader 类,因此我可以将所有加载代码转储到其中。我尽量避免,像魔鬼避圣水一样,将加载代码放入主函数中。 为了清楚起见,这里有一个包含 LevelLoader 和 Main 函数的 pastebin。不是全部,只是引用 lvlArray 的位。 pastebin.com/8qdzL4Zs 上面的例子并不要求将加载代码放在main函数中,它只要求Main类在尝试引用@之前等待LevelLoader完成加载987654332@

以上是关于未在加载函数之外保存的数组 - ActionScript 3 和 XML的主要内容,如果未能解决你的问题,请参考以下文章

NSUserDefaults NSMutable 数组未在会话之间保存

如何调试未在任何 IOS 设备上加载的网站?

NSData 未在 UIWebView lodadata 方法中正确加载

使用 nsfetchedresultscontroller 时,未在 uitableview 中自动重新加载数据

webview 正在模拟器中加载,但未在设备中加载

Rails 4图像未在heroku上加载