サイトトップ

Director Flash 書籍 業務内容 プロフィール

アッと驚く達人の技Flash MX ActionScript実践技&ウラ技大全

032 ランダムに犬の足跡を表示する

ID: FB0303001 Page: 83/Line: 4


[p.83「3 インスタンスを複製するソース」のスクリプト]

_root.IMC.duplicateMovieClip("IMC"+D, D);
eval("IMC"+D)._x = Math.random()*KX;
eval("IMC"+D)._y = Math.random()*KY;
D += 1;
if (D>50) {
  stop();
}


補足

書籍のサンプルは、3フレームに分けたフレームアクションで構成されています。しかし、Flash MXの機能をフルに活用すれば、ムービーを1フレームにして、第1フレームアクションのみで作成することができます。

メインのタイムラインの第2〜第3フレームを削除して1フレームにしたら、 第1フレームに以下のフレームアクションを設定します。行っている処理の基本的な内容自体は、書籍のサンプルと同じです。

// _root: メインのタイムライン
// 第1フレームアクション

KX = Stage.width;
KY = Stage.height;
D = 2;
this.onEnterFrame = function() {   //[1]イベントハンドラメソッドを定義
  //[2]MovieClipの位置座標をオブジェクトとして作成

  initObject = {_x:Math.random()*KX, _y:Math.random()*KY};
  //[3]オブジェクトを引数としてMovieClipの複製
  _root.IMC.duplicateMovieClip("IMC"+D, D, initObject);
  if (++D>50) {   //[4]変数を加算のうえ条件判定
    delete this.onEnterFrame;   //[5]イベントハンドラメソッドの定義をクリア
  }
};

第1〜第3ステートメントは、書籍の第1フレームアクションの記述(p.82)とまったく同じです。

[1]第4ステートメントは、メインのタイムライン(スクリプトの記述場所'this')に対して、イベントハンドラメソッド'MovieClip.onEnterFrame'を設定しています。イベントハンドラメソッドは、Flash MXから採用されたメソッドです。さまざまなイベントに対応したメソッドが用意されており、そのイベントが発生したときに行う処理を定義することができます。

'MovieClip.onEnterFrame'メソッドには、ステージの描画が更新されるとき(フレームレートFPSに対応)に実行したい処理を定義します。ですから、このメソッドを使えば、書籍のサンプルのように(第2〜第3の)2フレームをループする仕組みは必要なくなります。イベントハンドラメソッドの設定は、別途定義した'function'名を代入するか、'function'を(「名前のない関数(匿名関数/関数リテラル)」で)直接記述します。

[2]Flash MXでは、'MovieClip.duplicateMovieClip'メソッドに新たに引数がひとつ追加されました(オプションなので、指定しなくても構いません)。第3引数として、複製したMovieClipに設定したいプロパティとその値を渡すことができるようになりました。この引数に指定するのは、Objectオブジェクトです。MovieClipに設定したいプロパティとその値を、Objectオブジェクトのインスタンスに定義します。ここでは、Objectオブジェクトについての詳細を理解する必要はありません(これは、中級者以上に対するテーマになります)。以下の定義のしかただけ覚えておけばよいでしょう(変数名initObjectは、任意です)。

initObject = {プロパティ1の名前:プロパティ1の値 , プロパティ2の名前:プロパティ2の値, ... };

[3]第6ステートメントでは、'MovieClip.duplicateMovieClip'メソッドの第3引数として、前のステートメントで作成したObjectオブジェクトのインスタンスを渡しています。第1、第2引数は、書籍のサンプルスクリプト(p.83)と同様です。

[4]書籍のスクリプトでは、変数Dの加算と、加算後の変数値の'if'条件による評価は別個のステートメントになっています。「プリインクリメント」の演算子'++'を使えば、加算の処理を'if'条件の式の中で行ってしまうことができます。これにより、変数Dに1加算したうえ、その加算後の値を(50より大きいかどうか)評価するという処理を、ひとつの論理式(++D>50)で記述することができるのです。

[5]イベントハンドラメソッドに定義した処理を停止させるには、その定義をクリアします。イベントハンドラメソッドの定義をクリアするのは、演算子'delete'です。'delete'演算子はメソッドへの定義をクリアするだけです。イベントハンドラメソッドそのものを削除する訳ではありません。ですから、また必要になればいつでも定義を行うことができます。

_____

作成者: 野中文雄
作成日: 2003年3月2日


Copyright © 2001-2017 Fumio Nonaka.  All rights reserved.