久々のエントリです。
ピーク抜けたり、色々と"端末の前に座ってられない状況"に遭ったりで実務から少し遠ざかってましたが、年始から水面下で進んでいた案件がやっと動き出し、1ヵ月ほどの実務ブランクにも『こんなに勘が鈍るモノなのか!』と驚きつつ、締め切り目前でブルってます。
昨夜ハマってたのが Sound まわり。
ムービー全体をコントロールする再生・停止ボタンから、ランダムに1ループだけ再生されるエフェクト音のために用意した SoundChannel に対して、一時停止機能をつけようとしてました。
ユーザーが任意に一時停止ボタンを押したとき、まだその SoundChannel で何も再生されてない場合、 SoundChannel を参照すると、当然ながら、 null にアクセスできない、と怒られる。けど、任意の SoundChannel にSoundデータを"再生させずに"保持しとくことができない。
さらに、 SoundChannel.position は読み取り専用なので、例えば
var _sndCh:SoundChannel; _sndCh.position = 0;みたいな真似は出来ない。
さーこまった、てことで無理くり編み出した方法は、無音で超短いダミーサウンドを一回再生しとく、て方法。
var _sndCh:SoundChannel; // ライブラリ内のリンケージよりダミーサウンドを読み込み var _dammy:Sound; _dammy = new Dammy(); _sndCh = _dammy.play(0,1);
これでひとまず、まだエフェクト音が再生されてない状態でも、SoundChannel.stop() しても怒られない。
でもこの方法だと、SoundChannel.position に、ダミーサウンドの長さ(ミリ秒)の値が格納されているので注意。(Soundデータって、再生が終わったら一番最後で停止してるんですね。先頭に戻るという先入観を勝手にもってて余計にハマった。)
でもって一時停止と、停止した時点からの再生は
// 再生するサウンド var _snd:Sound = new Sound(); // 停止位置を保存しておく変数 var pausePosition:Number; // 一時停止 _sndCh.stop(); pausePosition = _sndCh.position; // 再生 _sndCh = _snd.play(pausePosition);↑実際いま進めてる案件では、エフェクトサウンドが何種類もあるので、どのサウンドがなったか、みたいな条件分岐もあったりでもうちょっと複雑になると思いますが骨子はこんな。
確実に、もっと単純かつスマート方法があるんだろうとは思ってますよもちろん(無念)。
