在 AS3 中向子影片剪辑添加/删除事件侦听器

Posted

技术标签:

【中文标题】在 AS3 中向子影片剪辑添加/删除事件侦听器【英文标题】:Add/Remove Event Listener to/from child Movie Clip in AS3 【发布时间】:2013-03-28 08:01:04 【问题描述】:

简而言之,这是我想要完成的:

    点击影片剪辑,添加子项 点击子影片剪辑,播放声音 再次点击孩子,停止声音 第三次点击子项,删除子项

遗憾的是,我只完成了第 1 步。我已经弄清楚了如何在单击父影片剪辑时播放声音(我正在使用链接),但是当我尝试相同之后与孩子一起,我收到以下错误:

TypeError: Error #1010: A term is undefined and has no properties.(我不再收到此错误)

场景 1,图层“动作”,第 1 帧,第 29 行 1120:访问未定义的属性 newBox。

leftBox.addEventListener(MouseEvent.CLICK, addBox); 函数添加框(事件:鼠标事件):无效 var newBox:right_box = new right_box(); addChild(newBox); 新盒子.x = 0; 新盒子.y = 0; newBox.width = leftBox.width; newBox.height = leftBox.height /2; newBox.addEventListener(MouseEvent.CLICK, playSound); 函数播放声音(事件:事件) var mySound:testSound = new testSound(); mySound.play();

任何帮助将不胜感激。

谢谢!

(P.S. 我是 n00b,所以拜托,乖一点!)

【问题讨论】:

请添加您认为有问题的代码sn-p。 @Ihsan,我刚刚添加了 sn-p。但问题肯定是 playSound 功能。当我将其注释掉时,一切正常。 【参考方案1】:

您正在尝试在 newbox 创建之前将事件侦听器添加到它。尝试如下:

// mySound should be availible in scope
var mySound:testSound = new testSound();

// newBox also
var newBox:right_box;
// here is a channel for you
var channel: SoundChannel;

// ok this adds the first listener...
leftBox.addEventListener(MouseEvent.CLICK, addBox);


function addBox(event:MouseEvent):void 
    newBox = new right_box();
    addChild(newBox);
    newBox.x = 0;
    newBox.y = 0;
    newBox.width = leftBox.width;
    newBox.height = leftBox.height /2;
    // you should add listener here...
    newBox.addEventListener(MouseEvent.CLICK, playSound);
    // you have to avoid multiple newBoxes on each other and
    // leaving the older ones under..
    // So stop listening to the newBox generating event: 
    leftBox.removeEventListener(MouseEvent.CLICK, addBox);


function playSound(event:Event)
    channel = mySound.play();
    // On next click you want sound to stop so
    // First remove the old listener to avoid play over:  
    newBox.removeEventListener(MouseEvent.CLICK, playSound);
    // and hook listener to stop method
    newBox.addEventListener(MouseEvent.CLICK, stopSound);
 

 function stopSound(event:Event)
    channel.stop();
    // On next click you want to remove newBox 
    // First remove the old listener to avoid play over:  
    newBox.removeEventListener(MouseEvent.CLICK, stopSound);
    newBox.addEventListener(MouseEvent.CLICK, removeNewBox);
 

 function removeNewBox(event:Event)
    // First remove the listener :  
    newBox.removeEventListener(MouseEvent.CLICK, removeNewBox );
    removeChild(newBox); // now remove from display list
    newBox = null; // make contents eligible for garbage collection 
 

【讨论】:

嗯,现在我在“newBox.removeEventListener(MouseEvent.CLICK, playSound);”上得到一个“1120:未定义属性 newBox 的访问”。 因为你已经将它定义为一个函数中的 var 所以,它在函数范围之外是不可用的(符号 newBox 指向任何东西)... 我在想这可能是我的问题的一部分!但是由于我将它与 MouseEvent 一起使用,那么什么语法才有意义? 一般来说,你必须学习作用域的概念... 在这个上下文中,作用域是指来自不同代码层次结构的变量和方法的可见性或可访问性。我认为它现在会起作用。试一试。 谢谢,我从来没有想过简单地声明变量!我想我需要函数之外的 newBox,但我想我需要一双更有经验的眼睛......它可以工作,除了stop();。我想我必须创建一个新的声道。会尝试并报告。

以上是关于在 AS3 中向子影片剪辑添加/删除事件侦听器的主要内容,如果未能解决你的问题,请参考以下文章

如何从导入到数组的 png 中创建影片剪辑?

如何使用事件侦听器来加载动画片段的循环

flash AS3 如何删除舞台事件侦听器

在舞台 AS3 上放置多个影片剪辑实例

AS3 删除动态创建的子影片剪辑

为 SWF 扩展面板添加关闭和更改 FLA 文档的事件侦听器。使用 ActionScript、JSFL