0

我正在制作音板,并且正在使用动作脚本。我想要一个带有代码的功能,可以根据按下的按钮播放不同的声音。我还将从库而不是 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 个不同的类。我宁愿每个按钮都有某种标识符,并且在函数中我可以使用按钮名称或标识符来分配适当的声音。

4

3 回答 3

1

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

因此,如果您的音效类名称是sfx_jump,您将命名您的实例:

sfx_jump_btn  

然后你像这样设置你的事件监听器:

sfx_jump_btn.addEventListener(MouseEvent.CLICK, clickHandler);

您想要在 clickHandler 函数中做的是首先根据按钮名称属性生成您的 className 字符串。然后您通过使用 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;
于 2013-01-01T18:33:41.720 回答
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();
}
于 2013-01-01T17:15:57.723 回答
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();
}
于 2013-01-01T17:49:02.157 回答