as3声音类卸载声音

时间:2011-12-27 03:32:05

标签: actionscript-3 audio flash-cs5

我已经尝试过这个小时了。必须有一个简单的解决方案来停止声音并在as3中卸载它。

这不是我的所有代码,但简而言之,我正在加载随机声音。我需要certian vars不在函数中,所以我可以用进度条的其他函数来引用它们。

如何卸载声音,以便我可以使用相同的名称加载新声音而不会在第二次调用时出现错误?

我在这个测试中有两个按钮。播放声音和停止声音按钮。

这是我的代码:

var TheSound:Sound = new Sound();
var mySoundChannel:SoundChannel = new SoundChannel();

PlayButton.addEventListener(MouseEvent.CLICK, PlaySound);
StopButton.addEventListener(MouseEvent.CLICK, Stopsound);

function PlaySound(e:MouseEvent)
        {
        TheSound.load(new URLRequest("http://www.MyWebsite.com/Noel.mp3"));
        mySoundChannel = TheSound.play(0);
        }

function StopSound(e:MouseEvent)
        {
        delete TheSound;
        }

这是我得到的错误:

Error: Error #2037: Functions called in incorrect sequence, or earlier call was unsuccessful.
    at flash.media::Sound/_load()
    at flash.media::Sound/load()
    at Untitled_fla::MainTimeline/PlaySound()[Untitled_fla.MainTimeline::frame1:21]

更新....我试图停止声音,然后将其卸载如下

mySoundChannel.stop();
TheSound.close();

但是现在我得到了这个错误:

Error: Error #2029: This URLStream object does not have a stream opened.
    at flash.media::Sound/close()
    at Untitled_fla::MainTimeline/shut1()[Untitled_fla.MainTimeline::frame1:35]

我相信我更接近了。非常感谢你们的帮助。

2 个答案:

答案 0 :(得分:3)

为了停止播放声音,首先必须告诉SoundChannel实例停止:

mySoundChannel.stop();

完成后,您可以通过调用close方法关闭声音实例使用的流:

TheSound.close();

此外,删除关键字很少在as3中使用,当某些方法尝试访问您要删除的变量时,不应该使用它。如果要处置当前分配给TheSound变量的实例,则应将其值设置为null。这样,flash会在找到合适的时间时正确地垃圾收集不再使用的旧Sound实例。

答案 1 :(得分:1)

您可以在函数外部初始化变量,但每次调用函数时都将其定义为新的Sound对象。这样它就具有全局范围,您可以随时加载新的URL。

var TheSound:Sound;
var mySoundChannel:SoundChannel = new SoundChannel();

PlayButton.addEventListener(MouseEvent.CLICK, PlaySound);
StopButton.addEventListener(MouseEvent.CLICK, StopSound);

function PlaySound(e:MouseEvent)
        {
        TheSound = new Sound();
        TheSound.load(new URLRequest("http://www.MyWebsite.com/Noel.mp3"));
        mySoundChannel = TheSound.play(0);
        }

function StopSound(e:MouseEvent)
        {
        mySoundChannel.stop();
        TheSound.close()
        }