在影片剪辑 AS3 上找不到我的二维数组
Can't find my bidimensional array on a movie clip AS3
我是 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"])
不这样做。我的二维数组在哪里?我怎样才能从其他影片剪辑访问它?
很可能,您的问题是在 xml 完成加载之前到达下一帧。
由于 xmlLoader.load
是异步的,您的程序将移动到下一帧,即使它尚未加载(在 1 帧的跨度内,它永远不会加载那么快)。
要纠正这个问题,只需在第一帧(或此代码所在的任何帧)上放置一个 stop
,然后在 [=14] 内放置 play()
(或 nextFrame()
) =]函数。
让我们进入正题。这里有很多问题:
1) 实例化 Array 时缺少括号。应该是:
var countdowns:Array = new Array();
或者更简洁、速度稍快的文字:
var countdowns:Array = [];
2) 您在调用 load() 之后添加负载侦听器。但是由于您的 'on complete' 侦听器仅在之后添加,如果加载立即完成,那么您的侦听器可能永远不会被触发。您应该始终在调用可能触发事件的方法之前添加侦听器:
xmlLoader.addEventListener(Event.COMPLETE, onXmlLoad);
xmlLoader.load(url);
3) 无需为不使用的变量分配内存。您不需要 url 变量,因为这样就可以了:
xmlLoader.load(new URLRequest("products.xml"));
4) 您正在使用字符串(即 "ambar")作为产品元素的名称,但将它们用作倒计时数组的索引:
countdowns[productElements[i].name] = new Array();
数组不是用字符串索引的——它们是用这样的数字索引的:
countdowns[i] = new Array();
如果你想使用字符串,那么你应该使用这样的对象或字典:
var countdowns:Dictionary = new Dictionary();
countdowns[productElements[i].name] = new Array();
5) 查看 'for each' 这会给你一个更紧凑的循环。
我是 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"])
不这样做。我的二维数组在哪里?我怎样才能从其他影片剪辑访问它?
很可能,您的问题是在 xml 完成加载之前到达下一帧。
由于 xmlLoader.load
是异步的,您的程序将移动到下一帧,即使它尚未加载(在 1 帧的跨度内,它永远不会加载那么快)。
要纠正这个问题,只需在第一帧(或此代码所在的任何帧)上放置一个 stop
,然后在 [=14] 内放置 play()
(或 nextFrame()
) =]函数。
让我们进入正题。这里有很多问题:
1) 实例化 Array 时缺少括号。应该是:
var countdowns:Array = new Array();
或者更简洁、速度稍快的文字:
var countdowns:Array = [];
2) 您在调用 load() 之后添加负载侦听器。但是由于您的 'on complete' 侦听器仅在之后添加,如果加载立即完成,那么您的侦听器可能永远不会被触发。您应该始终在调用可能触发事件的方法之前添加侦听器:
xmlLoader.addEventListener(Event.COMPLETE, onXmlLoad);
xmlLoader.load(url);
3) 无需为不使用的变量分配内存。您不需要 url 变量,因为这样就可以了:
xmlLoader.load(new URLRequest("products.xml"));
4) 您正在使用字符串(即 "ambar")作为产品元素的名称,但将它们用作倒计时数组的索引:
countdowns[productElements[i].name] = new Array();
数组不是用字符串索引的——它们是用这样的数字索引的:
countdowns[i] = new Array();
如果你想使用字符串,那么你应该使用这样的对象或字典:
var countdowns:Dictionary = new Dictionary();
countdowns[productElements[i].name] = new Array();
5) 查看 'for each' 这会给你一个更紧凑的循环。