- ベストアンサー
FLASHMX2004で繰り返し構文を使ってムービークリップを表示する方法と速度調整について
- FLASHMX2004でfor文を使いある回数ムービークリップを表示させる方法について説明します。
- 実行すると全ての処理が終わってから一度にすべてが表示されてしまう問題が発生します。そのため、一度の処理が終わるごとにムービークリップを表示する方法についても説明します。
- また、繰り返し構文の進行速度を調整する方法についても説明します。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
少し誤解されているようです。 >> 一回の処理が終わればその都度表示するようにしたい ということですが, 書かれているスクリプトだと,希望通り一回の処理が終わればその都度表示されています(いるはずです)。 人間が計算しているわけではなくPCが関数を処理しているのです。書かれてあるスクリプトくらいほんの 0.00…1秒 くらいで終わります。だから全部が一度に表示されているように見えるだけです。 もし少し時間がたって表示されているように見えるとしたら, それはスクリプトのスクリプトの処理に時間がかかっているのではなくて,画像表示の計算処理に時間がかかっているだけです。 スクリプトの処理より画像表示の処理の方が桁違いに多くの計算が必要です。 >> その時にこの繰り返し構文が進むスピード???を調整はできるのでしょうか? 時間調節の方法は,いろいろあります。 とりあえず少なくとも for文 の選択は間違っていると思います。 たとえば,for~ で計算させるのではなくて,数フレームのムービークリップを作ってループさせ, フレーム1に戻るたびに i++; で i を加算し attachMovie() に代入して,フレーム1に戻るたびに1つ1つのMCを作るとか, また onEnterFrame で処理するとかなどの方法があります。 でも今回の場合は, setInterval (定期的間隔で関数、メソッド、またはオブジェクトを呼び出す関数) を使うのが最適だと思います。 書かれているスクリプトを for文 を使わず setInterval を使うように書き直すと以下のようになります。 ------------------------------ this.stop(); i = 0; function rdm(x) { return Math.floor(Math.random()*x); } function callback() { i++; this.attachMovie("ashi", "ashi"+i, i); _root["ashi"+i]._x = rdm(Stage.width); _root["ashi"+i]._y = rdm(Stage.width); scale = rdm(250)+50; _root["ashi"+i]._xscale = scale; _root["ashi"+i]._yscale = scale; _root["ashi"+i]._rotation = rdm(360); _root["ashi"+i]._alpha = rdm(100); if (i>=99) { clearInterval(intervalID); } } intervalID = setInterval(function () { callback(); }, 100); ------------------------------ ~~~スクリプトの説明~~~ ---全角空白があるためそのままコピペは不可---- this.stop(); // i をまず設定 i = 0; //ここは書かれている通りを使用しています function rdm(x) { return Math.floor(Math.random()*x); } // for文で書かれていた部分を修正し // callback という名の関数として定義しています function callback() { //i を加算 i++; //ここは書かれている通りを使用しています this.attachMovie("ashi", "ashi"+i, i); _root["ashi"+i]._x = rdm(Stage.width); _root["ashi"+i]._y = rdm(Stage.width); scale = rdm(250)+50; _root["ashi"+i]._xscale = scale; _root["ashi"+i]._yscale = scale; _root["ashi"+i]._rotation = rdm(360); _root["ashi"+i]._alpha = rdm(100); // もし i が 99 になったら繰り返しを解除 if (i>=99) { clearInterval(intervalID); } } // 関数callback を呼び出す intervalID = setInterval(function () { callback(); // 100ミリ秒(0.1秒)ごとに }, 100); --------------------------------------------- setIntervalの構文は次のようになっています。 setInterval( function () { 関数名(); }, 割り込み秒数(単位ミリ秒) ); 割り込み秒数の部分を変えると「スピード???を調整」ができます。 Interval とは,直訳すると間隔,隔たり,合い間,休止期間ですね。 スクリプトのsetIntervalは,休止期間を置いて繰り返し実行するという意味なので, どこかで止めなければなりません。 そこで,setInterval に intervalID という名前を付けて, clearInterval(intervalID); で停止させています。 intervalID は適当に命名すれば良い名前です。
お礼
ご回答ありがとうございます。 希望どおりの物ができました。助かりました。 setIntervalを使えばこんなこともできるんですね。 大変勉強になりました。 ありがとうございました。