无法在影片剪辑AS3

时间:2016-07-20 18:17:47

标签: actionscript-3 flash multidimensional-array

我是AS3的新手,我在读取xml后创建的二维数组时遇到了麻烦。这是代码:

var countdowns:Array = new Array;
var xmlLoader:URLLoader = new URLLoader();
var url:URLRequest = new URLRequest("products.xml");
xmlLoader.load(url);
xmlLoader.addEventListener(Event.COMPLETE, onXmlLoad);
function onXmlLoad(e:Event):void
{
  var xml = new XML(xmlLoader.data);
  var productElements:XMLList = xml.product;
  var len:int = productElements.length();

    for (var i:int = 0; i < len; i++)
    {
        var productElement:XML = productElements[i];

        countdowns[productElements[i].name] = new Array;
        countdowns[productElements[i].name]["name"] = productElements[i].name;
        countdowns[productElements[i].name]["user"] = productElements[i].user;
        countdowns[productElements[i].name]["image"] = productElements[i].image;
        countdowns[productElements[i].name]["fondo"] = productElements[i].fondo;
    }
    trace("Productos: "+countdowns["ambar"]["image"])}

这就像一个魅力。但是当我想在下一帧中跟踪它时,它会给我一个错误。多年前我曾经_level0 vars这样做,所以我可以用trace(_level0.countdowns["ambar"]["image"])跟踪它们,但似乎trace(MovieClip(root).countdowns["ambar"]["image"])没有做同样的事情。我的二维数组在哪里?如何从其他动画片段访问它?

2 个答案:

答案 0 :(得分:2)

最有可能的问题是,在xml完成​​加载之前已到达下一帧。

由于xmlLoader.load是异步的,你的程序将继续移动到下一帧,即使它还没有加载(在1帧的范围内,它永远不会加载那么快)。

要解决此问题,只需在第一帧(或此代码所在的任何帧)上放置stop,然后在play()nextFrame()(或onXmlLoad)功能

答案 1 :(得分:2)

让我们直接进入它。这里有很多问题:

1)实例化Array时缺少括号。它应该是:

var countdowns:Array = new Array();

或者更简洁,更快的文字:

var countdowns:Array = [];

2)您在调用load()之后添加了加载侦听器。但是,因为你的完成&#39;之后只会添加侦听器,如果负载立即完成,则可能永远不会触发侦听器。在调用可能触发事件的方法之前,应始终添加侦听器:

xmlLoader.addEventListener(Event.COMPLETE, onXmlLoad);
xmlLoader.load(url);

3)无需为您未使用的变量分配内存。你不需要url变量,因为这样做会很好:

xmlLoader.load(new URLRequest("products.xml"));

4)您使用字符串(即&#34; ambar&#34;)作为产品元素的名称,但使用它们作为倒计时数组的索引:

countdowns[productElements[i].name] = new Array();

数组没有用字符串编制索引 - 它们用以下数字编入索引:

countdowns[i] = new Array();

如果你想使用字符串,那么你应该使用这样的对象或字典:

var countdowns:Dictionary = new Dictionary();
countdowns[productElements[i].name] = new Array();

5)查看每个&#39;这会给你一个更紧凑的循环。