私は、フキダシが大好きなので、今後Flashでもフキダシを使いまくることと思われる。
その度にいちいち実装していては面倒なことこのうえないので、オブジェクトを作っておくことにした。
Flashの場合、カスタムコンポーネントというやつでMCベースのオブジェクトが作れるみたい。
あ、ところで、インスタンス変数の頭に_をつけるやつ、あんまり推奨されてないっぽいので、もうやめることにした。
標準のオブジェクトがやってるから、真似してみたんだけど、マクロメディアのコーディングスタンダードでは、「変数は_から始めるな」とあるので、あっさり撤回。
すいません、もうしません(英語を読み間違えてるってことはないだろーな…)
とりあえず、ヘルプファイルを読んでも、標準のGUIコンポーネントの使い方は載っていても、コンポーネントの作り方は載っていない。
そこで、マクロメディアのサイトを探検。
「Macromedia Flash MX でのコンポーネントを作成する 」という記事を発見したので、読んでみる。
なんか、オブジェクトの定義とかのActionScriptの説明が、すっぽりと抜けててないんですが…
このチュートリアルを読んで、アイコンの付け方とか、ヘルプ書類やライブプレビュー、カスタムインターフェイスの作り方は分かるが、コンポーネントの作り方のキモが分からないっつーのは、いかがなもんだろうか。
それに、マニュアルといい、このチュートリアルといい、日本語がかなり変ですマクロメディアさん。
しょうがないので、Webを彷徨うこと2日、「Creating a Flash MX Component 」という、ズバリなページを発見。
このflashcomponents.netってのは、その名の通りFlashコンポーネントの情報満載でとても素敵だ。
まず、フキダシの形を描いて、その上にテキストフィールドを置く。
テキストフィールドの変数欄は、wordsと書いておく。
んで、フキダシとフィールドの両方を選択した状態で、ムービークリップシンボルに変換する。
このムービークリップの名前は、TFBalloonとする。
#initclipと#endinitclipの間に書かれたスクリプトは、コンポーネントがロードされた後、1回だけ実行される。
だから、ここでオブジェクトの定義諸々を行っておくと、インスタンスを作る度にオブジェクトの再定義とかしなくて済むし、タイムラインに関係なく実行されるので、確実な定義が保証される。
#initclipは、ムービークリップの1フレーム目に書く、他のところには書けない。
スクリプトは次のようになった、このあたりがコンポーネントの基本的なスクリプトとなる。
#initclip
//コンストラクタ
function TFBalloonClass() {
}
//ムービークリップを継承
TFBalloonClass.prototype = new MovieClip();
//クラスと、シンボルを結び付ける
Object.registerClass("TFBalloon", TFBalloonClass);
#endinitclip
ライブラリパネルを開き、スクリプトが書いてあるムービークリップのシンボルの名前を"TFBalloon"としておく。
そして、コンテクストメニューから[コンポーネント定義...]を選択する。
変数にwordsを設定、タイプはStringにしておく。
wordsは、ムービークリップ内に用意したテキストフィールドの変数名と同じなので、setWords()とgetWords()メソッドを作っておかなくても、wordsで値の設定・参照が可能となる。要は手抜きだ。
それから、もう一つライブラリパネルで設定しておくものが残っている。
コンテクストメニューから[プロパティ...]を選択して、[リンケージ]-[ActionScriptに書き出し]にチェックを入れる。
[識別子]は[名前]と同じTFBalloonにしておく、チェックを入れた時点で、自動的に設定されているはずだ。
Object.registerClass("TFBalloon", TFBalloonClass)で結び付けられているのは、この識別子だから、間違いなく書いておく。
とまぁこんな感じで、一旦ムービープレビューを実行する。うむ、問題なし。
次に、ステージにあるTFBalloonのインスタンスのwordsパラメータを適当に設定して、もう一度プレビューしてみる。ちゃんとフキダシの中身が変わっていることが確認できた。
オブジェクトがロードされた時点で、パラメータが参照され、テキストフィールドの文字が書き換えられているようだ。
ちなみに、この程度でコンポーネントにするメリットは全然ない。
これをベースに、いろいろと機能を追加して、使えるコンポーネントにしたい。
このコンポーネントを使って、ちょっとswfを作ってみた。
コンポーネントにメソッドを付ける方法や、コンポーネントパネルにコンポーネントを置く方法やらはまたの機会に。
今日はここまで。
2003-07-24