2016-06-20 37 views
0

Greelings stackoverflow成员,AS3单击后编辑event.target执行gotoAndPlay(“abc”);

我有3个动画movieclip嵌套在一个movieclip。我想要做的是获取点击的实例的名称,并编辑它应用gotoAndPlay。我可以得到的名字,但是当我尝试编辑它时,我得到错误:

符号'按钮MC',图层'操作',第1帧,第30行1061:调用可能未定义的方法gotoAndPlay通过一个带有静态类型String的引用。

这里是我到目前为止的代码:

[Bindable] var targetName:String; 

var _userInput:String = new String(); 
_userInput = targetName; 

//array for buttons 
var btnArray:Array = [INS_Btn1, INS_Btn2, INS_Btn3]; 

//add eventlistiners 
for(var i:uint=0; i<btnArray.length; i++) { 
    btnArray[i].addEventListener(MouseEvent.ROLL_OVER, bRollover); 
    btnArray[i].addEventListener(MouseEvent.ROLL_OUT, bOut); 
    btnArray[i].addEventListener(MouseEvent.CLICK, bClick); 
    btnArray[i].buttonMode=true; 
} 

//btn over state 
function bRollover(event:MouseEvent):void{ 
    event.target.gotoAndPlay("Over"); 
} 
//btn out state 
function bOut(event:MouseEvent):void{ 
    event.target.gotoAndPlay("Out"); 
} 
//btn click state 
function bClick(event:MouseEvent):void{ 
    targetName = event.target +("_ani") 
    targetName.gotoAndPlay("Active"); 
} 

我想的是,MC点击应该去发挥onther MC的动画。最好我应该提到,我是AS3的初学者。

回答

1

targetName是一个字符串,当然你不能在字符串gotoAndPlay :)除此之外,event.target将返回你点击的对象,而不是它的名字。如果除了这段代码之外没有对它做任何特殊的处理,targetName就不需要绑定。

所以我假设你想要一个带有实例名称INS_Btn1_ani的动画片段,当你点击INS_Btn1按钮时会播放?首先,确保你的按钮具有name属性集(更容易,设置名称为“INS_Btn1”,“INS_Btn2”等,以及

INS_Btn1.name = "INS_Btn1"; 

然后,你会做这样的:

function bClick(event:MouseEvent):void 
{ 
    targetName = event.target.name + "_ani"; // this will become INS_Btn1 + _ani = INS_Btn1_ani 

    // Now you need to let the movieclip with the name "INS_Btn1_ani" play 
    this[targetName].gotoAndPlay("Active"); 
} 
+0

感谢您的回答,并且您认为是正确的。这清除了我的错误,为什么它没有工作。 :) – Bishop

+0

更不用说,单击的对象可能不是按钮本身(可能是按钮内的文本),所以使用'event.currentTarget'。 –

+0

这是一个很好的观点:) – Philarmon

0

所以,如果有人在这里相同/相似的问题的理解从Philarmon我已经解决了这个问题的答案后,是我做了什么得到它的工作:

var targetName:String; 
var _userInput:String = new String(); 
_userInput = targetName; 

//array for buttons MCs 
var btnArray:Array = [INS_btn1, INS_btn2]; 
var aniArray:Array = [INS_btn1_ani, INS_btn2_ani]; 

//add eventlistiners 
for(var i:uint=0; i<btnArray.length; i++) { 
btnArray[i].addEventListener(MouseEvent.ROLL_OVER, bRollover); 
btnArray[i].addEventListener(MouseEvent.ROLL_OUT, bOut); 
btnArray[i].addEventListener(MouseEvent.CLICK, bClick); 
btnArray[i].buttonMode=true; 
} 

//btn over state 
function bRollover(event:MouseEvent):void{ 
targetName = event.currentTarget.name + "_ani"; 
this[targetName].gotoAndPlay("Over"); 

} 
//btn out state 
function bOut(event:MouseEvent):void{ 
targetName = event.currentTarget.name + "_ani"; 
this[targetName].gotoAndPlay("Out"); 
} 
//on clicked 
function bClick(event:MouseEvent):void{ 
//add listeners for unclicked 
for (var i:uint=0;i<btnArray.length; i++){ 
    btnArray[i].addEventListener(MouseEvent.ROLL_OUT, bOut); 
    btnArray[i].addEventListener(MouseEvent.ROLL_OVER, bRollover); 
    //stopping animation 
    aniArray[i].gotoAndStop("Out"); 
} 

//remove Eventlistener when clicked 
event.target.removeEventListener(MouseEvent.ROLL_OUT, bOut); 
event.target.removeEventListener(MouseEvent.ROLL_OVER, bRollover); 

targetName = event.currentTarget.name + "_ani"; 
this[targetName].gotoAndStop("Active"); 
} 

正如你可以看到我已经添加了“粘”函数让mc保持点击状态。

+0

为什么每次点击都添加更多的事件监听器?您已经在开始时为所有按钮添加了所有必需的事件侦听器。如果每次点击添加的次数越来越多,则会为每个事件侦听器执行回调函数。这意味着,如果你点击一个按钮5次,然后滚动bOut methoid将被连续调用5次,这是没有意义的,对内存和性能不利:) – Philarmon

+0

嗯,好点。我想我是这样做的,为先前点击过的按钮读取eventlistener,以便它再次变为可点击。我看到我需要做一个优化。 – Bishop