Progression: 2008年4月アーカイブ

休み前なので立て続けですが。
たぶん休み中は更新しないです。あしからず。

Progression用のモーション系のコマンドをいくつか作りました。
せっかくなのでアップしておきます。
作ったといっても、AS2からずっと使ってる自前のモーションクラスをコマンド用に書き換えただけなんですが。
もちろん、みんなが安心、Tweenerをベースにしなおしといたんで、そのまま使うなり改良するなり、煮るなり焼くなりご自由に。

ただしProgressionのバージョンが2.1.xにバージョンアップすると使えなくなる可能性大です。
そのうち対応するとは思いますが。←僕が

あと、はじめに言い訳しておくと、パッケージ名がCroquisですが、
fladdictさんのsketchbookの名前をパクリました。すいません。(中身はパクってません)
というのも、なんかここまでいろんな便利ライブラリが出回ってると、自分でなんか作る気もしないので
とりあえずProgressionをベースに世のオープンソースなライブラリを自分用にまとめてショートカットクラスなんかにしちゃってるわけです。
sketchbookからSparkのutilsとかColorMatrixとかとか

そこまでくると、どこまで公開してもいいのか良く分からんし、あんまり大きな声じゃ言えないんですが。

んで、以下はその中の一部ってことです。はい。

ところで余談なのですが、SparkのUtilクラスってホントに勝手に書き足したやつとかコミット(?)しちゃっていいんだろうか。
あと、どれくらいUtil系そろえるつもりなんだろう。とにかく万能Utilにしちゃうんだろうか。
それとも他で出てるものとはかぶらない様にとかあるんだろか。
もしとにかく何でもってんなら、少しは貢献できるかもしれないけども。
なんかあの辺の人たち凄すぎて気後れしちゃうよ。
へむへむ。


でわでわ。以下デモになります。


ソースファイルはこちら。
croquis.zip

以下、このデモに含まれるクラス。

◆クラス一覧

基本クラス
croquis.motions.Motion

移動用コマンドクラス
croquis.motions.Linear
croquis.motions.Curve
croquis.motions.Cycle
croquis.motions.Wave
croquis.motions.Twist
croquis.motions.Bug

変形用コマンドクラス
croquis.motions.Trans

着色用コマンドクラス
croquis.motions.FillColor



◆簡易リファレンス

croquis.motions.Motion
Motion( type:String, time:Number, transition:String=null, delay:int = 0 )

Motionクラスのベースになるクラスです。
このクラスは直接インスタンスを生成することができません。
作成する場合は必ずサブクラスを作成します。

croquis.motions.Linear
Linear(target:Object, time:Number = 1.0, x:Number = 0.0, y:Number = 0.0, transition:String=null, delay:int=0)

指定座標まで直進します。
target      対象となるオブジェクト
time        移動時間
x           目標X座標
y           目標Y座標
transition  Tweenerに渡すtransitionパラメータ
delay       待機時間

croquis.motions.Curve
Curve(target:Object, time:Number = 1.0, x:Number = 0.0, y:Number = 0.0, angle:Number = 0.0, radius:Number=0.0, transition:String=null, delay:int=0)

指定座標まで弧を描いくように移動します
target      対象となるオブジェクト
time        移動時間
x           目標X座標
y           目標Y座標
angle       始点から終点までの中点からの中継点の角度
radius      始点から終点までの中点からの中継点までの半径
transition  Tweenerに渡すtransitionパラメータ
delay       待機時間

croquis.motions.Cycle
Cycle(target:Object, time:Number = 1.0, x:Number = 0.0, y:Number = 0.0, round:Number = 0, clockwise:Boolean = true, transition:String=null, delay:int=0)

指定座標を中心に回転しながら移動します
target      対象となるオブジェクト
time        移動時間
x           目標X座標
y           目標Y座標
round       回転数
clockwise   時計回り(true) 反時計回り(false)
transition  Tweenerに渡すtransitionパラメータ
delay       待機時間

croquis.motions.Wave

Wave(target:Object, time:Number = 1.0, x:Number = 0.0, y:Number = 0.0, radius:Number = 0.0, swing:Number = 0.0, transition:String=null, delay:int=0)

指定座標までの直線軸を中心に揺れながら移動します
target      対象となるオブジェクト
time        移動時間
x           目標X座標
y           目標Y座標
radius      初期振幅距離
swing       振動回数
transition  Tweenerに渡すtransitionパラメータ
delay       待機時間

croquis.motions.Twist
Twist(target:Object, time:Number = 1.0, x:Number = 0.0, y:Number = 0.0, radius:Number = 0.0, round:Number = 0.0, clockwise:Boolean = true, transition:String=null, delay:int=0)

指定座標までの直線軸を中心に回転しながら目標点に移動します。
target      対象となるオブジェクト
time        移動時間
x           目標X座標
y           目標Y座標
radius      回転半径
round       回転数
clockwise   時計回り(true) 反時計回り(false)
transition  Tweenerに渡すtransitionパラメータ
delay       待機時間

croquis.motions.Bug
Bug(target:Object, time:Number = 1.0, x:Number = 0.0, y:Number = 0.0, turnSpeed:Number=0.05, transition:String=null, delay:int=0)

不規則な動作をしながら指定座標まで移動します
target  対象となるオブジェクト
time    移動時間
x   目標X座標
y   目標Y座標
turnSpeed   向きを変える速度
transition  Tweenerに渡すtransitionパラメータ
delay   待機時間

croquis.motions.Trans
Trans(target:DisplayObject, time:Number = 1.0, scaleX:Number = 1.0, scaleY:Number = 1.0, rotation:Number=0.0, basePoint:Point=null, transition:String=null, delay:int=0)

任意の座標を中心に DisplayObject インスタンスを回転、及び拡大縮小させます
target      対象となるオブジェクト
time        移動時間
scaleX      X軸拡大縮小値
scaleY      Y軸拡大縮小値
rotation    回転角度
basePoint   任意の中心点
transition  Tweenerに渡すtransitionパラメータ
delay       待機時間

croquis.motions.FillColor
FillColor(target:DisplayObject, time:Number = 1.0, colorTransform:ColorTransform = null, transition:String = null, delay:int = 0)

ColorTransform によって DisplayObject インスタンスに着色します
target      対象となるオブジェクト
time        移動時間
colorTransform  変更対象となる色情報
transition  Tweenerに渡すtransitionパラメータ
delay       待機時間


追記:
executeボタンを押したときに前回のコマンドが実行中の場合、前回のコマンドを停止してから実行するようにしました。
上記の一覧のクラスには変更はありません。

今度はFlickrAPIと、おなじみPapervision3DとでProgressionです。

Prog de Flickr

別にPV3D使ってるからといって、シーンの切り替えとかで
ダイナミックな使い方してるわけではないです。

今回は以下のライブラリを使用しています。
Progression Framework 2.0.18
Papervision3D Beta 1.7 (20.08.07)
as3flickrlib

ソースもアップしてます。
ソースファイル一式ダウンロード
前回以上に書きなぐりのソースになってますが、
特に整理しようとも思わないので、そのままアップしちゃいます。

毎度のことですが、APIキーはご自分で取得したものをお使いください。


あと、アップしてるサンプルですが、どうもアップしたては
アクセスが集中するのか読み込みにエラく時間がかかったりして
ちゃんと使えないかも。

こなれてくるとProgressionがホントに心地良いです。

今回は前回のエントリーでアップしたProgression de Amazonについてです。

シーンの動的生成と削除について書こうとして、削除してなかったのに気づいて一部書き換えました。
変更したのは demo.scenes.DetailScene クラスです。

ファイルをアップしなおそうとして、誤って上書きしちゃいました。
ソースファイル一式をダウンロード


DetailSceneクラスについて

このクラスは画面下部に表示された検索結果の商品一覧をクリックしたときに表示される、
詳細画面を開く際に通過するシーンクラスです。

まあ、何てことはないのですが、通過時に通知されるonDescendイベント内で移動先のシーンIDを取得して
新たにシーンオブジェクトを作成し、それを子シーンに追加しています。

こんな追加処理だけのシーンクラスを作らずに、移動元のシーンクラスのonGotoイベント内で
追加処理を実行してもよさげなものですが、それをするとURLから直接動的シーンに移動することになったときに
シーンが作成されなくなってしまうので、このように中継用のシーンを作成しています。

削除するときはonAscendイベントを使って、先ほど作成したオブジェクトを消すだけです。


なんか書こうと思ったんだけども、まったく特筆するようなことがないんだよなあ。
全部 Progression がやってくれてるし。


なもんで、このサンプルのソース見て「これ何?」って疑問のある人は質問してくれたら答えます。
ってことにしとけばきっと楽なんだ。

そういえばaccessKeyってまだ使ってないなあ。

引き続きProgressionの話題です。
現在のProgressionのバージョンは2.0.17です。

先日からやってたデモFlashの"Progression de Amazon"。

とりあえず時間かけ過ぎて飽きてきたので、今日でこのAmazon使ったFlashは終わりにしときます。
まだタブをポチポチ押しまくったり、ブラウザの「戻る」「進む」を繰り返してるとおかしなことになったりと
まだまだ挙動不審ですが、まあ、中には取っ掛かりの手助けになる箇所もあるんじゃないかなあと思います。

Progression de Amazon

ほんとに誰かの役に立つことがあるのか、甚だ疑わしいですが、
当初の予定通り、恥ずかしいソースファイルもアップしておきます。

ソースファイル一式ダウンロード
なお、言うのが遅すぎますが今回はクラスベースでプロジェクトを作りました。
レイアウトは思いっきり直置きなんですけども。。。

一応Progressionファイルも全部入ってるので、index.flaを書き出せば動きますが、
AmazonのAPIキーだけはご自身で取得したものを使用してください。
設定場所はIndexクラスにコメント書いておきました。

Amazon Web サービスのアカウントの取得はこちら
http://www.amazon.co.jp/gp/feature.html/?docId=451209

今回Amazon API についてはこちらを参考にさせていただきました。
MEMO - Amazon API

また、相変わらずクラスファイル内にコメント全然してないです。
詳細について解説しようかと思いましたが、今日は時間も遅いので
また後日書きます。(おそらくそんなに詳しくは書けないと思いますが。)


本音は、誰か僕に綺麗なスクリプトの書き方を教えてほしいんですが。

引き続きProgression Frameworkについて。
執筆時現在のバージョンは 2.0.17 です。
前回のデモのpreloader.flaに処理を追加してみました。
デモ(2008.04.03)

とりあえずpreloader.flaとクラスファイルをアップしときます。
preloaderソースファイル
Progressionのクラスは入ってないです。

クラスファイルの中身はこんなのです。
DemoPreloader.as
(余談だけど、hetemlって.asファイルをブラウザで見ることできないのかな?
.htaccessにAddType書いてみてもだめだったんだけども、なんでだろ?)


以下、今回けつまずいた箇所のメモ。

ExPreloaderを継承したDemoPreloaderクラス(以後Preloaderクラス) の onComplete の後、
IndexのonInitが発信されるが、今回complete後にアニメーションを加えた(これはindex.falに入れた
ほうが良いかもしれない)のと、ローディングのバーの伸び方にイージングを加えたので、
それが終わってから Progression のシーンが始まるようにしたかった。

そのため、IndexクラスからPreloaderクラスにイベント通知の登録をしようとして
Preloaderのインスタンスを参照しようとすると、ステージ上のオブジェクトが存在しないと怒られた。

これを回避するためにPreloaderクラス内のオブジェクトの参照をgetterを使って間接的に参照するようにした。

以下はIndexクラスに書いたPreloaderクラスへの参照の部分。
override protected function _onInit():void
{
    //~中略
    
    if( DemoPreloader.instance ){
        DemoPreloader.instance.addEventListener( Event.CLOSE , startContents );
    } else {
        startContents();
    }
}

private function startContents( event:Event=null ):void
{
    // 最初のシーンへ移動。
    prog.goto( prog.firstSceneId );
}

----

onProgressイベント内で、同クラスの bytesLoaded と bytesTotal の両プロパティを参照すればよいのかと思いきや
これらのプロパティは progress.swf 自身のバイト情報なのでロード進行中はすでにどちらも固定の値しか返してなかった。
なので addEventListener で一旦 progressイベントにリスナーを登録して、そこに渡されるイベント情報から
bytesLoaded と bytesTotal を読み取るようにした。
(ここで登録したリスナーにはきちんと内部のExLoaderの情報が返ってきてる。)

----

実際サーバーにアップしてみて気づいたのは、URLが変わって「index.html#/~」とかってなるところでリロードすると
Indexクラスの onInitイベントが飛ばされるみたい。詳細はわからないけども。
そのためローディングの後処理と、メインのコンテンツが同時に実行されてしまった。
これは Progression のルートに設定したシーンクラスの onLoad から Preloader の動作をキャンセルさせることで回避。

以下はルートシーンの onLoad イベント内の処理。
書いてることは Preloader が終了してなければスキップ。
override protected function _onLoad():void
{
    if (DemoPreloader.status != "close") DemoPreloader.status = "skip";
    
    addCommand( 
        new AddChild( progression.container , _cast )
    );
}

----

これはつまずいた訳ではないけども、ちょっと気になったのでボソっと。
toString がオーバーライドされてるからPreloaderクラスをtraceすると [object DocumentRoot] に。
DocumentRoot クラスから toString を消すと [object ExMovieClip] に。
コンマ数秒だけ「あれ?」って思った。w


なんか自分の失敗ばかりツラツラ書くと、Progression使うの難しく見えるかもしれないなあ。
でも、本当は気にするところが、上にあげた部分だけで、その他に気にすることが無いってところが良くできてるんだと思う。
だってプリローダーファイルを外部で用意して、コンテンツ部分と分離させようとか考えてイチから作ったらかなりの手間だと思う。
コンテンツ部分の制作時に親ファイルの存在を気にする必要もなく出来てる訳だし。
Progression使わずにローディングの部分だけでも使えるし。

あと、AS2やってた人がAS3の取っ掛かりにProgressionを使うのもいいと思う。

なかなか使いこなすまでには至らないけども、噛めば噛むほど味の出る感じがいいです、Progression。
きっとjp.niumパッケージの中身とかも便利クラスがいっぱい詰まってるんだろうと思いますが、
まだそこまで手が回りません。
Progression のサンプルデータのページからダウンロードした、
東京てら子ワークショップキットの IndexScene クラスをちょっと図にしてみた。



ふむふむ。
とりあえず何か作ってみないことには良し悪しも何もわからないので
とにかくざっくり作ってみた。
なんかせっかくリンクまでしてもらったのに、あのサンプルじゃ申し訳ないし。

Progression デモ(2008.03.31)

まだ画面遷移とか何もしてないので、もうちょっとチョメチョメしてからソースのほうもアップします。

で、以下、今のところの雑感など。

Progressionは大きくは「シーン」と「キャスト」の2つから構成されてるんだと思うのだけども、
シーンクラスに何を書いて、キャストクラスに何を書くかってのが悩む。
これは自分の未熟さのせいなんだけども。

ところでキャストからシーンを参照する方法が分からなかった。
そもそもそんな作り方をするのが間違いなのかもしれない。
このAmazonのやつは、すでにシーンとキャストがごちゃごちゃ。
シーンがキャストを制御するんだから、やっぱりキャストからシーンを参照するようなことは
しちゃいけなかったかもしれない。

あと、コマンドクラスをいかにウマく使うかってのもミソだと思うんだけども
これがまた不慣れなせいで、すっ飛ばして自分で関数作って実装しちゃったりする。
折角コマンドが用意されてるのにaddEventListener使いまくりだったり。
あとaddCommandで追加したコマンドの実行の仕方がわからなかったり。
結局SerialListを新たに作ってexecuteで実行とか。
きっと何か用意されてると思うんだけども。

Flash作るとき、自分はステージ上にボコボコレイアウトしていって
それをスクリプトで制御するんだけども、はじめからステージ上にオブジェクトを
配置していると、"onCastAdded"が使えなかった気がするな(気のせいかな?)。
なんか不確かなんだけども。

ExPreloaderからIndexへの遷移ももうちょっと調べてみないと。
ローディング後の後処理みたいなのを作った場合、その後処理後から
Indexへの連携の仕方が分からなかった。

ああ、帰らなきゃ。