Author Archives: AKIYAMA

2009-11-26

ActionScriptのSoundとSoundChannel

そろそろSoundまわりに手を付けてみますかね。ということで、開発ガイドやリファレンスに目を通してみました。うーん、なかなかお手軽に使えそうですね。

//Test.as
package{
    import flash.display.*;
    import flash.media.Sound;
    import flash.net.URLRequest;

    public class Test extends Sprite
    {
	public function Test()
	{
	    new Sound(new URLRequest("nyandaful.mp3")).play();
	}
    }
}

最低限再生するだけならこのくらいでOK。エラーに備えてEvent.IO_ERRORくらいは補足した方が良さそうですが。

playメソッドでは開始位置やリピート回数を指定することも出来るみたいです。ただ、ループ区間を指定することは出来ないみたいなのが残念。

サウンドを止めるためにSoundにstopメソッドがあるのかな、と思ったらそうではなく、play()の戻り値であるSoundChannelにstopメソッドがあります。Soundオブジェクトは今鳴っている音そのものを表すのではなく、あくまで一つの音の種類というか、データソースというか、一つの音源を表すみたいです。今鳴っている音自体はSoundChannelオブジェクトで表されます。だから、Soundのplay()でSoundChannelオブジェクトが生まれ、stop()でその役目を終える。再度再生したい場合はSoundのplay()でまた新たなSoundChannelオブジェクトを作る。ボリュームやパンニングは再生中の音に対する属性だから、SoundChannelのsoundTransformプロパティで制御する。そういった考え方のようです。

こういう設計だから、一つの音源を同時に複数鳴らすことも簡単にできます。Soundのplay()メソッドを何回も呼べば、呼んだ分だけSoundChannelオブジェクトが作られ、同時に再生されます。

//Test.as [PLAY]の文字をクリックするとmp3を再生する例。何回もクリックすると、その分音が重なっていく。
package{
    import flash.display.*;
    import flash.text.*;
    import flash.media.Sound;
    import flash.net.URLRequest;
    import flash.events.*;

    public class Test extends Sprite
    {
	private var snd:Sound = new Sound(new URLRequest("nyandaful.mp3"));
	private var tf:TextField = new TextField;
	public function Test()
	{
	    tf.text = "[PLAY]";
	    tf.autoSize = TextFieldAutoSize.LEFT;
	    addChild(tf);
	    tf.addEventListener(MouseEvent.CLICK, onClick);
	}

	private function onClick(e:MouseEvent):void
	{
	    snd.play();
	}
    }
}
2009-11-23

s5fの画像リソース読み込みまわり

ようやく最低限の実装が出来た。

最近はエラー時の細々とした処理を実装していた。エラー報告用のUIと再試行・無視の処理など。

事前読み込み用のコマンドなんかも用意したけど、ネットワークの速度が速くて、使わなくてもそれほど困らない。まあ、安定した動きをさせたいのなら使っておいた方が良いんだけど。こういう機能ってテストが難しい。