ActionSctipt 3.0 Error:
ActionSctipt 3.0 Error:
我在尝试动态访问符号时遇到了真正的问题,我有 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()
你的问题是错误的代码风格。您在函数 turn() 中定义了未命名的解除绑定函数,这就是问题的根源所在。如您的跟踪所示,取消绑定函数存在于全局寻址上下文中,并且与函数 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);
}
我在尝试动态访问符号时遇到了真正的问题,我有 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()
你的问题是错误的代码风格。您在函数 turn() 中定义了未命名的解除绑定函数,这就是问题的根源所在。如您的跟踪所示,取消绑定函数存在于全局寻址上下文中,并且与函数 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);
}