PR

ムービークリップ側に配置したテキストフィールドや
入れ子のムービークリップにアクセスするには?

 ライブラリ内のムービークリップにカスタム・クラスを割りあてる方法と,その処理を実行する方法はわかりました。では,ここでもう一つ問題です。ムービークリップ側に,テキストフィールドや入れ子になったムービークリップなどが配置してあった場合,カスタム・クラス側からはどのようにして,それらにアクセスすれば良いのでしょうか。

 例えば,図11のように,ムービークリップ内に一つのテキストフィールド「msgText」と,一つのムービークリップ・インスタンス「ase」が用意されているとします。

図11: ムービークリップ内に用意されているパーツ

 この場合,カスタム・クラス側では,図12のようにムービークリップ内のパーツにアクセスします。

図12: カスタム・クラスからムービークリップ内のパーツへアクセスするコード

 カスタム・クラス側で,ムービークリップ内に配置したテキストフィールドやムービークリップのインスタンス名と同名の変数(プロパティ)を宣言します。するとあとは,その変数を使って,各パーツへとアクセスできます。この際,わかりやすい名前のアクセサ・メソッドを作成してプロパティにアクセスできるようにしておくと,ムービークリップの利用者(自分を含む)がムービークリップ内のパーツのことを意識せずに,カスタム・クラスの任意の名前のプロパティを操作する感覚で操作できるので便利です。

 このカスタム・クラス側の変更を踏まえ,Flashドキュメント側のコードを次のように変更します。

//あらかじめ配置してあるインスタンス「hiyo1」「hiyo2」を初期化
hiyo1.init(10,"");
hiyo2.init(25,"");
//captionプロパティを変更
hiyo1.caption = "ピヨレッドです"
hiyo2.caption="ピヨブルーです"
//スクリプトから四つのインスタンスを生成
var _piyo:MovieClip;
for (var i:Number = 0; i<4; i++) {
  //カスタム・クラスを割り当てたムービークリップのインスタンスを
  //識別子を使って生成
  _piyo = _root.attachMovie("Piyosan", "piyo"+i, i);
  //初期位置のセット(MovieClipクラスのプロパティの利用)
  _piyo._x = Math.random()*100;
  _piyo._y = 50*i+100;
  //初期化処理の実行
  _piyo.init(5*i+5,"ピヨ" + i + "号機です");
}

 ムービークリップ側に用意してあるテキストフィールド「msgText」とムービークリップ・インスタンス「ase」を意識することなく,アクセサ・メソッドで実装した「captionプロパティ」を使って表示する文字列を指定したり,インスタンスaseの表示/非表示を切り替えたりしています。実行結果は図13のようになります。

図13: 実行結果(クリックするとムービーを表示します。Flash8で読み込めるソース・ファイルsample2.zipをこちらからダウンロードできます

 カスタム・クラス側にいろいろなプロパティ,メソッドを準備していくと,まるで一つのコンポーネントのようなムービークリップが作成できそうですね(*4)。

 今回は,カスタム・クラスをムービークリップに割り当てて利用する方法を紹介しました。これで今まで学習してきたクラスの考え方を利用すれば,いろいろな独自の機能を備えたコンポーネントのようなムービークリップを作成できますね。

 さて,長い期間にわたって連載をさせていただきました,本講座も今回で最終回です。拙稿をご覧になっていただいておりました皆様,本当にありがとうございました。Flash8は本当にいろいろな使い方のできる,面白いアプリケーションです。仕事の場において,そして趣味の場において,皆様が本講座でご紹介した知識を足掛かりに,楽しいムービー制作を進められるようになることを,心から願います。

 ではでは,皆様,良いFlashライフを。

コーヒーブレイク●ムービークリップを一つのパーツとして扱うスタイル

 本文中では,ライブラリ内のムービークリップにカスタム・クラスを割り当てて使用する方法をご紹介しました。しかし,他言語のプログラミング・スタイルに慣れている方の中には,attachMovieでインスタンスを作成するこのスタイルが,どうもなじめない,という方も多いかと思います。

 そんな場合には,表示するムービークリップ・インスタンスを,カスタム・クラスのインスタンスではなく,カスタム・クラスのインスタンスの,プロパティの一つとして扱うというプログラミング・スタイルをお勧めします。

 これは,テキストで説明するよりも,実際のコードを見ていただいたほうが早いかと思います。要は,こんな感じでカスタム・クラスを作成するのです(Flash8で読み込めるソース・ファイルsample3.zipをこちらからダウンロードできます)。

import mx.utils.Delegate;
class ClayDollInfo {
  var doll:MovieClip; //表示するムービークリップへの参照
  var speed:Number; //移動スピード
  var stageWidth:Number;  //ステージの幅(折り返すポイント)
  
  //初期化処理
  function ClayDollInfo(_speed,_text,_doll) {
    doll=_doll
    speed = _speed;
    if(speed<20){
      doll.ase._visible=false;
    }
    stageWidth = 320;
    caption = _text
    //Delegateクラスを使ってスコープチェーンを固定
    doll.onEnterFrame = Delegate.create(this, _move);
  }
  //移動処理
  private function _move() {
    doll._x = (doll._x+stageWidth+speed)%stageWidth;
  }
  //テキストフィールドの文字列を変更するアクセサ・メソッド
  function set caption(_text){
    doll.msgText.text = _text
  }
}

 クラス「ClayDollInfo」は,本文中で作成したClayDollクラスとほぼ同じ動きを実現をするクラスです。違いは,MovieClipクラスを継承して作成するクラスではなく,「doll」プロパティというプロパティに,動きを管理したいムービークリップ・インスタンスを格納する点です。

 インスタンスを移動させる場合や,テキストを表示させる場合には,すべてこのdollプロパティに格納されたムービークリップ・インスタンスに対して処理を行います。このような形でカスタム・クラスを作成することで,わざわざカスタム・クラスをムービークリップに関連付けなくても,任意のムービークリップ・インスタンスの動きを制御するクラスが作成できます。また,このような形でクラスを作成しておくと,簡単に制御するインスタンスを切り替えられる,というメリットもあります。

 このClayDollInfoクラスを使用するには,

var dollList:Array = new Array();
//あらかじめステージに配置してあった二つのインスタンスを管理対象に設定
dollList.push(new ClayDollInfo(10, "ピヨレッドです", hiyo1));
dollList.push(new ClayDollInfo(25, "ピヨブルーです", hiyo2));
//スクリプトから四つのインスタンスを生成
var _piyo:MovieClip;
for (var i:Number = 0; i<4; i++) {
  //カスタム・クラスを割り当てたムービークリップのインスタンスを
  //識別子を使って生成
  _piyo = _root.attachMovie("Piyosan", "piyo"+i, i);
  //初期位置のセット(MovieClipクラスのプロパティの利用)
  _piyo._x = Math.random()*100;
  _piyo._y = 50*i+100;
  //ClayDollInfoクラスのインスタンスを生成
  dollList.push(new ClayDollInfo(5*i+5, "ピヨ"+i+"号機です", _piyo));
}

のように,管理したいムービークリップ・インスタンスはムービークリップ・インスタンスでまず生成し,その参照をClayDollInfoクラスのコンストラクタ関数に渡します。

 また,カスタム・クラス内でプロパティとして参照しているインスタンスのイベント(onEnterFrameイベントハンドラ等)を利用する際には,Delegateクラスを利用すると,スコープをカスタム・クラス内に移動することもできます(*5)。

 このような方法ですと,new演算子を使った初期化もOKですね。ただし,MovieClipクラスを継承していませんので,表示されているムービークリップを動かそうとして,作成したインスタンスに対して,うっかりムービークリップ感覚で「インスタンス._X+=10;」などとしても移動してくれませんので,その点は注意が必要です(*6)。