これは、実際にオーディオを一時停止するか、オーディオを停止するか、単にオーディオをミュートするかによって異なります。それぞれ用途が異なります。
ただし、使い方としては、「ミュート」ボタンを使用したいようです。確かに、これを行うにはいくつかの方法があります。私がお勧めするのは、オーディオ専用の AS3 クラスを作成することです。次に、このクラスをドキュメント クラス内に設定します。
[ファイル] --> [新規...] に移動し、[ActionScript 3.0 クラス] を選択します。「gamesounds.as」という名前を付けます。[保存] をクリックする前に、.fla と同じディレクトリに新しいフォルダーを作成します。このフォルダに「gamecore」という名前を付けて、その中に「gamesounds.as」を保存します。これを行った理由は、この種のカスタム クラスをすべて一緒に保持する必要があるからです。
さて、クラスの基本構造は次のとおりです。
package gamecore
{
public class GameSounds
{
//constructor code
}
}
他のことを行う前に、ゲームがこのクラスにアクセスできることを確認する必要があります。クラスの主要な機能が損なわれるため、100 万個のコピーを作成することは望ましくありません。ドキュメント クラスを開きます (新しいドキュメント クラスの作成は、この回答の範囲外です。調べてください)。もちろん、ドキュメント クラスはゲームコア フォルダーと同じディレクトリにある必要があります (ゲームコア フォルダーではありません)。
ドキュメント クラスのクラス宣言の上に、次のコード行を入力します。
import gamecore.GameSounds;
次に、クラス宣言内に次の行を入力します。
public static var GameSounds:GameSounds = new GameSounds();
もちろん、保存してから、gamesounds.as ファイルに戻ります。使用するコードは次のとおりです。さまざまなコードが何をするかを説明するためにコメントを追加しました。
すべての曲を .fla のライブラリにインポートし、actionscript バインディングを作成したと仮定しています。ここでは触れませんが、外部で曲を再生するためにこれを変更することもできます。
以下は置き換える必要があります//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();
}
これで、.fla 自体で 2 つの関数を使用するだけで済みます。「DocClass」がドキュメント クラスの名前であると仮定します。各ステージの開始時に、このコード行を呼び出し、引数の「1」をステージ番号 (または、そのルートを選択した場合は名前) に置き換えます。
DocClass.GameSounds.startMusic(1);
効果的に音楽が始まりますが、音楽がミュートに設定されていない場合にのみ聞こえます。
このコードをミュート ボタンに追加してミュートし、「true」を「false」に置き換えてミュートを解除します。
DocClass.GameSounds.setMute(true);
-- 一時停止ボタンに関しては、この質問は個別に質問する必要があります。音楽をループするつもりなら、SoundChannel を使用しているときに音楽を一時停止すると、最後に一時停止した時点から音楽がループするという問題が発生します。
お役に立てば幸いです。私は自分のプロジェクトでこの種のコードを 1 年以上使用してきましたが、問題が発生したことはありません。