カスタムコマンドを作ってみた

| コメント(0) | トラックバック(0)

これこそ今更なのですよね。
この機能があるからこそのProgressionなわけで。。しかもこちらのエントリが凄く気になっていて。。
カスタムコマンドを作ってみました。

flvファイルを再生して終わったらフェードアウトする代物です。
本当はもっともっと汎用化させたいんだけど、とりあえずこんな事が出来るぜ!みたいなのを例として挙げたかったんです。

作りこんでいないので、本当は必要なエラー処理とかイベントのディスパッチとか全く無し。
(実はその辺の知識が曖昧なままなので、誰か私にご教授下さい。。。)

11/13追記 思いっきりミスしていました。修正前だとwaitForCompleteをfalseにするとムービーが終わってもフェードアウトしなかったと思います。ごめんなさい。。。

以下クラス内容です。11/13ケアレスミスを修正

package myproject.mycommand 
{
	import flash.display.DisplayObjectContainer;
	import flash.events.NetStatusEvent;
	import flash.media.Video;
	import flash.net.NetConnection;
	import flash.net.NetStream;
	import jp.progression.casts.*;
	import jp.progression.commands.*;
	import jp.progression.core.commands.Command;
	import jp.progression.events.*;
	import jp.progression.loader.*;
	import jp.progression.*;
	import jp.progression.scenes.*;
	import caurina.transitions.Tweener;
	/**
	 * ...
	 * @northprint DefaultUser (Tools -> Custom Arguments...)
	 */
	public class PlayMovie extends Command 
	{
		private var _movieURL:String;
		private var _movieWidth:uint;
		private var _movieHeight:uint;
		private var _connection:NetConnection;
		private var _netStream:NetStream;
		private var _obj:Object;
		private var _movieObj:Video;
		private var _movieContainer:DisplayObjectContainer;
		private var _waitForComplete:Boolean = false;	
		/*======================================================*//**
		 * コンストラクタ
		 */
		public function PlayMovie(container:DisplayObjectContainer = null, movieURL:String = null, movieWidth = 0, movieHeight = 0, waitForComplete:Boolean = false, initObject:Object = null ) 
		{			
			_movieURL = movieURL;
			_movieWidth = movieWidth;
			_movieHeight = movieHeight;
			_movieContainer = container;
			_waitForComplete = waitForComplete;		
			super( _execute, _interrupt, initObject );
		}
		//waitForCompleteの値セッター、ゲッター
		public function get waitForComplete():Boolean { return _waitForComplete; }
		public function set waitForComplete( value:Boolean ):void { _waitForComplete = value; }
		//MOVIEの状態
		private function onMovieProgress (event : NetStatusEvent) {
			if (event.info.code == "NetStream.Play.Stop"){
				if ( _waitForComplete ) {
					executeComplete();
				}
				//ムービーが終わったらフェードアウトする
				Tweener.addTween(_movieObj,{
								alpha:0,time:1,onComplete:endExec});
			}
		}
		//イニシャライズ処理
		private function initStream():void {
			_netStream = new NetStream(_connection);
			_movieObj = new Video();
			var customClient:Object = new Object();
			_netStream.client = customClient;
			//指定されたコンテナの表示リストに追加
			_movieContainer.addChild(_movieObj);
			//幅、高さ設定
			_movieObj.width = _movieWidth;
			_movieObj.height = _movieHeight;
			_movieObj.attachNetStream(_netStream);
			//再生
			_netStream.play(_movieURL);
			_netStream.addEventListener(NetStatusEvent.NET_STATUS, onMovieProgress);
			//ムービー完了待ちをするかどうか
			if ( _waitForComplete ) {
				return;
			}
			executeComplete();
		}
		//終了処理
		private function endExec():void {
			if (_movieObj) {				
				if ( _waitForComplete ) {
					_netStream.removeEventListener(NetStatusEvent.NET_STATUS , onMovieProgress);
				}
				_movieContainer.removeChild(_movieObj);
				_movieObj = null;
				_netStream.close();
				_netStream = null;
				_connection = null;
			}
		}
		/*=====================================================*//**
		 * 実行されるコマンドの実装です。
		 */
		private function _execute():void 
		{
			//長いムービーだとタイムアウトになるから
			timeOut = 0;	
			//初期処理
			_connection = new NetConnection();
			_connection.connect(null);
			initStream();
		}		
		/*======================================================*//**
		 * 中断実行されるコマンドの実装です。
		 */
		private function _interrupt():void 
		{
			endExec();
			// 中断処理を終了します。
			interruptComplete();
		}
		/*======================================================*//**
		 * MyCommand インスタンスのコピーを作成して、各プロパティの値を元のプロパティの値と一致するように設定します。
		 */
		public override function clone():Command 
		{
			return new PlayMovie( _movieContainer,_movieURL,_movieWidth,_movieHeight,_waitForComplete,this );
		}
	}
}

長いな。。。
ちなみにwaitForComplete()のセッターゲッターとかwaitForCompleteあたりの処理はDoSoundコマンドをパクリ参考にさせていただいております。

で、以下使用方法

protected override function _onInit():void {
	// 実行したいコマンドを登録します。
	addCommand(
		new PlayMovie(progression.container, "sample_movie.flv", 400, 300, true),
		new Trace("ムービーが終わったよ")
	);
}

呼び出し元が非常にすっきりしますね!

このカスタムコマンドですが、いじってムービーをループさせたり、終了処理を変えたり、色々出来ると思います。
本案件で使う際はエラー処理を忘れずに入れましょう!!

こいつのサンプルはここに入れました。MovieTest.zipというファイルです。

今後サンプルはprogressionのTracに入れるようにしますのでよろしくおねがいします。

しかし、このサンプル使い物になるのかなあ?

トラックバック(0)

トラックバックURL: http://www.northprint.net/mt5/mt-tb.cgi/121

コメントする

このブログ記事について

このページは、northprintが2008年11月12日 21:50に書いたブログ記事です。

ひとつ前のブログ記事は「Progression勉強会で喋ろうと思います」です。

次のブログ記事は「コマンドについて色々書いてみる」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。