« スクリプトの種類 | メイン | ムービークリップアクション »

フレームアクション

フレームアクションはムービークリップのインスタンスを配置する場合と同じように、キーフレームに設定します。レイヤーはどのレイヤーを使っても構いません。すでにムービークリップなどが入っているレイヤーにフレームアクションを設定することもできますが、フレームアクション専用のレイヤーを追加して使うのがわかりやすく一般的な方法です。フレームアクションが設定されているキーフレームにはaの文字が表示されます。
フレームアクションには、単独のステートメント、イベントハンドラ、ActionScript1.0のクラス定義、メソッド定義、関数定義のスクリプトを書くことができます。後述するようにムービークリップやボタンの個々のインスタンスにオブジェクトアクションを設定することができますが、それらの設定はタイムラインのフレームアクションで使ってまとめて使って書くほう書式が統一されて間違いもなく合理的です。

note:
ActionScript2.0のクラス定義はActionScriptファイルに書きます。

図3-2-3 フレームアクションに設定できる要素。


■フレームアクションが実行されるタイミング
フレームアクションは、キーフレームが再生されたときに1度だけ実行されます。たとえば、フレーム5がキーフレームになっているフレーム5~10の区間が再生される場合は、フレーム4からフレーム5に移ったとき、あるいはほかのフレームからこの区間にジャンプしてきたときに1度だけ実行されます。もしフレーム11にフレーム8に戻るスクリプトが書いてあったとすると、フレーム8~11のループ再生を行い、フレーム8を再生するたびにキーフレームのフレームアクションが実行されることになります。

■スクリプトの実行順と有効範囲
フレームアクションは1行目から順に実行されます。フレームアクションではfunctionを使ってメソッドや関数を定義できますが、同じフレームアクションに書いてあるスクリプトはすべて読み込まれてから実行されるので、1行目のスクリプトで2行目以降に定義してあるメソッドや関数を呼び出すことができます。
ただし、まだ再生していないフレームで定義してあるメソッドや関数を呼び出すことはできません。既に再生したフレームのフレームアクションならば呼び出せます。(ActionScript1.0のメソッドと関数→p.??)
また、タイムラインが1フレームしかない場合やthis.gotoAndStop(1);やthis.stop();というように、フレームアクションが設定されているフレームに留まる場合にも最初に1回しか実行されません。したがって、1フレームしかない場合などには、変数の初期化などが繰り返し行われることはありません。

■イベントハンドラ
Flash MX(Flash Player 6)から、フレームアクションにおいてインスタンスにイベントハンドラを設定できます。これにはいくつかのメリットがあります。
1つは、ムービークリップのアクションをonClipEventイベントハンドラに頼らなくてもよくなったことで、シンボル内にイベントハンドラを書き込むことができるようになりました。これにより、同じシンボルから作られるムービークリップのインスタンスにおいて共通のイベントハンドラを使えるようになります。
ただし、先にも書いたようにフレームアクションをムービークリップシンボル自身のタイムラインに書き込んだほうが効率がよいケースと、メインのタイムラインのフレームアクションからすべてのインスタンスを制御するほうがよいケースがあります。
2つは、ボタンのイベントハンドラでしか利用できなかったonPressやonRollOverなどのイベントアクションがムービークリップのイベントアクションでも利用できるようになりました。これも大変便利な部分です。たとえば、イベントハンドラを設定するインスタンスの名前がmy_mcだったとき、次のようにイベントハンドラを書きます。

my_mc.onPress = function(){
//インスタンスmy_mcがクリックされた時に実行するステートメント
};

3つは、ムービークリップ(MovieClipクラス)、ボタン(Buttonクラス)、テキストフィールド(TextFieldクラス)だけではなく、Soundクラス、Stageクラス、MovieClipLoaderクラスなどのコアクラスと呼ばれる標準のクラスがイベントをイベントハンドラで処理する仕様になっているからです。これによりスクリプトの様式が統一されて見通しも良くなります。

■MovieClipオブジェクトが受け取るイベント
ムービークリップのインスタンスは、MovieClipクラスから作られたインスタンス(MovieClipオブジェクト)です。MovieClipオブジェクトには次のイベントハンドラを設定できます。
ただし、onKeyDownやonKeyUpのイベントは、イベントが発生してもそのままではMovieClipオブジェクトに対してはイベントメッセージが送信されません。イベントを受け取るには、focusEnabledプロパティでフォーカスが当てるか、あるいはaddListener()メソッドを使ってKeyオブジェクトのリスナーに登録する必要があります。(リスナー→p.??)


イベントハンドラ     タイミング
MovieClip.onData   ムービークリップを読み込みが終わった。
MovieClip.onDragOut このムービークリップの上でマウスダウンしたままカーソルが外へ出て再び戻った。
MovieClip.onDragOver このムービークリップの上でマウスダウンしたままカーソルが外へ出た。
MovieClip.onEnterFrame フレームが進んだ。
MovieClip.onKeyDown キーが押された。(フォーカスがあるとき)
MovieClip.onKeyUp  押されたキーが上がった。(フォーカスがあるとき)
MovieClip.onKillFocus このムービークリップからフォーカスが移動した。
MovieClip.onLoad ムービークリップが読み込まれて表示された。
MovieClip.onMouseDown マウスボタンが押された。
MovieClip.onMouseMove マウスカーソルが動いた。
MovieClip.onMouseUp  マウスボタンが上がった。
MovieClip.onPress    このムービークリップがクリックされた。(マウスダウン時)
MovieClip.onRelease   このムービークリップがクリックされた。(マウスアップ時)
MovieClip.onReleaseOutside このムービークリップがプレスされたままカーソルが外へ出てマウスアップした。
MovieClip.onRollOut このムービークリップの外へカーソルが出た。
MovieClip.onRollOver このムービークリップの中にカーソルが入った。
MovieClip.onSetFocus このムービークリップにフォーカスが移った。
MovieClip.onUnload ムービークリップがタイムラインから消えた。


図3-2-4 MovieClipクラスのイベントハンドラ。

これをスクリプトで使用するには、「MovieClip」の部分を実際のインスタンス参照にします。たとえば、次のようになります。

this.onEnterFrame
my_mc.onPress
_root.my_mc.cat_mc.onRollOver


具体的なサンプルを示すと次のような使い方があります。このサンプルでは、ステージにcat_mcインスタンスを置き、メインのタイムラインのフレーム1に次のフレームアクションを書いています。ムービーをパブリッシュするとインスタンスが回転し、クリックすると逆回転になります。

sample→cat1.fla

フレームアクション:
//初期値の設定
cat_mc.k = 1;
//回転
cat_mc.onEnterFrame = function() {
this._rotation += this.k * 10;
};
//クリックで逆回転
cat_mc.onPress = function() {
this.k *= -1;
};

同様の動作を行うスクリプトをムービークリップシンボル自身のタイムラインに書き込む場合にはcat_mcというインスタンス名をthisに置き換えるだけです。このシンボルから作られたインスタンスはすべて回転するようになります。

sample→cat2.fla

フレームアクション(シンボル自身のタイムラインに記述する場合)
this.k = 1;
//回転
this.onEnterFrame = function() {
this._rotation += this.k * 10;
};
//クリックで逆回転
this.onPress = function() {
this.k *= -1;
};


■Buttonオブジェクトが受け取るイベント
ボタンのインスタンスには後述するようにボタンアクションにおいてon (press)といったイベントハンドラを設定できますが、フレームアクションでイベントハンドラを設定することもできます。ボタンのインスタンスは、Buttonクラスから作られたインスタンス(Buttonオブジェクト)です。Buttonオブジェクトには次のイベントハンドラを設定できます。
ただし、onKeyDownやonKeyUpのイベントは、イベントが発生してもそのままではButtonオブジェクトに対してはイベントメッセージが送信されません。イベントを受け取るには、focusEnabledプロパティでフォーカスが当てるか、あるいはaddListener()メソッドを使ってKeyオブジェクトのイベントリスナーに登録する必要があります。(イベントリスナー→p.??)

イベントハンドラ     タイミング
Button.onDragOut このボタンの上でマウスダウンしたままカーソルが外へ出て再び戻った。
Button.onDragOver このボタンの上でマウスダウンしたままカーソルが外へ出た。
Button.onKeyDown キーが押された。(フォーカスがあるとき)
Button.onKeyUp  押されたキーが上がった。(フォーカスがあるとき)
Button.onKillFocus  このボタンからフォーカスが移動した。
Button.onPress    このボタンがクリックされた。(マウスダウン時)
Button.onRelease   このボタンがクリックされた。(マウスアップ時)
Button.onReleaseOutside このボタンがプレスされたままカーソルが外へ出てマウスアップした。
Button.onRollOut このボタンの外へカーソルが出た。
Button.onRollOver このボタンの中にカーソルが入った。
Button.onSetFocus このボタンにフォーカスが移った。

図3-2-5 Buttonクラスのイベントハンドラ。

■TextFiledオブジェクトが受け取るイベント
テキストフィールドのインスタンスは、TextFieldクラスから作られたインスタンス(TextFieldオブジェクト)です。TextFieldオブジェクトには次のイベントハンドラを設定できます。

イベントハンドラ     タイミング
TextField.onChanged  このテキストフィールドの内容が更新された。(フォーカスがあるとき)
TextField.onKillFocus  このテキストフィールドからフォーカスが移動した。
TextField.onScroller  このテキストフィールドのスクロールの状態が変化した。(フォーカスがあるとき)
TextField.onSetFocus  このテキストフィールドにフォーカスが移った。

図3-2-6 TextFieldクラスのイベントハンドラ。

■その他のオブジェクトが受け取るイベント
このほかにも、Soundオブジェクト、LoadVarsオブジェクト、XMLオブジェクト、XMLSocketオブジェクトなどが、それぞれに関連したイベントハンドラをもつことができます。

イベントハンドラ     タイミング
Sound.onLoad  サウンドデータが読み込まれた
Sound.onSoundComplete サウンドの再生が終わった
LoadVars.onLoad  loadまたはsendAndLoadの実行が完了した
LoadVars.onData  loadまたはsendAndLoadでデータを読み込んだ
XML.onLoad  loadまたはsendAndLoadの実行が完了した
XML.onData  loadまたはsendAndLoadでXMLデータを読み込んだ
XMLSocket.onClose  XMLSocketの接続が閉じた
XMLSocket.onConnect  XMLSocketの接続が確立した
XMLSocket.onData    XML形式のストリングデータを受信した
XMLSocket.onXML  XMLオブジェクトをサーバーから受信した


図3-2-7 その他のクラスのイベントハンドラ。

投稿者 oshige : 2005年02月13日 15:09

トラックバック

このエントリーのトラックバックURL:
http://oshige.com/mt/mt-tb.cgi/1117

コメント

コメントしてください




保存しますか?