Actionscript 3 ActionSctipt 3.0错误:

Actionscript 3 ActionSctipt 3.0错误:,actionscript-3,flash,Actionscript 3,Flash,我在尝试动态访问符号时遇到了真正的问题,我有9个按钮都调用这个方法,它们传递它们的位置tl、t、tr等。我以前在另一个程序上尝试过这个方法,它可以正常工作,但在这个程序中失败了 我试图访问一个符号调用s_tl示例位置,但得到的只是未定义的see结果 function turn(btn : String):Function { return function(e:MouseEvent) { var players_turn : int; var chosen : String =

我在尝试动态访问符号时遇到了真正的问题,我有9个按钮都调用这个方法,它们传递它们的位置tl、t、tr等。我以前在另一个程序上尝试过这个方法,它可以正常工作,但在这个程序中失败了

我试图访问一个符号调用s_tl示例位置,但得到的只是未定义的see结果

function turn(btn : String):Function {
return function(e:MouseEvent) {
    var players_turn : int;
    var chosen : String = "s_" + btn;

    trace(this);
    trace(this[chosen]);
    trace(chosen);
    trace(this[chosen]);
    // if crosses turn 0 else 1
    if (s_c.currentFrame == 1) {
        players_turn = 0;
    } else {
        players_turn = 1;
    }       

    // check who's turn it is if it's been pressed before
    if (players_turn == 0 && this[chosen].visible == false) {
        this[chosen].gotoAndStop(1);
        this[chosen].visible = true;
    } else {
        this[chosen].gotoAndStop(2);
        this[chosen].visible = true;
    }
};
}
结果:

[object global]
undefined
s_br
undefined
TypeError: Error #1010: A term is undefined and has no properties.
    at MethodInfo-6()

你的问题是糟糕的代码风格。在函数turn中定义未命名的unbind函数,这就是问题的根源所在。正如跟踪所示,取消绑定函数存在于全局寻址上下文中,并且与函数turn不同,它不绑定到任何特定的显示对象。您的按钮可能与turn位于同一寻址上下文中。参数btn在未命名函数中可用,因为ECMA标准指示,因此如果函数A创建函数B,则A的局部变量(包括参数)可以作为B中的局部变量使用,但这是一种非常糟糕的做法,它会使代码变得凌乱并引起头痛

请解释一下你试图用这些代码实现什么,这样我们就可以解开它,并以不那么扭曲的方式重写

好吧,我基本上认为你在做抽搐。现在,指南。一个单元格必须包含3帧:第一帧用于按钮图形,第二帧和第三帧用于X和O。按您的方式命名:s_1、s_2等

for (var i:int = 1; i < 10; i++)
{
    var aCell:MovieClip = getChildByName("s_" + i) as MovieClip;
    aCell.addEventListener(MouseEvent.CLICK, onTic);
}

function onTic(e:MouseEvent):void
{
    var playersTurn:int = s_c.currentFrame;
    var aCell:MovieClip = e.currentTarget as MovieClip;

    trace(aCell.name);

    // Now, the magic.
    aCell.gotoAndStop(playersTurn + 1);
    aCell.removeEventListener(MouseEvent.CLICK, onTic);
}

我正在跟踪一个新字符串,该字符串是“s_uz+btn”,它将为我提供试图访问的对象的名称?在我的关键帧上,有具有这些名称的符号。s_br是一个符号,我认为你必须这样做[s_br]?我不知道“这”是什么,我认为它是一个包含关键帧中所有对象的对象。如果没有,我如何访问上述对象之一?我已经这样编码了,这样我就可以避免使用9个单独的事件函数,这样我就可以使用一个函数并传入一个id,这样我就可以检查按下了哪个按钮并显示正确的符号。另外,在nowField e.currentTarget包含事件来源之前,我从未在ActionScript中编写过任何代码。如果你订阅了9个按钮的一种方法,你就可以知道哪个按钮被按下了。不久前我也解释了同样的事情:好吧,这是可行的,但是我试图避免同时使用一个大开关,我似乎无法访问currentTarget的名称,将其更改为s_u并使用这个[string]。它将保存9个大小写的switch语句,并将其简化为字符串赋值。还是我应该避免这样?还有,谢谢你,最后一件事非常重要helpful@Zachary你需要把它变成线吗?因为如果您想处理按下的对象,只需将其键入一个变量,例如var aButton:MovieClip=e.currentTarget as MovieClip;