我正在使用Flash AS4和Ive创建的数组,它包含xml数据,可以通过以下循环正常工作
for(var i:int = 0; i < uNavXML.length(); i++){
navArray.push(uNavXML..navRef.text()[i]);
XML数据实际上是我在舞台上的影片剪辑的名称:
xmlLIST :<uNav>
<unavNavID>1</unavNavID>
<navRef>navBtns.nav01</navRef>
</uNav>
<uNav>
<unavNavID>2</unavNavID>
<navRef>navBtns.nav02</navRef>
</uNav>
<uNav>
<unavNavID>3</unavNavID>
<navRef>navBtns.nav03</navRef>
</uNav>
<uNav>
<unavNavID>4</unavNavID>
<navRef>navBtns.nav04</navRef>
</uNav>
<uNav>
<unavNavID>5</unavNavID>
<navRef>navBtns.nav05</navRef>
</uNav>
<uNav>
<unavNavID>7</unavNavID>
<navRef>navBtns.nav07</navRef>
</uNav>
<uNav>
<unavNavID>8</unavNavID>
<navRef>navBtns.nav08</navRef>
</uNav>
<uNav>
<unavNavID>10</unavNavID>
<navRef>navBtns.nav10</navRef>
</uNav>
<uNav>
<unavNavID>12</unavNavID>
<navRef>navBtns.nav12</navRef>
</uNav>
<uNav>
<unavNavID>13</unavNavID>
<navRef>navBtns.nav13</navRef>
</uNav>
<uNav>
<unavNavID>14</unavNavID>
<navRef>navBtns.nav14</navRef>
</uNav>
<uNav>
<unavNavID>15</unavNavID>
<navRef>navBtns.nav15</navRef>
</uNav>
所以,我想要做的是获取这些xml值,在for循环中使它们成为对象,以便我可以像这样为它们分配eventlisteners
navObj [i] .addEventListener(MouseEvent.MOUSE_OVER,mOvNav); navObj [I] - 阅读进度 - (的MouseEvent.MOUSE_OUT,mOuNav); navObj [I] - 阅读进度 - (MouseEvent.CLICK,goPage);
有没有办法在Flash ActionScript中执行此操作?我对AS3没有太多的经验,我从来没有必要将数组从String转换为Object,所以我才挣扎。如果有人可以提供帮助,那将会受到热烈的欢迎......
通过此以及之前的SO quesiotn找到答案 Converting String values to MovieClip in AS 3.0
对于我的问题,这里是删除“navBtns”的答案。 prfix并通过navShort提供navButton实例名称
for each (var nav:String in navShrt) {
var navInst:MovieClip = navBtns[nav] as MovieClip;
然后我可以通过navInst.addEventListener ....等参考
答案 0 :(得分:0)
假设您有一个名为&#34; testMC&#34;一个名为&#34; test2MC&#34;。在您的XML中,您以某种方式存储了这些名称。
您迭代XML并检查其内容,每个内容都包含您的一个MovieClip的名称。
然后,您只需检查XML的内容是否符合您的条件。
有些事情如下:
for(var i:int=0;i<uNavXML.length();i++){
var mcname:String = uNavXML..navRef.text()[i];
switch(mcname){
case "testMC":
//do whatever you need with your testMC Object
break;
case "test2MC":
//do whatever you need with your test2MC Object
break;
}
}
现在,我不太明白你的意思&#34;将xml文本值转换为对象&#34;。如果您打算创建XML中定义的特定类型的 new MovieClip。我建议的方法可行,但您需要有MovieClips in your Library and give them all AS Linkage.
例如,您可以使用名为&#34; testMC&#34;的MovieClip。在您的图书馆中,它有一个名为&#34;测试&#34;。
的AS Linkage类在上面的代码中,您可以执行以下操作:
case "testMC":
var newMC:Test = new Test();
addChild(newMC);
break;
因此,您可以在XML中定义您选择的Object的多个实例。
好的,现在第二次尝试我更好地理解你的问题了。
在您的舞台上,您有一个名为navBtns
的MovieClip,其中包含Button MovieClips的命名实例。
在您的XML中,您通过其父级引用这些按钮,例如navBtns.nav01
这意味着XML中的每个节点实际上都指的是2个对象,而不是一个。一个用于navBtns,另一个用于实际按钮。
我提出这个解决方案,虽然应该有更好的解决方案:
迭代XML
拆分XML节点中包含的字符串,将其拆分为&#34;。&#34;
通过括号表示法直接修改已定义的实例
看起来像这样:
for(var i:int=0;i<uNavXML.length();i++){
//obtain the entire string
var nodeTxt:String = uNavXML..navRef.text()[i];
//split the string at the dot
var split:Array = nodeTxt.split(".");
//not necessary, just for better understanding, create two helper variables
var prnt:String = split[0];
var btn:String = split[1];
//obtain MovieClip instance through bracket notation
var obj:MovieClip = this[prnt][btn];
//do what you need with the MovieClip
}
请记住,这是未经测试的。