• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Action Script3.0で曲の再生と停止)

Action Script3.0で曲の再生と停止

このQ&Aのポイント
  • Action Script3.0を使用して、再生と停止ができるボタンを作成しました。
  • 再生ボタンをクリックすると曲が再生され、停止ボタンをクリックすると曲が停止します。
  • 連続して再生ボタンをクリックした場合は、再生中の曲を停止して新たに再生します。

質問者が選んだベストアンサー

  • ベストアンサー
  • DPE
  • ベストアンサー率85% (666/776)
回答No.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 ); //***

yuyumamayaya
質問者

お礼

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

関連するQ&A

専門家に質問してみよう