第4回 大阪てら子 で学んだ10個の Flash 製作 Tips

タイトルが軽く煽りっぽいですが、行ってきました。Flash 勉強会@大阪の4回目。

今回は Flash ライブコーディング。

「Flash だからライブオーサリングじゃないの?」と思ってたけど、蓋をあけてみると、大部分がコーディング。Flash 8 はほとんど使わずに、ActionScript だけで SWF が出来上がっていく様子は、軽くカルチャーショックでした。

ソースは [Saq.] 第4回「大阪てら子」まとめ からダウンロードできますよ。

5時間にわたりコーディングしてくださった さくーしゃさん、ありがとうございます。そしてお疲れ様でした。ライブ配信と突っ込みシステムを作った hirossy さん、お疲れ様です。


ということで、今回、学んだポイントを10個にまとめてみましたよ、っと。ちょっと Tips じゃないのも含まれている気がするけど、そこはご愛嬌で。

1. Photoshop からの書き出しは地味

  1. 最初に素材の各レイヤーを png に書き出す。
  2. それぞれを MovieClip に入れて、インスタンス名をつけていく。
  3. MovieClip を下絵に合わせて配置していく。ピクセル単位の細かな作業。

png の書き出し部分では、Flash で画像の外側が崩れるバグに対応するために、

  • 偶数ピクセルで書き出す
  • 少し幅を広くとる
  • MC の右下を中心に配置する

といったバッドノウハウが紹介されました。Flash 8 では問題なくなっている、という話も。

(感想)華やかなアニメーションの裏には、こんなにも地味な下準備があるのか! CS3 ではだいぶ改善するのかな?

2. タイムラインアニメーションのマスクは手書き

筆で書いていくようなアニメーションはマスクの変形で行う。

マスクは、1フレームずつ手書き。

手書きのマスク

最後に「フレーム反転」で逆に並び替えて完成。

手書きの方が味がでるし、細かい調整ができるらしい。

3. Flash 8 の出番はここで終了

ここからは Flash 8 は使わず、FDT (Development for Flash) という Eclipse プラグイン上でコーディング。

MC のステージへの配置や、アニメーションの設定は、全て AS2.0 でやってしまいます。

(感想)FDT(Development for Flash) の存在を初めて知りました。199ユーロだそう。(現在の日本円で 32,000円ぐらい)

4. ライブラリはプロジェクトごとに

ライブラリを1箇所にまとめておくと、バージョンを上げたときに、過去の遺産が動かなくなって悲しいので、各プロジェクトのディレクトリにライブラリを展開。

スタティックリンクの感覚に近い。

5. _root を自作クラスに

ステージの1フレーム目には

App.main(_root);

と書いておく。

App.main() の実装は次の通り。

static public function main(target:MovieClip):Void {
    target.__proto__ = App.prototype;
    Function(App).apply(target, null);
}

何をやってるかというと...

  • prototype を書き換えることにより、_root を App クラスにしてしまう
  • App のコンストラクタが呼ばれたことにする

ということ。__proto__ とか apply あたりは、かなり技術的に込み入ってるので、分からない人は おまじない と考えてもよいかも。

これで準備完了。残りは全部 AS でコーディングできる。

(補足)CS3 からは DocumentClass を設定できるようになるので、こういうバッドノウハウも必要なし。

6. FuseKit でアニメーション

var f:Fuse = new Fuse({...}) 形式でコンストラクタの中に全部書いちゃう。

var f:Fuse = new Fuse(
    { target:this.bg_mc, alpha:100, time:1, easing:'linear' },
    [
        { target:this._memberImg_mc, y:10, time:2, easing:'easeOutCubic' },
        { target:this._mirrorImg_mc, y:130+120, time:2, easing:'easeOutCubic' }
    ]
    { target:this.name_mc, y:135, time:1, easing:'easeOutCubic' },
    { target:this, alpha:0, delay:2, time:0.5, easing:'linear' },
    { scope:_root, func:_root.showAllMembers }
);
f.start();

それぞれの MC は Flash 8 で アルファ 0% にしておくのを忘れずに。

(感想)FuseKit は使い方を覚えたら簡単そうだ。Trick7 さんの Fuseアニメーションの実行順序 が分かりよい。

7. MovieClipUtil.attachMovieRegisterClass() で MC をステージに配置

CASA フレームワークの MovieClipUtil.attachMovieRegisterClass() を使えば、MC とクラスを関連付けてステージに配置できる。

var mc:MovieClip = 
    MovieClipUtil.attachMovieRegisterClass(
        LogoAnimation,    // クラス名
        this,             // 親 MC
        'Logo Animation', // リンゲージ名
        '_logo'           // インスタンス名
    );

1つの MC に対して、複数の実装を割り当てられるわけで、これはちょっと面白い。

attachMovieRegisterClass は、内部で Object.registerClass を呼んでいるようだ。リンゲージプロパティの 「AS 2.0 クラス」をいじる関数の模様。なるほどなるほど。


8. XmlUtil.xmlToObject() で XML をオブジェクトに変換

CASA フレームワークの便利な関数。XML を受け取って、Object にして返してくれる。

var obj:Object = XmlUtil.xmlToObject(this._xmlLoad.getXml())

Perl で言うところの XML::Simple、JavaScript で言うところの JKL.ParseXML みたいなもの。

(補足)AS3.0 には E4X があるから、こういうのは不要かな。

9. LoadGroup 便利

またまた CASA フレームワークから。LoadGroup は URL を複数登録しておいて、まとめてロード、全部読み込み終わったら教えてもらえる。

1~2個の画像なら手作業でも書けるけど、たくさんの画像を読み込む場合はかなり便利。

var loadGroup:LoadGroup = new LoadGroup();
for (var i:Number = 0; i < info.length; i++) {
    var mc:MovieClip = MovieClipUtil.createEmptyMovieClip(this, 'img' + i);
    loadGroup.addLoad(new MediaLoad(mc, 'images/' + info[i].image, false));
}
loadGroup.addEventObserver(this, LoadGroup.EVENT_LOAD_COMPLETE, 'handleLoadComplete');
loadGroup.start();

10. さくーしゃさんでも、はまる

途中、Saqoosha さんが、うまくいかずに30分ぐらい(?)、はまっていた。

問題解決までのプロセスまで知れるっていうのは、ライブコーディングの魅力。

個人的には、はまっているときが、みんな一番いきいきして見ていた気がする。ああ、さくしゃーさんでもはまることあるんだ、ちょっと安心、みたいな。

最後に...

掲載してるサンプルコードは さくーしゃさん が公開してくれてるソースコード を、ちょっといじって分かりやすくしたものです。

改めて、手の内を明かしてくれた さくーしゃさんに感謝。

(追記) 参加者のレポートが続々と。

hirossy javaとFlex2と。 - 第4回大阪てら子終わりました (hirossy さん)
Flex2+Red5+つっこみシステムの裏話。
IDV-DESIGN | 第四回大阪てら子の勉強会 (タケさん)
_root を自作クラスにする方法と HTML テンプレートについて。
gotoand… ≫ 【teraco】大阪てら子 第4回「さくーしゃのFlashライヴコーディング」 (れんさん)
詳細なメモ! ありがたや。

こういうレポートが、今の倍ぐらいは出てきたら素敵なのになぁ・・・>参加者各位(笑)