ActionSctipt 3.0错误:

时间:2017-02-25 17:15:06

标签: actionscript-3 flash

我在尝试动态访问该符号时遇到了麻烦,我有9个按钮都调用了这个方法,并且它们传递了它们的位置(tl,t,tr等)我试过了这个方法之前在另一个程序上工作没有问题,但在这个程序中失败了。

我正在尝试访问符号调用s_tl(示例位置),但我得到的所有内容都是未定义的(请参阅结果)。

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()

1 个答案:

答案 0 :(得分:1)

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

请解释您尝试使用该代码实现的目标,以便我们可以解开它并以不那么扭曲的方式重写。

哦,我基本上认为你在做Tic Tac Toe。现在,准则。单元格必须包含3个框架:按钮图形的第1帧, X 的第2帧和第3帧<和 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);
}