要するに、サウンドシンボルの長さ(時間)と、現在再生中のポジションがどこであるかが分かればいいのではないでしょうか。
シンボルの長さは Sound クラスの duration 、再生ポジションは position というプロパティに入っています。
あとは Now Loading 画面のプログレスバーと同じ発想で、再生中のポジションが全体のどのあたりであるかを割合で出します。
この割合が算出できれば、ゲージ内をバーが伸びるようなタイプでも、Media Player などのようにマーカーが動いて位置を知らせるようなタイプでも、どのようなナビゲーションにも応用できます。
ここではとりあえず、マーカーが動いて位置を知らせるタイプのバーを考えます。
バーとマーカーを、それぞれムービークリップとして作ります。
バーのシンボルは中心点を左端に、マーカーはバーを指す部分(例えば▲のような形であれば、上の尖った部分)を中心点にしてください。
この2つのシンボルを、1つのシンボル内に配置します。
この時、バーの左端とマーカーの中心点が、それぞれ親の中心点 X = 0 の位置に来るように配置してください。
Y座標は関係ないので、デザインの都合で適当に決めて構いません。
仮に、親シンボルのインスタンスを「 navi 」とし、その中にバーの「 bar 」とマーカーの「 marker 」というインスタンスが含まれているとします。
サウンドシンボルの長さである duration は一定ですが、再生位置の position の値は常に変化しています。
そこで、ムービークリップがステージに存在している間常に発生している enterFrame イベントを使って、position の値を監視します。
どのムービークリップの enterFrame イベントを借りてもいいのですが、分かりやすいところで navi のイベントを借りることにします。
position も duration も単位はミリ秒ですから、単純に position を duration で割ると、現在どのあたりを再生しているかの割合を算出できます。
bar の中心点は左端で、bar と marker の中心点がそれぞれ親シンボルである navi の X = 0 の地点に配置されているものとしますと、marker の位置は、bar の幅x再生中の位置の割合で求めることができます。
音は Sound クラスで鳴らしますので、リンケージを設定してください。
スクリプトは、フレームとムービークリップインスタンス” navi ”の両方に設定します。
(↓各行頭に全角のスペースが入っています。コピーする際はご注意ください)
・フレームに設定するスクリプト
//Soundオブジェクトの生成と設定・再生
snd = new Sound();
snd.attachSound( "***" );
snd.onSoundComplete = function()
{
//再生終了時、自動的にループ
this.start();
};
snd.start();
・ムービークリップインスタンス” navi ”に設定するスクリプト
onClipEvent(enterFrame)
{
var sound_pos;
//現在の再生位置を取得し、全体のどのあたりを再生中かを算出
sound_pos = _root.snd.position / _root.snd.duration;
//再生位置の割合に応じて、マーカーを移動
marker._x = bar._width * sound_pos;
}
サウンドをループさせると、position は0に戻ります。
従って、ループするとマーカーもバーの左端に戻ります。
位置がおかしい場合は、中心点や bar と marker の配置がズレていないかどうか確認してみてください。
marker を bar に沿ってドラッグ可能にし、marker の _x 座標が bar の長さ( _width プロパティ)に対してどのあたりの位置にあたるのかを計算してこの割合を duration に乗算すると、サウンドシンボルのどこを再生すべきかが算出できます。
求めた位置を、前回 No.1621542 でご紹介しました要領で Sound.start の第1引数に渡して再生させると、Media Player などにあるような巻き戻しや早送りの機能も実装できます。
上記のスクリプトでは enterFrame イベントで常に marker が強制的に移動してしまいドラッグできなくなるので、ドラッグ中は移動させないといった変更も必要ですが、巻き戻しや早送りは割と簡単に作れます。
機会がありましたら改良してみてください。
お礼
>DPEさん またまた親切かつご丁寧な説明 ありがとうございます! 助かりました!!!