Flash AS3:如何创建一个功能来播放不同按钮的声音?

时间:2013-01-01 16:18:47

标签: actionscript-3 flash

我正在制作一个音板,我正在使用动作脚本。我希望有一个功能与代码播放不同的声音取决于按下哪个按钮。我也将从图书馆而不是URL播放。这里有一些真正的代码与伪混合我想做的事情:

var soundEffect:SoundEffect = new SoundEffect();

sound1_btn.addEventListener(MouseEvent:CLICK, buttonName, playSoundEffect); //possible?

function playSoundEffect(e:Event, buttonName):void {
    soundEffect.attachSound = buttonName + ".mp3"  //pseudo code
    soundEffect.play();
}

SoundEffect类只是我在Linkage中使用的名称。我不知道更改类所代表的声音的最佳方法,或者一般来说最好的方法。理想情况下,我想创建50个不同的类,包含50个不同的声音变量和50个函数。我宁愿每个按钮都有某种标识符,在函数中我可以使用按钮名称或标识符来分配合适的声音。

3 个答案:

答案 0 :(得分:1)

如果您使用的是Button符号,则可以使用在按钮名称中对类名进行编码的命名约定。

因此,如果您的音效类名称为sfx_jump,则可以为您的实例命名:

sfx_jump_btn  

然后,您可以像这样设置事件监听器:

sfx_jump_btn.addEventListener(MouseEvent.CLICK, clickHandler);

您想在clickHandler函数中执行的操作是首先根据按钮name属性生成className String。然后通过使用getDefinitionByName获取类定义,以便您可以创建声音的实例,以下代码是您如何做到的:

public function clickHandler(e:MouseEvent):void
{
     var button:SimpleButton = e.target as SimpleButton;
     // use replace to clip off the _btn suffix
     var className:String = button.name.replace("_btn","");
     var SoundClass:Class = getDefinitionByName(className) as Class;
     var newSound:Sound = new SoundClass();
     newSound.play();
}

您还需要添加此导入:

import flash.utils.getDefinitionByName;

答案 1 :(得分:0)

是的,你可以做到。由于您有多个按钮将属性附加到每个按钮,如下所示,我将'soundToPlay'属性附加到sound1_btn。

sound1_btn.soundToPlay = "1.mp3";
sound1_btn.addEventListener( MouseEvent.CLICK, handleBtnClick);

function handleBtnClick( e:Event ):void{
    soundEffect.attachSound = e.target.soundToPlay;
    soundEffect.play();
}

答案 2 :(得分:0)

@hrehman有你的答案,但如果你的按钮类没有属性soundToPlay,你可以使用name属性作为ID。并返回事件的currentTarget属性。

sound1_btn.name = "Sound1";
sound1_btn.addEventListener(MouseEvent:CLICK, playSoundEffect);

function playSoundEffect(e:Event):void {
    soundEffect.attachSound = e.currentTarget.name + ".mp3";
    soundEffect.play();
}