Flash 闪存AS3-鼠标事件
这真是个愚蠢的问题,但我真的不知道如何解决我的问题 我有一个函数Flash 闪存AS3-鼠标事件,flash,actionscript-3,actionscript,flash-cs5,Flash,Actionscript 3,Actionscript,Flash Cs5,这真是个愚蠢的问题,但我真的不知道如何解决我的问题 我有一个函数 public function backToSelect(evt:Event, i:Number):void { removeChild(back); switch(i) { case 1: removeChild(speel1); break; //etc
public function backToSelect(evt:Event, i:Number):void
{
removeChild(back);
switch(i) {
case 1:
removeChild(speel1);
break;
//etc
}
gotoAndStop('home');
}
我不知道如何调用这个函数。我试过了
back.addEventListener(MouseEvent.CLICK, backToSelect(1));
但flash抱怨道:
1067: Implicit coercion of a value of type int to an unrelated type flash.events:Event.
我意识到我的错误,在执行
backToSelect(1)
时跳过了第一个参数(即事件1)。但是,我不知道应该在那里放置什么来正确调用我的函数。我尝试了一切,从evt:MouseEvent
到MouseEvent
和其他东西。什么都没用。提前谢谢 如果您希望调用特定函数,以下是执行此操作的方法:
back.addEventListener(MouseEvent.CLICK,
function (evt:MouseEvent):void { backToSelect(evt, 1); } );
此包装函数语句是一个匿名函数,具有ActionScript所期望的MouseEvent.CLICK处理程序的确切签名。但是,正确的方法如下:
// somewhere else in your class, presumably...
function mouseEventHandler(evt:MouseEvent):void {
backToSelect(evt, 1);
}
back.addEventListener(MouseEvent.CLICK, mouseEventHandler);
这将使您能够在以后需要时删除处理程序。如果您希望调用特定函数,以下是执行此操作的方法:
back.addEventListener(MouseEvent.CLICK,
function (evt:MouseEvent):void { backToSelect(evt, 1); } );
此包装函数语句是一个匿名函数,具有ActionScript所期望的MouseEvent.CLICK处理程序的确切签名。但是,正确的方法如下:
// somewhere else in your class, presumably...
function mouseEventHandler(evt:MouseEvent):void {
backToSelect(evt, 1);
}
back.addEventListener(MouseEvent.CLICK, mouseEventHandler);
这将使您能够在以后需要时删除该处理程序。因此Flash中的事件系统有点过时了-当您使用“addEventListener()”时,您所说的是“嘿,当您得到类型为X的事件时,将该事件传递给我提供的函数。该函数接受单个参数,这就是我正在侦听的事件。” 实际上,您并不是在“addEventListener()”中进行函数调用-您应该传入backToSelect,而不是backToSelect()。区别在于第一个函数是对该函数的引用-您不是说“立即调用此函数!”!你的意思是“把它放在一边,在事件发生时使用它。” 那么这会给您带来什么呢?这是一个对Flash环境不熟悉的人非常常见的问题,解决方案也不一定显而易见。您要做的是找到一种方法,将您的数据与鼠标单击的目标关联起来。最简单的方法就是这样:
public function backToSelect(evt:Event):void
{
removeChild(back);
switch(e.currentTarget) {
case buttonOne:
removeChild(speel1);
break;
//etc
}
gotoAndStop('home');
}
如果没有更全面地了解您要做的事情,我很难更具体地建议您,但这是问题的根源。您可以将所有逻辑放入单击处理程序,也可以做一些更有趣的事情,例如创建一个将数字与按钮相关联的字典对象,然后只使用num=myDictionary[e.currentTarget]或其他什么
但是,是的,这正是核心所在。我希望这会有所帮助,如果您需要更具体的帮助,请告诉我!因此Flash中的事件系统有点过时了-当您使用“addEventListener()”时,您所说的是“嘿,当您得到类型为X的事件时,将该事件传递给我提供的函数。该函数接受单个参数,这就是我正在侦听的事件。” 实际上,您并不是在“addEventListener()”中进行函数调用-您应该传入backToSelect,而不是backToSelect()。区别在于第一个函数是对该函数的引用-您不是说“立即调用此函数!”!你的意思是“把它放在一边,在事件发生时使用它。” 那么这会给您带来什么呢?这是一个对Flash环境不熟悉的人非常常见的问题,解决方案也不一定显而易见。您要做的是找到一种方法,将您的数据与鼠标单击的目标关联起来。最简单的方法就是这样:
public function backToSelect(evt:Event):void
{
removeChild(back);
switch(e.currentTarget) {
case buttonOne:
removeChild(speel1);
break;
//etc
}
gotoAndStop('home');
}
如果没有更全面地了解您要做的事情,我很难更具体地建议您,但这是问题的根源。您可以将所有逻辑放入单击处理程序,也可以做一些更有趣的事情,例如创建一个将数字与按钮相关联的字典对象,然后只使用num=myDictionary[e.currentTarget]或其他什么
但是,是的,这正是核心所在。我希望这会有所帮助,如果您需要更具体的帮助,请告诉我!您不能在股票事件侦听器中传递自定义参数。这是只有自定义事件才能做的。您不能在股票事件侦听器中传递自定义参数。这是只有自定义事件才能做的。这会起作用,但是这不是最佳做法。将函数文本放入addEventListener()中调用是一个非常不好的习惯,因为它使跟踪在何处发生的事情变得越来越困难。这被称为匿名函数闭包,虽然它在某些情况下是一种有用的技术,但如果您不了解所有的含义,则使用它是危险的。这里介绍的第一个解决方案正是这样做的我想,但我并不真的想使用它,因为这被认为是不好的做法。第二个函数并不能让我达到我所能说的任何地方;因为我必须创建多个函数才能达到4个不同的级别?或者我错了吗?我同意,这有点复杂。如果你能重写你的函数以符合事件处理程序签名s、 没问题。请记住,这可能会为您节省一些时间和精力,以避免代码重复,因此,如果您希望在两个不同的位置调用一段代码,我建议您将其放置在一个函数中,并在单独的事件处理程序中调用它,仅在您需要它的时候使用。这会起作用,但这不是最佳做法将操作文字输入到addEventListener()中调用是一个非常不好的习惯,因为它使跟踪在何处发生的事情变得越来越困难。这被称为匿名函数闭包,虽然它在某些情况下是一种有用的技术,但如果您不了解所有的含义,则使用它是危险的。这里介绍的第一个解决方案正是这样做的我想,但我并不真的想用它,因为它被认为是不好的做法