【问题标题】:Pass an argumment function MouseEvent传递参数函数 MouseEvent
【发布时间】:2015-04-16 15:45:54
【问题描述】:

我想多次调用函数“clica”,但要更改 gotoAndStop (“gotoAndStop(x)”) 中的帧数。如何将值 x 传递给函数 clica?谢谢

 stop();

jogar.addEventListener(MouseEvent.CLICK, clica);

function clica(e:MouseEvent):void{
    gotoAndStop(2);
}

【问题讨论】:

  • 您能否更具体地说明您想要“更改帧数”的方式?您希望它随着每次点击而增加吗?您是否有不同的按钮,每个按钮都转到不同的框架?
  • 查看该答案,问题与stackoverflow.com/questions/14028444/… 相同,您不能对原生事件使用第一种方法,但第二种方法可以使用
  • 我不想写两个这样的函数...我只想要一个函数 jogar.addEventListener(MouseEvent.CLICK, clica); jogar2.addEventListener(MouseEvent.CLICK,clica2);函数 clica(e:MouseEvent):void{ gotoAndStop(2); } 函数 clica2(e:MouseEvent):void{ gotoAndStop(3); }

标签: function actionscript-3 flash parameters arguments


【解决方案1】:

好的,您的目标是转到某个帧,具体取决于导致MouseEvent 的原因。

这样做的一种方法是保存什么对象对应于什么帧。 把它想象成电话簿。它将一个人与一个要呼叫的号码相关联。

要在 actionscript 中创建这样的“电话簿”,您需要使用字典。首先像这样添加所有关联:

var object2frame:Dictionary = new Dictionary();
object2frame[play] = 2; // associate play with the number 2
object2frame[play2] = 3;

免责声明:我将您的非英文标识符替换为英文标识符。您应该始终用英语编写代码。这使不懂您的语言的人更容易阅读代码。习惯就好。

解决方案的第二部分是currentTargetEvent 对象的一个​​属性,它引用了导致Event 的对象。 我希望你现在能看到这是如何结合在一起的:

  1. 如果函数被调用,首先要找出是谁造成的,即 点击了什么对象。
  2. 了解事件的来源,使用该信息查找 您应该在字典中找到的框架。
  3. 转到那个框架。

代码如下所示:

var object2frame:Dictionary = new Dictionary();
object2frame[play] = 2; // associate play with the number 2
object2frame[play2] = 3;

play.addEventListener(MouseEvent.CLICK, click);
play2.addEventListener(MouseEvent.CLICK, click);

function click(e:MouseEvent):void
{
    gotoAndStop(object2frame[e.currentTarget]);
}

这个问题还有其他解决方案。

【讨论】:

  • 自定义事件是最干净的解决方案,但许多人因为缺乏理解或简单的懒惰而忽略了它。
  • @BotMaster 我完全同意。您认为我应该在末尾扩展“还有其他解决方案”部分以明确包含此内容,还是您的评论足以为感兴趣的读者提供提示?
  • @BotMaster - 你能展示一个自定义鼠标点击事件的例子吗?
【解决方案2】:

假设jogarMovieClip(或任何动态类实例),您可以为其分配属性,例如单击时应导航到哪个框架,然后使用event.currentTarget 在事件处理程序中检索其属性.例如:

jogar1.targetFrame = 1;
jogar2.targetFrame = 2;
jogar3.targetFrame = 3;

jogar1.addEventListener(MouseEvent.CLICK, clica);
jogar2.addEventListener(MouseEvent.CLICK, clica);
jogar3.addEventListener(MouseEvent.CLICK, clica);

function clica(e:MouseEvent):void {
    var targetFrame:int = e.currentTarget.targetFrame;
    gotoAndPlay(targetFrame);
}

您可以通过将设置包装在一个函数中来进一步减少这种情况:

function setupJogar(jogar:MovieClip, targetFrame:int):void {
    jogar.targetFrame = targetFrame;
    jogar.addEventListener(MouseEvent.CLICK, jogarClick);
}

function jogarClick(e:MouseEvent):void {
    gotoAndStop(e.currentTarget.targetFrame);
}

setupJogar(jogar1, 1);
setupJogar(jogar2, 2);
setupJogar(jogar3, 3);
// ...etc

【讨论】:

  • 字典属性也是动态属性。 ;) 这里唯一真正的区别是属性与目标相关联,而不是单独的属性持有者。如果您不想使用动态属性,请声明一个具有属性targetFrame 的类并将其链接到jogar 对象。
  • 是的,那将是一个更好的方法。应该澄清一下,对我来说,它更多的是在编译时检查动态对象。如果你拼错了定义的字典对象,你会得到一个编译器错误。如果你拼错了“targetFrame”,你会得到一个运行时错误。当然,在宏伟的计划中没有那么大的差异。
  • @Aaron 我完全同意,两种解决方案都依赖于动态属性。我发布了字典解决方案,因为它适用于非动态的“MouseEvent”调度程序。除此之外,它们几乎相同。
猜你喜欢
  • 2015-06-08
  • 2013-01-27
  • 2021-04-13
  • 2015-10-22
  • 2014-01-24
  • 2013-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多