AS3 在执行 gotoAndPlay("abc") 之前被点击后编辑 event.target;

AS3 Editing event.target after being clicked befor executing gotoAndPlay("abc");

问候 Whosebug 成员,

我在一个动画片段中嵌套了 3 个动画动画片段。我想要做的是获取单击实例的名称并在应用 gotoAndPlay 之前对其进行编辑。我可以得到这个名字,但每当我尝试编辑它时,我都会收到错误:

符号 'Buttons MC',图层 'Actions',第 1 帧,第 30 行 1061:通过静态类型 String 的引用调用可能未定义的方法 gotoAndPlay。

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

   [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应该去播放另一个MC的动画。最好我应该提到我是 AS3 的初学者。

targetName 是一个字符串,当然您不能在字符串上执行 gotoAndPlay :) 除此之外,event.target 将 return 您点击的对象而不是它的名称。 targetName 不需要是可绑定的,如果你除了这段代码之外没有对它做任何特殊的事情。

所以我假设您希望在单击 INS_Btn1 按钮时播放实例名称为 INS_Btn1_ani 的动画片段?首先,确保您的按钮设置了名称 属性(为方便起见,将名称也设置为 "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");
}

所以在了解了Philarmon的回答后,我的问题就解决了。如果有人遇到 same/similar 问题,这是我为使其正常工作所做的工作:

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");
}

如您所见,我添加了一个 "sticky" 函数来保持 mc 处于点击状态。