我正在制作一个音板,我正在使用动作脚本。我希望有一个功能与代码播放不同的声音取决于按下哪个按钮。我也将从图书馆而不是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个函数。我宁愿每个按钮都有某种标识符,在函数中我可以使用按钮名称或标识符来分配合适的声音。
答案 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();
}