2008年11月アーカイブ
今日は大崎でProgressionのコンポーネントベースのワークショップがあり、参加してきました!!コンポーネントベース凄いです!みんなクラスばっかりやってないでコンポーネントベースもやるべきだと思います。本当に。
さて、先日はF-Siteに行ったり、ロクナナワークショップに行ったりとイベント続きだったんですが、おかげさまでスケジュールが激しく押されておりますね。
そんな中、空気を読まずにコマンドについての考察をエントリしたいと思います!!
さて、Progressionのコマンドですが、いきなりfunctionを書くことが出来るのでかなり記述の幅が広いです。
でも、いまいち詳しく分かっていなかったり(←いまさら)していたので、復習も兼ねてエントリします。
例えば。。。
addCommand(
new Trace("コマンドスタート"),
function ():void{
trace("これはどのタイミングかな?");
},
new Trace("コマンド終わり!")
)
これはどうなるかと言うと、ちゃんと順番に
コマンドスタート
これはどのタイミングかな?
コマンド終わり
となります。
次はどうでしょう?
addCommand(
new Trace("コマンドスタート"),
function ():void{
addCommand(new Trace("これはどのタイミングかな?"));
},
new Trace("コマンド終わり!")
)
今度は
コマンドスタート
コマンド終わり
これはどのタイミングかな?
となります。
functionの中のaddCommandはコマンドのキューに追加するという形になりますね。
で、次はどうでしょう?
addCommand(
new Trace("コマンドスタート"),
function ():void{
insertCommand(new Trace("これはどのタイミングかな?"));
},
new Trace("コマンド終わり!")
)
これはまた順番に
コマンドスタート
これはどのタイミングかな?
コマンド終わり
と出力されるようになりました!!insertCommandはこんな感じで使う訳なんですね。
さてさて、さらに色々する為にカスタムコマンドを作成します。
以下のように"カスタムコマンドだよ"という文字列だけをgetする為のコマンドを作成してみます。
package myproject {
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.*;
public class MyCommand extends Command {
private var _returnValue:String;
/*=================================*//**
* コンストラクタ
*/
public function MyCommand( initObject:Object = null ) {
super( _execute, _interrupt, initObject );
}
/*=================================*//**
* 実行されるコマンドの実装です。
*/
private function _execute():void {
_returnValue = "カスタムコマンドだよ";
// 通常処理を終了します。
executeComplete();
}
/*=================================*//**
* 中断実行されるコマンドの実装です。
*/
private function _interrupt():void {
// 中断処理を終了します。
interruptComplete();
}
/*=================================*//**
* MyCommand インスタンスのコピーを作成して、各プロパティの値を元のプロパティの値と一致するように設定します。
*/
public override function clone():Command {
return new MyCommand( this );
}
/*ゲッター*/
public function get returnValue():String { return _returnValue; }
}
}
で、以下のようなコードを書いてみますが。。。これはいけません。
var _myCommand = new MyCommand();
addCommand(
new Trace("コマンドスタート"),
function ():void{
insertCommand(_myCommand);
trace(_myCommand.returnValue);
},
new Trace("コマンド終わり!")
)
これだと
コマンドスタート
null
コマンド終わり!
と帰ってきます。コマンドの実行タイミングが分かっていれば一目両全ですね。
以下のように書くと良いです。
var _myCommand = new MyCommand();
addCommand(
new Trace("コマンドスタート"),
function ():void{
insertCommand(_myCommand);
},
function ():void{
trace(_myCommand.returnValue);
},
new Trace("コマンド終わり!")
)
これで
コマンドスタート
カスタムコマンドだよ
コマンド終わり!
の順番で出力されます。
以下の様に書いても一緒です。むしろこう書くべき。
var _myCommand = new MyCommand();
addCommand(
new Trace("コマンドスタート"),
_myCommand,
function ():void{
trace(_myCommand.returnValue);
},
new Trace("コマンド終わり!")
)
どうでしょう?カスタムコマンドから値受ける時はこんな感じでいいのかな???
他にもコマンドは色んな書き方があるので、(実行待ちとかイベント待ちとか)研究を重ねたいと思います。
これこそ今更なのですよね。
この機能があるからこその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に入れるようにしますのでよろしくおねがいします。
しかし、このサンプル使い物になるのかなあ?
現在、絶賛風邪をひいてダウン中です。みなさん風邪にはお気をつけて。。。
さて、昨日Progression勉強会が開かれるとの情報が公式ブログに掲載されました。
発表者を募集しますとの事で、少し悩んだのですが、なかなかこんな機会も無いと思い発表させていただこうと思います。
こういう発表自体初めてなのと、人前に立って何かするのはそうとう久しぶりなので、大丈夫かな???と思ってはおりますが、勉強会に参加される方は生暖かい目で見守ってやって下さい。
内容はこのブログでやろうかなと思っていた「ProgressionでAIRアプリ作成!!」
という、需要があるのか無いのか全く未知数な内容です。
(ちなみに作った物は発表後に晒す予定です)
でもせっかくProgressionにAIRプロジェクト作成機能が付いているので、使いたいじゃないですか。。。
おそらくProgressionを利用すればこんなに簡単に。。。。といった内容になるはず。。。
flabakaのあつのすけさんとのコラボ発表という形も考えております。
人生チャレンジが必要という事なんですよ。たぶん。玉砕しないようがんばります。
という事でどんどん発表者が増えると良いと思います!!まだ発表者枠は空いてますよ!
こんなエントリ書いている余裕は無いはずなのに、書きます。。
内容は他の人のブログ記事の紹介みたいな感じなんですが。。
ある事がきっかけでもう1台のPCでProgressionを利用したくなったので、そちらの環境設定メモ代わりです。
私はFlash CS3(CS3 Web Premiumを自腹で買ったんですねー。。。痛かった。)のライセンスは1つしか持っておりませんので、もう1台は必然的にFlash CS3無しでという事になりまして。
※11/9追記
yumaさんより、同時使用しないのであればPC2台までインストール可能と教えていただきました。なので、3台目に入れたい人はこの方法を取ると良いと思います。
そこで、FlashDevelop+Flex3 SDKでどうにかしてしまおうと思い立ったわけです。
まず、最初にFlashDevelop+Flex3 SDKを導入します。
FlashDevelop Beta9
Flex3 SDK
他にJava1.6以上が必要の様ですが、私の環境では既に入っていました。FlashDevelopで必要な.NET Framework version 2.0も同様です。
次に、FlashDevelopの設定を行います。
Tool→Settings→AS3Context→Flex SDK Locationの値を設置したFlex3 SDKの場所に設定
私の場合は環境変数とかも変えたのですが、いらないかも?
swfの動作確認にスタンドアロンのFlashPlayerも入れて拡張子とアプリケーションの関連付けをしておきます。
この辺までは他のブログにも沢山掲載されている件ですね。
とりあえず、以上でswfを生成する環境は整いました。これでProgressionで提供されているSWCパッケージを利用すれば良い訳なのですが、願わくばFlashCS3版で自動生成されるデフォルトプロジェクトファイルが欲しいと思い、作らなきゃいけないかなーと思っていたところ、既に他の方が公開されておりました。
seyselfさんのこちらのエントリです!!
素晴らしいです。利用させていただきます。本当にありがとうございます。
これのSWCファイルを最新のSWCファイルに入れ替え、FlashDevelopのTools→Application Filesで開くフォルダ内のTemplates→ProjectTemplates内に入れておけばOKです。
道産子仲間のflabakaさんもとても分かりやすいエントリー上げられてますね。私は2ヶ月遅れですが。。
あとはminoruさんのこれ入れれば、かなり良い感じのprogression開発環境の出来上がりー
ステージサイズとかHTMLとかは手書き変更の必要があるので、FlashCS3版がいかに素晴らしいか再確認されますね。
お金のある人はFlash買った方が絶対いいです。
他人のエントリ借りまくり、しかもこんな事いまさらやってるのかよ!!と怒られそうなエントリでした。
自分のメモ代わりってところです。
やりたい事とやらなければならない事がかなり増えてしまいました。
そして、ハロウィーンは既に過ぎ去ってしまいました。。。
そんな訳でサンプルプロジェクトファイルを
ここに
置いておきます。
色々作りこもうと考えてはいたのですが、ちょっとテーマを変えてみようと思っています。
結局ゴーストが毎時5,15,25,35,45,55分に現れるのを追加しただけ。。
やるやる詐欺にも程がありますね。。
うーん。。なにか間違ってるような気がするんだが。。もっと触らないと駄目だな。。
11/3 14時追記
サンプルに色々いじってた時のゴミが残っていて、エラーになっていました。。
入れ替えました。。。
