ささきち流 Suzuka & ParaDraw 講座
Suzuka & ParaDraw
TOP
PROFILE
ActionScript Editor
LINK
BBS


フリーのFlash作成ソフト SuzukaParaDraw でFlashな生活を楽しもうというサイトです。
Suzuka 基礎・基本 Math.randomメソッド (&loadMovie)

 次のサンプルはゲームではありません。
 左下のボタンをクリックすると,ランダムな文章と,ジョーカー・スペードA・ハートA・ダイヤA・クラブA のうちどれかのトランプのカードがランダムに表示されるという,ただそれだけのものです。

 

 サンプルの作成などに使用した ParaDraw のバージョンは Ver.0.3a4, Suzuka のバージョンは Ver. 0.8.0.0 です。

 このページは,
 「Math クラスの random メソッド でランダムな数を得て,ランダムな動作をさせる。」 ということと,
 「MovieClip.loadMovieメソッド の続編として,SWF をロードする場合」 の例を説明するために作成しました。

 「ランダムな数が1つ出れば,その1つの乱数から,様々なことができるよー。」
 「その例として,ランダムな SWF をロードしてみるからね。」
 ということだけのサンプルを作成するつもりでしたが,要素が複合的に出没して少し本題が見えにくくなってしまったかもしれませんが,
 一応,メインのムービー(SWF)は 1フレーム のみにして,スクリプトも onRelease など イベントハンドラメソッドを使って フレーム1 に書くだけにして,なるべく見やすくしたつもりです。

 メインのムービー(kiso251.swf)の フレーム1 には,インスタンス名「rand_btn」というボタンがあって,フレーム1 のスクリプ トは次のようになっています。

// 表示する言葉データの登録
w0 = "残念。ジョーカーです。";
w1 = "すごいなスペードかー。";
w2 = "ハートか。結構やるね。";
w3 = "ダイアじゃまだまだ。";
w4 = "ハハハ,クラブだね。";
//
// 変数 n の初期化
n = 0;
//
// ボタンrand_btn クリック時の動作を定義
_root.rand_btn.onRelease = function() {
	//
	// ★変数 r にランダムな 0〜4 の整数を代入
	r = Math.floor(Math.random()*5);
	//
	// 変数 r をテキストフィールド rn_txt に表示
	_root.rn_txt.text = r;
	//
	// ランダムな言葉をテキストフィールド rw_txt に表示
	_root.rw_txt.text = _root["w"+r];
	//
	// ランダムな SWF を loadMovie
	// n に 1 を加算
	n++;
	// ロード用ムービークリップ(スプライト) load_mc? を作成
	_root.createEmptyMovieClip("load_mc"+n, n);
	// 座標指定
	_root["load_mc"+n]._x = 50;
	_root["load_mc"+n]._y = 25;
	// ★ランダムな SWF をロード
	_root["load_mc"+n].loadMovie("kiso2/card"+r+".swf");
	// 連続クリック防止のためボタンを無効にする
	this.enabled = false;
};

 「kiso2」フォルダ内には 「card0.swf」 〜「card4.swf」 というムービーが入っていて,
 乱数 r の値によっていずれかがロードされます。
 「トランプがめくれる」 というアニメーションがその 外部SWF の部分です。

Math.random によって表示されるもの

 

 本題は,
  // ★変数 r にランダムな 0〜4 の整数を代入
  r = Math.floor(Math.random()*5);
 と,
  // ★ランダムな SWF をロード
  _root["load_mc"+n].loadMovie("kiso2/card"+r+".swf");
 だけのつもりです。
 ついでに,それにみあった,ランダムな言葉を表示させているだけです。

 

 

 まず1つ目の本題,
  // ★変数 r にランダムな 0〜4 の整数を代入
  r = Math.floor(Math.random()*5);
 に関してです。

  Math.random()
 これで,0 以上 1 未満のランダムな数を求めることができます。

 したがって,
   Math.random()*5
 これで,その範囲が5倍に拡大されて,0 以上 5 未満のランダムな数を求めることができます。

 次の,
  Math.floor()
 これは,小数点以下の数を全て切り捨て数を整数にします。

 したがって,
  Math.floor(Math.random()*5);
 これで,0 以上 5 未満のランダムな数の小数部分が切り捨てられるわけですから 0〜4 の整数を求めることができます。

 したがって,
  r = Math.floor(Math.random()*5);
 これで,0〜4 の整数が変数 r に代入されます。

 あとは,この r (0〜4のいずれかの整数)を使って,
  w0 = "残念。ジョーカーです。" 〜 w4 = "ハハハ,クラブだね。"
 のうちのどれかを表示させたり,
  _root["load_mc"+n].loadMovie("kiso2/card"+r+".swf");
 で,「 kiso2/card?.swf」 をロードさせたりしています。

 

 

 2つ目の本題,
  // ★ランダムな SWF をロード
  _root["load_mc"+n].loadMovie("kiso2/card"+r+".swf");
 についてですが,
 これ自体は,配列アクセス演算子MovieClip.loadMovieメソッド で説明したような内容です。

 上の loadMovie の行自体が2つ目の本題の本題ではなく,
 JPEG ではなく SWF をロードしているという点が本当の本題です。

 _root["load_mc"+n]loadMovie の n はボタンがクリックされるたびに,
  0→1→2→3→…
 と 1 ずつ上がって行く数です。

 したがって,ムービークリップ(スプライト) 「load_mc? (?は順次繰り上がる数)」 に外部SWFがロードされるわけですが,
 親SWFにロードされた SWF は,ロードされた時点で,すでに SWF 扱いではなくて,それが読み込まれた 「load_mc?」 として扱われます。
 これが2つ目の本当の本題です。

 「card0.swf」 〜「card4.swf」 のアニメーションの最終フレームには次のように書いています。

stop();
// 1つ前に作成したムービークリップ(スプライト) load_mc? を削除
this._parent["load_mc"+(this._parent.n-1)].removeMovieClip();
// ボタンrand_btn を有効にする
this._parent.rand_btn.enabled = true;

 上のスクリプトを書いた 「card0.swf」 〜「card4.swf」 の _root は,単独で見ると _root なのですから,ターゲットパス として _parent などは存在しません。

 しかし,親のSWFのムービークリップ(スプライト)にロードされたとき,そのムービークリップの親階層が _parent になります。
 サンプルの場合,親のSWFの「load_mc?」の親は _root です。

 親SWFの_root
    └ load_mc?
       ↑外部SWFはこれ自体の扱いになる

 したがって,

  // 1つ前に作成したムービークリップ(スプライト) load_mc? を削除
  this._parent["load_mc"+(this._parent.n-1)].removeMovieClip();

 これは,親のSWFにある1つ前に作成された 「load_mc?」 を削除するという意味のスクリプトになります。

 つまり,現象で見ると,トランプが完全にめくれた状態で前のトランプを削除しているということになります。
 順次上に上にトランプが重なっていくように見せかけているだけで,実際は前のカードは削除しているため,どんどんSWFがロードされ続けて,メモリを食いつくしてしまうようなことにはならないようにしています。

 かなり複雑になってしまいましたが,このページの主題は以上です。

 最近は普通の Flash でも,本体の親SWFに子SWFをそのときどきによって表示させるというようなパターンのものが多く見られます。
 任意のサイトのページ上に表示されている SWF を HD に保存しても,親SWFだけしか保存してなくて,子SWFがないので Flash がぜんぜん機能しないというようなことがよくあります。

 例えば,上のサンプルの親SWFである 「kiso251.swf」は,7.04 KB (7,218 バイト) です。
 したがって,初期状態の Flash 表示は,約7KB の SWF をネットからロードするだけで済みます。
 また,「card0.swf」〜「card4.swf」はだいたい1ファイル平均 2KB くらいです。
 したがって,ボタンクリックで新たにロードするファイルは 2KB くらいですから,ボタンを数回クリックした状態で随時だいたい 7+2+2=11(KB) のものを表示させているだけで済みます。

 つまり,loadMovie(もしくは MovieClipLoaderクラスのメソッド) を使うと,ひと時にロードするファイル量が少なくすることができるので,ロードにかかる時間を短くすることができます。
 また,ひと時に表示されているデータ容量も少なくできますから,エンドユーザ(閲覧者側)のメモリ消費も少なくすることができます。

 また,次のページにはこうかかれています。
 「[228626]オーサリングにおける Flash の限界について」
 http://support.adobe.co.jp/faq/faq/qadoc.sv?228626+002
 > Flash ムービーは最高 16000 フレームをもつことができます。
 > その限界を超えると、再生ができなくなるでしょう。
 > しかし長いムービーでも、滅多にその限界を超えることはないと思います。
 > 万が一、16000 フレーム以上必要になるのであれば、
 > 16000 フレーム以下にムービーを分割して
 > それらを Load Movie(※↓) でリンクして対処します

 (ヘルプによると,Suzuka製の Flash も 16000 フレーム が限界のようです。)

 そういう,一石二鳥・三鳥的な利点があるため,最近の Flash は親SWFに子SWFをロードするパターンが増えています。

 このサンプルでは,外部の子SWFの総容量は 11KB くらいなので,1ファイルにして全てをロードしても大した量ではありませんが,もっとファイル容量が増える場合には,かなりな効力を発揮できる可能性があります。

 

 

 ※ Load Movie について
   Load Movie とは古臭いスクリプト(Flash4以前のアクション)
   の書き方です(Flash Lite ではありませんよ,Flash4の書き方です)。
   普通は,通じません。
   これは変だなと前々から思っていましたので,
   英文ページで調べてみました。
   するとこちらの方は普通の書き方になっていました。
   「How big can a Flash movie be?
   →Timeline (以下 ささきちの勝手な日本語訳)
   > 16,000 frames の限界を持ちます …略…
   > … それを超えるような場合,
   > ActionScript 2 でいう loadMovie() コマンドのようなメソッドを使って,
   > ムービーをリンクさせて対処します。

 

 

 

サンプルダウンロード
PDRファイル・CSFファイル・SWFファイル 在中(少々重いです)
「kiso251.zip」 52.9 KB (54,233 バイト)