2012-06-19 57 views
1

我的問題是,如何暫停"scene 1"中的音頻,並讓它進入"scene 3"(它將附加一個不同的音頻文件,該音頻文件將會播放),但仍然會使音頻靜音,但是當您點擊在「on」按鈕上播放相應的歌曲,有點像遊戲中你可以在主菜單中將音樂靜音,但在整個遊戲過程中取消靜音;AS3代碼暫停和播放閃光燈中的「整體」音頻(從場景到場景)?

而且一般我會怎樣做一個播放/暫停按鈕(我假設的「if else」的聲明可能會奏效,但不能肯定)

+0

我回答了你的問題,但我確實想給你一個關於以前遇到的場景的嚴重問題:http://stackoverflow.com/q/8767332/472647 – CodeMouse92

回答

0

首先包括SoundMixer類:

進口閃光。 media.SoundMixer;

然後停止聲音調用STOPALL方法:

SoundMixer.stopAll();

+0

這實際上會停止音樂,而不是暫停它。 – CodeMouse92

1

這實際上取決於您是要實際暫停音頻,停止音頻,還是隻是將音頻靜音。每種都有不同的用途。

但是,對於您的使用,聽起來您會想要使用「靜音」按鈕。我敢肯定,有很多方法可以做到這一點。我建議創建一個專門用於音頻的AS3類。然後,您需要在文檔類中設置此類。

轉到文件 - >新建...並選擇ActionScript 3.0類。將其命名爲「gamesounds.as」。在點擊保存之前,在.fla的同一目錄中創建一個新文件夾。將該文件夾命名爲「gamecore」,然後在其中保存「gamesounds.as」。我剛纔那樣做的原因是,你會想把所有這些類的定製類放在一起。

現在,這裏爲你的類的基本結構:

package gamecore 
{ 
    public class GameSounds 
    { 
     //constructor code 
    } 
} 

之前,我們做任何事情,我們需要確保我們的遊戲將能夠訪問這個類。我們不想創建一百萬份,因爲這會破壞課程的主要功能。打開你的文檔類(創建一個新的文檔類不在這個答案的範圍內,查找它。)當然,文檔類必須與gamecore文件夾(不在gamecore文件夾中)在同一個目錄中。

在上面的文檔類的類聲明,進入這行代碼:

import gamecore.GameSounds; 

然後,你的類聲明中,進入這一行:

public static var GameSounds:GameSounds = new GameSounds(); 

保存,顯然,然後回到你的gamesounds.as文件。這是您要使用的代碼。我已添加註釋以說明不同代碼的作用。

我假設你已經將所有歌曲導入到.fla的庫中,並創建了它們的動作綁定。你也可以修改這個在外部播放歌曲,但我不會在這裏進入。

以下應更換//constructor code

import flash.media.Sound; 
import flash.media.SoundChannel; 
import flash.media.SoundTransform; 

//Create a variable to indicate whether the music is muted. 
var isMuted:Boolean = false; 

/*Create a string variable for the name of the song that should be playing. Alternatively, you could just name this an int and store the scene number. It all depends on what you want to do.*/ 
var songName:String; 

//Create a sound channel for playing audio. 
var musicChannel:SoundChannel = new SoundChannel(); 

//Import your songs. 
var fooForYou:Sound = new fooForYou(); 
var iveBeenAFoo:Sound = new iveBeenAFoo(); 
var pityTheFoo:Sound = new pityTheFoo(); 

/*This function sets the target song based on location. Just pass it the integer of the stage. Alternatively, you can make this work with the stage name as a String.*/ 
function startMusic(targetScene:int):void 
{ 
    /*Depending on the targetScene number, set the correct song name. Note these match the song declarations above.*/ 
    switch(targetScene) 
    { 
     case 1: 
      songName = "fooForYou"; 
     break; 
     case 2: 
      songName = "iveBeenAFoo"; 
     break; 
     case 3: 
      songName = "pityTheFoo; 
     break; 
    } 
    //Start the actual music playing. 
    playMusic(); 
} 

/*This function starts the music itself. Keep it separate, in case you need to bypass the startMusic code for some reason.*/ 
function playMusic():void 
{ 
    //I'd imagine you want your music looped, so int.MAX_VALUE accommodates for that. 
    musicChannel = this[songName].play(0, int.MAX_VALUE); 

    //Mute or unmute depending on that variable above. 
    adjustVolume(); 
} 

//This function mutes or unmutes depending on the variable condition. 
function adjustVolume():void 
{ 
    //We create a SoundTransform. 
    var transform:SoundTransform = musicChannel.soundTransform; 

    //We set the volume to 0 or 1, depending on the isMuted variable. 
    if(isMuted) 
    { 
     transform.volume = 0; 
    } 
    else 
    { 
     transform.volume = 1; 
    } 

    //We apply the transform to the song. 
    musicChannel.soundTransform = transform; 
} 

/*This function is present for convenience's sake. Calling this adjusts the variable AND the music that is currently playing.*/ 
function setMute(mute:Boolean):void 
{ 
    //Sets the isMuted variable to the mute argument. 
    isMuted = mute; 

    //Mutes or unmutes the currently playing sound. 
    adjustVolume(); 
} 

現在,你只需要在你的根本身使用兩種功能。我將假設「DocClass」是您的文檔類的名稱。在每一個階段的開始,稱這行代碼,用級數替換「1」,在參數(或名稱,如果你選擇了這條路。)

DocClass.GameSounds.startMusic(1); 

這將啓動音樂有效,但只有在音樂未設置爲靜音時才能聽到。

將此代碼添加到您的靜音按鈕進行靜音,將「true」替換爲「false」以取消靜音。

DocClass.GameSounds.setMute(true); 

- 在關於暫停按鈕,這個問題應該分開詢問。我會告訴你,如果你打算循環你的音樂,在使用SoundChannel時暫停它會給ya帶來麻煩,因爲音樂會從上次暫停的那一刻開始循環播放。

我希望這對你有幫助!在我的項目中,我已經使用了這種代碼一年多了,而且我從來沒有遇到過任何問題。