|
onClipEvent ハンドラ は レイヤーに配置したスプライトに直接スクリプトを記入するときに使うものです。
この onClipEventハンドラ は,Macromedia(現Adobe) Flash 5(Flash Player 5)から登場したもので,Suzuka は SWF6(Flash Player 6 用 SWF)以上を作成するのが基本仕様ですから,あまり使わないものが多いと思います。また当然,SWF4 を作成する場合も使用不可能です。
しかし,SWF6 以上 でも,onClipEvent (load) { } と onClipEvent (enterFrame) { } くらいは使うことがあるかもしれないので,この2つに関してのサンプルを作成してみました。
サンプル作成に使用した ParaDraw のバージョンは Ver.0.3a4, Suzuka のバージョンは Ver. 0.7.3.3 です。
「車」をクリックしてもらうと「車」が左に動き出して,右から元の位置に戻ってきます。ただそれだけのものです。
簡単な動きのものですが,タイムラインを使用したアニメーションではありません。ActionScript で動かしていますので,使用しているフレームは1フレームのみです。
上のサンプルでは「車」に直接スクリプトを書いています。
// このスプライトが表示されたとき
onClipEvent (load) {
// 変数 my_x にこのスプライトの x座標 を記録
my_x = this._x;
}
// 1フレーム進む時間ごとに毎回実行
onClipEvent (enterFrame) {
// このスプライトの x座標が
// 記録しておいた my_x 以上の場合
if (this._x>=my_x) {
// my_x に近づける
this._x += (my_x-this._x)/15;
// このスプライトの x座標が
// キャンバスの左端に切れるまで
} else if (this._x>-this._width) {
acc *= 107/100;
// 左に 5px 移動
this._x -= acc;
// それ以外になったら
} else {
// キャンバスの右端に移動
this._x = Stage.width;
}
// 影の車のx座標をこのスプライトと一致させる
_root.shadow._x = this._x;
}
// このスプライトをクリックしたとき
on (release) {
// 記録しておいた my_x-1 に移動
this._x = my_x-1;
// 加速する変数 acc を初期化
acc = 1;
}
|
Flash Player 6 以上(SWF6以上)では,MovieClip(スプライト)に onハンドラ が書けるので,上記のように,それと併用する場合はメリットがあるかもしれません。
onClipEventハンドラは,使われることは少なくなくなったものが多いですが,実は次のようなものが存在しています。
// スプライトがロード(表示)されたときに実行
onClipEvent (load) { }
// 1フレーム進む時間ごとに毎回実行
onClipEvent (enterFrame) { }
// スプライトがタイムラインから無くなった後に実行
onClipEvent (unload) { }
// マウスポインタを押したときに実行
onClipEvent (mouseDown) { }
// マウスポインタを離したときに実行
onClipEvent (mouseUp) { }
// マウスを動かしたときに実行
onClipEvent (mouseMove) { }
// どれかキーを押したときに実行
onClipEvent (keyDown) { }
// どれかキーを離したときに実行
onClipEvent (keyUp) { }
// スプライトがデータを取得したときに実行
onClipEvent (data) { }
// ↓以下は主に コンポーネント系 などに使用する↓
// スプライトがロード(表示)される寸前に実行
onClipEvent (construct) { }
// スプライトがロード(表示)される寸前のさらに寸前に実行
onClipEvent (initialize) { }
|
・onClipEvent (mouseDown) { }
・onClipEvent (mouseUp) { }
・onClipEvent (mouseMove) { }
この3つは,Mouseクラスのメソッドを使うのが一般的ですから,SWF6 以上ではあまり使いません。
そもそも Flash 5 の頃は,オブジェクト(クラス)が少なくて,何でもかんでも MovieClip(スプライト) に任せていました。今普通に考えると,マウスを監視するために,監視用の MovieClip をわざわざ作成するということが変ですね。
例えば onClipEvent (mouseMove) { } は,MovieClip上でマウスが動いたときに実行されるのではなく,Flash 上のどこにマウスがあっても,そのマウスが動いたときに実行されます。
これは変ですし,使い方を間違える方も多々いらっしゃったと思います。
・onClipEvent (keyDown) { }
・onClipEvent (keyUp) { }
この2つは Keyクラスのメソッドを使うのが一般的ですから,SWF6 以上ではあまり使いません。
同じく,キーを監視するのに MovieClip を作成するのは変だと思います。
・onClipEvent (data) { }
これは LoadVarsクラスの onData などを使うのが一般的です。
・onClipEvent (enterFrame) { }
これくらいは使うこともありますが,フレームに書く MovieClip.onEnterFrame = function(){ }; の方が,どちらかというと融通が利いていて,使いやすいです。
onClipEvent (enterFrame) { } は,そのスプライトがフレーム上から消えるまで動作し続けますから,無駄な処理をずっとさせ続けることになる可能性も大きくなります。
一方,MovieClip.onEnterFrame = function(){ }; は,delete で削除できますから,無駄な処理を少なくできる可能性があります。
また,onClipEventハンドラ はレイヤーに配置されたスプライトに書けるだけで,シンボルリストのスプライトシンボルには書けません。
したがって,ゲームなどで良く使用される attachMovie でシンボルリストから複製されたスプライトは onClipEvent (enterFrame) { } で動かせないということになります。
その点から考えても MovieClip.onEnterFrame = function(){ }; の方が断然有利です。
・onClipEvent (load) { }
これだけは,他で代用できない(しにくい)ことがあるので結構使えます。
例えば,loadMovie でスプライトに外部ファイルをロードしたとき,そのロード完了をトリガ(動作の引き金)として { } 内のスクリプトを動作させることができます。
MovieClipLoaderクラス のややこしいスクリプトを使うくらいなら,onClipEvent (load) { } で済ませた方が良いのではないの? ということが度々あります。
※ ただし,onClipEvent (load) { } の { } 内で自分自身のスプライトに
loadMovie で外部SWFやJPEGなどをロードすることはできません。
この件に関して深く知りたい方は次の URL を参考にしてください。
ActionScript界の巨匠,野中 文雄さんが,
面白いたとえ話で解説されています。
「onClipEvent(load)で自分自身にloadMovieしてはいけません」
http://f-site.org/articles/2003/10/27232817.html
・onClipEvent (initialize) { }
これは,主にコンポーネント系などのスプライトに使用することがあるもので,onClipEvent (load) { } よりも早く実行されます。
目的は,主にコンポーネントの外観(スキンやラベル文字列など)の決定に使われます。
本家 Adobe Flash では,コンポーネントを使用する際,ステージ上(キャンバス上)に配置したコンポーネントの外観や初期値などは「パラメータタブ」によって設定することができます。
そういったコンポーネントの使用方法ではなく,あらかじめ用意しておいたコンポーネント入りSWFを,リンクシンボルから呼びだすような場合に,初期値パラメータをコンポーネントに与えるようなときに使えます。
また,コンポーネント的ではない普通のスプライトでも,そのload前に既定値を与えておくことにも使えます。
いったいどういうときに使うのかがわかりにくいと思いますが,使用例は Suzuka の開発者 Uzo氏 作の「チェックボックス」や「クラス」のサンプルなどを見ていただくとわかりやすいかもしれません。
・onClipEvent (construct) { }
これも,主にコンポーネント系などのスプライトに使用することがあるものらしいですが,詳細は不明です。すみません。というか普通は使いません(と言って誤魔化す)。
なんでも,onClipEvent (initialize) { } より遅く,onClipEvent (load) { } よりも早く実行されるらしいです。
という感じで,今はあまり使うことがなくなったか,もしくは特殊な場合に使うものが多いです。
ですからこの 基礎・基本 に onClipEventハンドラ を入れるべきかどうかは少し悩みましたが,使えることは確かですし,onClipEvent ハンドラ から発展してできたスクリプトやクラスは多く,ActionScript の変遷を知っておくのも損はないと思いましたので,変遷の情報も加えて一応入れることにしました。
---2007年8月16日---
初回アップ
---2007年10月15日---
onClipEvent(construct)
onClipEvent(initialize)
に関しての内容を追加
|