- ベストアンサー
アタッチムービーの繰り返し方
FLASHを始めて半年ほどのFLASH初心者です。 シーン1にアタッチムービーでムービークリップ(以下:mc_A)を呼び出し、そのムービークリップの中に新たにムービックリップを作り(以下;mc_B)、それが動くようスクリプト(下→上の縦移動)を書きました。 再生すると、mc_Aが呼び出される→mc_Bがスクリプト通りの動きをする→動き終了(見切れる) となります。 現在、この動作が何度も繰り返されるようにしたいのですが上手くいきません。 mc_Aを呼び出す度にmc_Bにランダム要素を付加するようにしたため、ただmc_Bの動きが繰り返されるのではなく、毎回mc_Aを呼び出す事から繰り返したいのです。 色々やってみたのですが、mc_Bの動きが終了する前にmc_Aの呼び出しが開始され、mc_Bの最初の動きが一瞬だけ見えるのことの繰り返しという状況になる事が多いです。 最終的にはこのmc_Aの呼び出し方にもランダムなタイミングで繰り返しができればと考えています。 スクリプトを実際にここに書きこむのが一番かとも思ったのですが、色々手を加えているうちに複雑になり、質問意図とは無関係の箇所が非常に多いスクリプトになっています。これを簡略化してから質問をとも考えましたが、質問するにあたってどこまで情報を提示すれば良いかも自信がなかったためとりあえずこのような形式をとらせていただきました。 お手数ですが、可能であれば参考スクリプトなどを書いていただけると、有り難いです。 また、補足が必要であれば追加します。 初心者故いたらぬ部分も多いかと思いますが、何卒よろしくお願いいたします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
w-wordさん、 現在モーショントュイーンは使っておらず、スクリプトで動かしているのですが、応用でできますでしょうか。 → もちろん、可能です。 ■mc_Aのシンボル編集画面内のスクリプトレイヤーに、以下を記載すれば、モーションツインと同様の効果が得られます。(先ずは、シンプルな例を作成し、それを、確認して、ランダム化云々に関しては、更に、ご自分で、研究してみて下さい) →いきなり、複雑なことをしないで、先ずは、問題を単純化し、解決したなら、それをベースに、膨らませていく手順が大切だと思います。 ■script例 var speed:Number = 2; var n:Number=0;//EnterFrameのフレームを刻む数をカウントするカウンタで、初期値は0とする this.onEnterFrame = function():Void {//このthisは、mc_Aのこと this.mc_B._y -= speed;//mc_Aの中のmc_Bを、上に移動させる if (this.mc_B._y<18) {//limiterの18は、適当 this.removeMovieClip();//mc_A全体を削除 } n++; trace(n);//フレーム数カウントの検証用 /*nが、32でremoveMovieClip();が発生するとすれば、32frames/12 fps=2.7秒程度の意味なので、 これより若干、大きい目の秒数で、setInterval()を設定する*/ };
その他の回答 (3)
- H240S18B73
- ベストアンサー率65% (190/288)
一応問題解決したみたいですが とりあえず見せてもらったソースからみて 最初に言ったような同じインスタンスを 置き直すようなことにはなってないです が、まず配列にインスタンスを入れて その配列をリセットしたところで 中身のインスタンスは消えません b1,b2,b3という連番のインスタンスを 上書きすることでremoveMovieClip() したみたいになってますが リセットするたびにb1,b2,b3...の数が 変わるので上書きしきれなかった bのインスタンスがでてきたりして aを-1し続けてまたリセット処理 してしまうような感じになってます c=5とか、数がランダムでないなら これでも動作するかも知れないですが リセット処理の度に確実に bに入ってる全てのインスタンスを removeMovieClip()する処理を 加えるようにしないと bのインスタンスの残骸が残ってしまいます あと、これは書き直しの時に 間違っただけだと思いますが bのインスタンスをattachMovieする場所は この場合_rootじゃなくthisですね this.onEnterFrame = function(){ if(a == 0){ b = new Array(); for(var i=1; i<=c; i++){ ↓ var b = new Array(); this.onEnterFrame = function() { if (a <= 0) { for(var j=0;j<b.length;j++){ b[j].removeMovieClip() } for (var i = 1; i<=c; i++) {
お礼
ご回答有難うございました。 今回の質問でお二方から回答を頂きましたが、どちらも試し、正常な動作を確認できました。 removeMovieClip()に関しましては、問題解決を試みる際、自分で色々と調べているうちに辿り着いてはいたのですが、いかんせんやり方が理解しきれず上手く出来ていませんでした。 これを期によく勉強したいと思います。 重ね重ねお礼を申しあげます。
- joy_28
- ベストアンサー率84% (45/53)
w-wordさん、 再生すると、mc_Aが呼び出される→mc_Bがスクリプト通りの動きをする→動き終了(見切れる) となります。 > mc_Aに、入れ子になったmc_Bがモーションツインで、下から上に移動してると仮定し、且つ、フレームレートが、12FPSで、モーションツイン終了までのフレーム数が、30フレーム(即ち、約2.5秒)と仮定した場合のケースです。 以下で、いかがでしょうか? 1)以下、シンボル編集画面内で、mc_Aのモーションツイン終了フレームの次のフレーム(31フレーム目)に、this.removeMovieClip();と記載し、自らを消すようにしておく。これをしないと、MovieClipが蓄積され、再生速度が、遅くなる 2)シーンのscriptレイヤーに、以下を記載する function Loop() { clearInterval(myID);//一度、クリアし、 /*ライブラリー内にある、識別子mc_Aを、attachMovieし、インスタンス名を、mcとし、loopMCとして、参照する*/ var loopMC:MovieClip = _root.attachMovie("mc_A", "mc", 0); loopMC._x = Stage.width/2;//X軸方向の位置決め loopMC._y = 50;//Y軸方向の位置決め /*再度、setInterval()を再設定 mc_Aのタイムラインが、12FPSで、30フレームとすれば、2.5秒(タイムラインの秒数は、精度は、荒い)で終了するので、それよりも、余裕を持った、大きい秒数で、setInterval()を設置する*/ myID = setInterval(Loop, 3000);//仮に、3秒とした } Loop();//ロード時に、カスタム関数Loop()を始動させる
お礼
早速のご回答有難うございます。 スクリプトまで書いていただき、お手数おかけして申し訳ありません。 一応、記載してくださった通りに試してみたところ、再生してみた限りは思っていた通りの動きになりました。 最初からすべきだったと、反省しましたが一応大まかなものを下の方のお礼に記載させていただきました。 現在モーショントュイーンは使っておらず、スクリプトで動かしているのですが、応用でできますでしょうか。 正直、clearInterval等に関しては初めて見たもので、勉強不足を痛感しております。 丁寧にご回答くださりありがとうございました。
- H240S18B73
- ベストアンサー率65% (190/288)
attachMovieって言ってるってことはAS1か2ですか? おおまかな作りはどうなっているんでしょう? なにでmc_Bの動作終了を判断しているんでしょう? mc_Bが動作の終了位置まで来たときなにをしてますか? 新しいmc_Aはどういう参照で作成されるんでしょう? 古いmc_Aはどうなっているんでしょう? いろいろとわからないので憶測での回答になりますが 多分mc_Bの動作終了後、同じmc_Aやmc_Bのインスタンスを 置き直すだけの作りになってしまっていて 動作終了判断に使っているプロパティがリセットされて いないとかじゃないかと思います MCインスタンスのmc_AをattachMovieしなおしたところで 同じインスタンスでありプロパティはリセットされません それでmc_Bの動作終了判断になっているプロパティが 引き継がれてしまってそのようになっているのだと思います mc_Aのクラスから新しいインスタンスを作成し直す作りにするか あるいは全てのプロパティをmc_Bの動作終了とともに 動作終了判断用のプロパティも含めて 完全にリセットする作りにするかですが AS3なら前者でやるところですがAS1か2なら 後者の方が良いかと思います。
お礼
早速のご回答有難うございます。 もとより情報不足であることは自覚しておりましたが、不足しているにもほどがあったようです。 大変失礼いたしました。 一応、大まかな部分を簡略化して抜き出してみました。 なんとか自分なりに解決しようといじっているうちに自分でもよくわからないような状態になっておりましたが、あえてそのまま載せます。 var a = 0; this.onEnterFrame = function(){ if(a == 0){ b = new Array(); for(var i=1; i<=c; i++){ var c = Math.floor(Math.random()*5); var bX = Math.floor(Math.random()*550); var bY = Math.floor(Math.random()*300)+400; b[i] = _root.attachMovie("b","b" + i, i); b[i]._x = bX; b[i]._y = bY; a = c;} } } //MC "b"内のスクリプト this.onEnterFrame = function(){ this._y -=2; if(this._y <0){ _parent.a -= 1; } } "c"の中のスクリプトでなんとか動作終了の判断を試みていて、試したうちの一つですが、このスクリプトでは正常に動作しません。 > 多分mc_Bの動作終了後、同じmc_Aやmc_Bのインスタンスを 置き直すだけの作りになってしまっていて 動作終了判断に使っているプロパティがリセットされて いないとかじゃないかと思います おそらく、そのせいなのでしょうか。 もう少し、勉強してみたいと思います。 最後に、このようなわかりづらい質問に回答をくださりありがとうございました。
お礼
ご回答ありがとうございます。 記載頂いたスクリプトを使用してみたところ、およそ想定通りの動きを再現することができました。 >いきなり、複雑なことをしないで、先ずは、問題を単純化し、解決したなら、それをベースに、膨らませていく手順が大切だと思います。 アドバイス有難うございます。 一応はこれもシンボルがただ一回縦移動するだけの単純なものから始まり、それに色々と手を加えている途中での事でした。これにまた研究を重ねて色々と試してみたいと思います。 重ね重ねお礼を申し上げます。