電子書籍の厳選無料作品が豊富!

play_btnとstop_btnの二つのボタンを作り、
それぞれ再生と停止ができるようにしました。
再生繰り返し回数は1回です。
そこで、play_btnをクリックし再生します。
再生が終わってから、再びplay_btnをクリックしても再生しません。
play_btnをクリックし再生してから、
stop_btnをクリックし停止させ、
再度play_btnをクリックすると再生します。
連続してplay_btnをクリックしたときには、
再生中の場合は再生を停止し新たに再生させるようにしないといけないんだろうなとおもうのですが、、。
どうスクリプトを記述すれば良いかよく分からないので、
どなたか教えていただければ幸いです。


var soundCh:SoundChannel;
var snd:Sound = new BGM();
play_btn.addEventListener(MouseEvent.CLICK, PlayClick);
stop_btn.addEventListener(MouseEvent.CLICK, StopClick);
//イベントハンドラ定義
function PlayClick(evt:MouseEvent):void {
if (soundCh == null){
soundCh = snd.play(0,1);
}
}

function StopClick(evt:MouseEvent):void {
if (soundCh != null){
soundCh.stop();
soundCh = null;
}
}

A 回答 (1件)

ご提示のスクリプトですと、「停止」ボタン操作で停止した場合は、StopClick 関数内で「変数 soundCh の値を null にする」処理が行われます。


ですから、その後で再度「再生」ボタンをクリックすると、PlayClick 関数内の if 文の条件である「 soundCh の値が null の時」が成立して、サウンドが再生されます。
しかし、曲の最後に達して再生が終了した場合は、soundCh には再生に使用されたチャンネルを操作するための情報が入っています。
この状態で「再生」ボタンをクリックしても、soundCh の値が null ではないために PlayClick 関数内の if 文の条件が成立せず、再生されないのですが、「停止」ボタンをクリックすると soundCh が null に書き換えられて再生できるようになる、というわけです。

最後まで再生された後も再生できるようにするには、曲の最後に達した時にも soundCh の値を null に戻す処理が必要です。
曲の最後に達したかどうかは、SOUND_COMPLETE というイベントを使って検出できます。


soundCh の値を操作して再生中かどうかを判断することも可能ではあるのですが、稼働しているオブジェクトの参照を持っている soundCh の値を null に書き換えてしまうのは、少々乱暴だと思います。
代わりに、再生中かどうかの情報を持つ変数を作り、こちらで判断してはいかがでしょう。

次のように考えます。
再生しているかどうかの情報を管理する変数を1つ、用意します。ここでは仮に、play_flg という名前だとします。
この変数の値を、再生している時 true 、それ以外の時は false と決めます。今回は扱いたい情報が2種類しかないので、Boolean というデータ型にします。
「再生」ボタンがクリックされた時は、この変数の値を見て、false の時だけ再生します。
再生した場合は、再生中の印として true を入れます。すると、再生中に連続してクリックされても再生の条件が不成立になり、重複再生を防ぐことができます。
「停止」ボタンをクリックした時と曲の最後に達した時は、false に書き換えます。


スクリプトの一例です。
ライブラリにリンケージでクラス名”BGM”を設定したサウンドシンボル、ステージにインスタンス名”play_btn”と”stop_btn”と付けたインスタンスがあるものとします。

(↓ 各行頭に全角のスペースが入っています。コピーする際は、全て半角のスペースかタブに置き換えてください)


//***

 import flash.media.*;


 //再生状況を保持するフラグ
 //再生時true、それ以外はfalse
 var play_flg:Boolean = false;

 //チャンネルとSoundオブジェクトの作成
 var soundCh:SoundChannel;
 var snd:BGM = new BGM();


 //「再生」ボタンによる再生処理
 function PlayClick( evt:MouseEvent ):void
 {
  //停止している場合のみ、再生する
  if( play_flg == false )
  {
   //サウンドを再生
   soundCh = snd.play( 0 , 1 );

   //再生が終了した時のイベント処理を登録
   soundCh.addEventListener( Event.SOUND_COMPLETE , PlayEnd );

   //再生中であることを記録する
   play_flg = true;
  }
 }

 //「停止」ボタンによる停止処理
 function StopClick( evt:MouseEvent ):void
 {
  //再生中であれば停止する
  if( play_flg == true )
  {
   //サウンドを停止
   soundCh.stop();

   //再生終了時のイベント処理を削除しておく
   soundCh.removeEventListener( Event.SOUND_COMPLETE , PlayEnd );

   //停止したことを記録する
   play_flg = false;
  }
 }

 //再生が終了した時の処理
 function PlayEnd( evt:Event ):void
 {
  //フラグをリセット
  play_flg = false;
 }


 //各ボタンのイベント処理を登録
 play_btn.addEventListener( MouseEvent.CLICK , PlayClick );
 stop_btn.addEventListener( MouseEvent.CLICK , StopClick );

//***
    • good
    • 0
この回答へのお礼

ご回答いただきましてありがとうございました!
すごく分かりやすく助かりました。

お礼日時:2011/06/07 11:37

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!