「ActionScript3.0を駆使したプロフェッショナルテクニック」を謳っていながら肝心のサンプルにActionScript2.0が混在しているという困った学習本の修正版を作る企画第5弾。
CaseStudy05から07は普通にAS3のサンプルでした(フレームアクションではありますが)。ですのでここでは特に取り上げません。
AS2で作られたサンプルは今回のを含めて残りあと2つです。この先には、「Flash Math & Physics Design:ActionScript 3.0による数学・物理学表現[入門編]」の著者である古堅真彦氏による秀逸なAS3サンプルも控えていますので、さっさと片付けてしまいたいと思います。
基本的な手順
以下、「ソフトバンク クリエイティブの本:Flashデザインラボ -プロに学ぶ、一生枯れない永久不滅テクニック」のページで配布されているサンプルをベースに修正します。
- 新規 ActionScript 3.0 Flashファイルを作成する
- もとのサンプルファイルを開き、ライブラリから必要なものを新しいFlashファイルへコピーする
- 新しいファイルのステージ上にオブジェクトを配置して、もとのサンプルファイルと同様の状態にする
- 作成したFlashファイルと同じディレクトリにPresentationクラスファイルを配置する
- ドキュメントクラスに「Presentation」を設定する
- パブリッシュ設定で、ステージのインスタンスを自動宣言しないようにする
以下のリンクから、今回作成した「Presentation」クラスファイルをダウンロードできます。
Zip形式で圧縮されていますので、Flashファイルと同じフォルダに解凍してください。
補足説明
今回はプレゼンツール用Flashなので、ページ数の増減に柔軟に対応できるように処理を見直しました。
基本的にはページ数を表すメンバー変数の値を変えるだけで対応できます。
キーボードイベントも拾うキーの種類を増やしていけばOKです。10ページ以降は工夫が必要になると思いますが・・・
あと、メニュー上下の三角にホバーすると、オリジナルのサンプルでは1フレーム分だけ移動イベントが発生して小刻みに動いていましたが、この動きはどう見てもバグなので修正しました。それ以外はだいたいオリジナルのサンプルに準拠している、はず。
本当はメニューやページなどそれぞれのパーツをクラス定義してドキュメントクラスをすっきりさせるほうがオブジェクト指向的なのかもしれませんが、オリジナルの構造を尊重した結果こうなりました。
今回の一番のキモは、EnterFrameイベントの処理中に条件判定をしてアニメーションを停止させる、というようなAS2の時からお馴染みのテクニックをAS3ではどう記述するかという問題でした。
作ってみて、AS2の書き方のほうが素直だったなぁという感想を持ちつつ、AS3でしか実現しえない表現の可能性も感じました。
ちょっとハマったのはムービークリップが入れ子になっている場合のイベント処理です。
複数のメニューに対して同じリスナー関数を適用しているため、関数内で「どのオブジェクトに対するイベントか」を判定しています。
イベントオブジェクトのtargetプロパティでそれは取得できるのですが、ここで注意するのは「MouseEventが、DisplayObjectの表示リストでもっとも深い位置にあるノードをターゲットにして発生する」というルールです。つまりイベント対象のオブジェクト内に入れ子のムービークリップ等があると、そちらがtargetに入ってくる場合もあるということです。
この問題を回避するにはcurrentTargetプロパティを使用します。currentTargetはリスナー関数を処理中のインスタンスを指します。
それから、AS2にはなかった特徴として、AS3ではひとつのイベントに複数のリスナー関数を登録できます。
EnterFrameイベントに対して、オブジェクトのアルファ値を上げる関数と下げる関数を同時に発生させることもできちゃうわけですよ。
実は今回一番手こずったのがこの問題で、あやうくパソコンを熱暴走させるところでした(汗)
removeEventListenerの命令を実際に登録済みでないリスナー関数に対して行ってもエラーにはなりませんので、心配なところでは迷わずremoveEventListenerを行うようにするとよいでしょう。
参考
- 入れ子のムービークリップのマウスイベント currentTarget – ActionScript 3.0入門ノート CS4
- flair4 blog – AS3 MouseEventの挙動とmouseChildren
今回も参考書籍として「FLASH OOP for ActionScript 3.0」の2章4節「マウスイベントの扱い」を挙げておきます。