dポイントプレゼントキャンペーン実施中!

お世話になります。
あともう少しのところでうまくいきません。

質問はタイトルの通りなんです。本や、サンプルをいろいろ研究して、
キラキラがランダムに発生するスクリプトを書いたんです。

何がしたいかというと、ムービークリップ「mc_stage」の上だけにキラキラをランダムに発生させたいんです。

sw = mc_stage._width;
sh = mc_stage._height;
level = 1;
this.onEnterFrame = function() {
if (Math.random()*10>9) {
level++;
newname = "Fwks"+level;
Fwks.duplicateMovieClip(newname, level);
this[newname]._x = Math.random()*sw;
this[newname]._y = Math.random()*sh;
}
if (level>8) {
this.onEnterFrame = undifined;
}
};


この形だと、mc_stageの幅と高さを取得するだけで、座標を取得していません。なので、ステージの左上からmc_stageのwidthとheightの範囲できらきらが発生してしまいます。

どうしたらきちんとmc_stageの上だけでランダムに発生させれますか?ぜひおしえてください!

A 回答 (1件)

mc_stage がステージ内のどの座標を占めているかを調べ、その範囲内にキラキラを出現させてはいかがでしょう。




あるムービークリップが占める座標は、幅・高さと _x ・ _y をもとに自分で算出することも可能ではありますが、それよりも、MovieClip クラス( Flash MX 以前はオブジェクト)が持っている” getBounds ”というメソッドで簡単に取得できます。

このメソッドで分かるものとは、あるムービークリップが占めている空間の、X座標とY座標のそれぞれ最小値と最大値です。
細かいことを抜きにして簡単に言いますと、選択ツールでムービークリップを選択した時に表示される四角形のマーカーの、四隅の座標が判明するということです。
これらの座標の範囲内で乱数を作成すれば、特定のムービークリップの上にだけキラキラを出現させることができます。


なお、Flash Player 8 からは” getRect ”といって、getBounds と似たような機能のメソッドも利用できるようになりました。
getBounds との違いは、大きさの計測に線の幅を含むかどうかです。
線の幅も含んだ座標を返してくる getBounds に対し、線を含まない座標を返す getRect の戻り値は、線の分だけ値が小さくなります。
今回はさしあたって、古いバージョンの Flash Player でも使える getBounds を使用した作例をご紹介します。

------------------------------------------------------------

ステージに、ムービークリップ” mc_stage ”があるとします。
この上にだけキラキラのムービークリップ” Fwks ”の複製をランダムに配置するスクリプトは、大体、次のようになります。
このスクリプトは、メインのタイムラインのフレームに記述してください。

mc_stage が占める座標を取得する部分を追加した点と、キラキラの出現範囲の求め方を変更したことを除けば、ご提示のスクリプトと同じです。

(↓各行頭に全角のスペースが入っています。コピーする際は、全て半角のスペースかタブに置き換えてください)



/**********************************************************/


 //mc_stageが占める座標空間の情報を取得
 //基準にする座標系はステージ(=_root)
 bounds_obj = new Object();
 bounds_obj = mc_stage.getBounds( _root );

 //キラキラの出現範囲
 x_min = bounds_obj.xMin;
 x_max = bounds_obj.xMax;
 y_min = bounds_obj.yMin;
 y_max = bounds_obj.yMax;


 //指定の範囲内にキラキラを出現させる
 level = 1;
 this.onEnterFrame = function() {
  if (Math.random()*10>9) {
   level++;
   newname = "Fwks"+level;
   Fwks.duplicateMovieClip(newname, level);

   //---------------- この部分を変更 ----------------
   //this[newname]._x = Math.random()*sw;
   //this[newname]._y = Math.random()*sh;

   this[ newname ]._x = Math.floor( Math.random() * ( x_max - x_min + 1 ) ) + x_min;
   this[ newname ]._y = Math.floor( Math.random() * ( y_max - y_min + 1 ) ) + y_min;

   //---------------- 変更ここまで ----------------

  }
  if (level>8) {
   this.onEnterFrame = undifined;
  }
 };


/**********************************************************/



冒頭の bounds_obj = mc_stage.getBounds( _root ); で、mc_stage がステージ上で占めている座標の情報が、変数 bounds_obj に入ります。
getBounds が返してくる値はXおよびY座標の最小・最大と、値が4つあるため、汎用型である Object 型の変数を作って受け取ります。

受け取った4つの値を識別する xMin や yMax などの名前は、getBounds の中で予め決められています。
言うなれば、値を受け取るための入れ物を1つ渡すだけで、getBounds の方で仕切りを作り、値を分けて返してくれるようなものです。
getBounds から受け取った値をそれぞれ見るには、渡した入れ物の名前と仕切りの名前の2つが必要です。
先のスクリプトでは、渡した入れ物の名前は” bounds_obj ”ですから、例えばX座標の最小値を見る時は

 x_min = bounds_obj.xMin;

というように書きます。


mc_stage が占める座標を取得したら、これらをもとにキラキラの出現位置をランダムで決めます。
つまり、基本的には、キラキラのX座標は mc_stage が占めるX座標の最小から最大値まで、Y座標も同様に mc_stage が占めるY座標の最小から最大値の範囲で決めればいい、ということになります。

ただし、これだけですと、mc_stage の範囲ギリギリにキラキラが出現する可能性もあります。
mc_stage の端スレスレの位置に出現した場合は、キラキラの端が欠けたり、はみ出して見えることになります。
上記のスクリプトでは省略していますが、実際には、mc_stage の範囲の他にキラキラの大きさも考慮して出現範囲を決めてください。


ある範囲内の乱数を作る方法は、Flash のテクニカルノートに説明があります。
よろしければご参考になさってください。

 ・ Adobe サポートデータベース:
   Math.random() でランダムな整数を取得する方法
  http://support.adobe.co.jp/faq/faq/qadoc.sv?2286 …
    • good
    • 0
この回答へのお礼

お礼が遅くなり、すみません。

教えていただいた通りやってみたらできました!
getBounds
私の持っている本にはどれにも書いていませんでした。なので今回はとても勉強になりました。

本当にありがとうございました。

お礼日時:2008/10/10 16:53

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!