FLASH CS3、actionscript2.0初心者の問題:gotoAndStopが解除されず、ループしてしまう

このQ&Aのポイント
  • FLASH CS3、actionscript2.0を使う初心者が、_rootにMCとボタンを置き、タイムライン上に3つのラベルがあり、ボタンを押すと別のラベルに飛ぶ構造になっています。しかし、一部のボタンを押すとループしてしまい、指定のラベルに飛ばない問題が発生しています。
  • 問題の原因はlabel2に書かれた「1秒後にlabel3へ行く」という命令が削除されずに生きているためです。このため、label3に飛び、すぐにまたlabel3に戻ってしまう現象が起きています。
  • 解決策として、label2の命令部分を修正し、「1秒後にlabel3へ行く」という命令を削除する必要があります。具体的には、delete (this.onEnterFrame);の部分をthis.onEnterFrame = null;と変更することで問題を解決できます。
回答を見る
  • ベストアンサー

【actionscript2.0】gotoAndStopが解除されず、ループしてしまいます。

FLASH CS3、actionscript2.0を使う初心者です。 状況説明をしますと、_rootにMCとボタンを置き、タイムライン上にはラベルが3箇所(1フレーム目にlabel1、2フレーム目にlabel2、3フレーム目にlabel3)あります。 label1に置いてあるボタンを押すと、label2に飛び、label2に置いてあるボタンを押すとlabel3に飛び、label3に置いてあるボタンを押すとlabel1に飛ぶという構造になっています。 label1のボタンにはlabel2へ行くという命令が書いてあります。 label1のMCは単純なアニメーションが再生されます。 label2のボタンには on (press) { _root.image2_mc.bg2_mc.setActive(1); } と記述し、 label2のMC(image2_mc)の中にあるMC(bg2_mc)には onClipEvent (load) { var speed = 10; function setActive (bOn) { bActive = bOn; } } onClipEvent (enterFrame) { _x += speed; if (bActive) { speed *= 0.5; } if (speed < 1) this.stop(); timerID = setInterval(function () { _root.gotoAndStop('label3'); clearInterval(timerID); }, 1000); delete (this.onEnterFrame); } } と記述しました。 label3のボタンには以下のようにlabel1に行くという命令が書いてあります。 on(press){ gotoAndplay('label1') } label3のMCは単純なアニメーションが流れます。 label3のボタンを押すと、一瞬だけlabel1が読み込まれるのですが、 すぐまたlabel3に戻ってしまいます。 label2に書いた「1秒後にlabel3へ行く」という命令がdeleteされず、生きているためにそのような現象になるのかと思い、 delete (this.onEnterFrame); のかわりに this.onEnterFrame = null; を記述しましたが、駄目でした。 原因がわかるかた、説明不足で意味不明な場合は補足いたしますので、教えていただけませんでしょうか。 どうぞ宜しくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • suo2k
  • ベストアンサー率44% (183/408)
回答No.3

それも違いますか、残念…。 当方FLASHを試せる環境が今無いため、いきあたりばったりですみません。 adobeのサイトでは、定義済みのオブジェクトやプロパティは、DELETEステートメントで削除できませんとあります。 http://help.adobe.com/ja_JP/AS2LCR/Flash_10.0/help.html?content=00000705.html もしかしたら onClipEvent (enterFrame) { } で記述すると消せないのかもしれません。(定義済みの何か?) スクリプトでイベントハンドラを生成してみるとどうでしょうか。 label2のところのrootの部分に _root.image2_mc.bg2_mc.onenterframe = function() { } こんな感じで書くとDELETEで消せるかも。 ただ、この中でthisって書くとどれを指すのかいまいち分からないので、実際に試しながら、 delete this.onenterframe か delete _root.image2_mc.bg2_mc.onenterframe とか試してみてください。 あと、DELETEステートメントは、消せなかったらFALSEを返すようなので、 X[変数] = delete this.onenterframe ってしておいて、どっかで変数の値を表示すれば、DELETEが効いたのか分かるっぽいですよ。

nymph08
質問者

お礼

何度もご回答いただき、ありがとうございます! まだ全部検証してないのですが、遅くなってしまいそうでしたので、先にお礼を投稿させていただきます。 > DELETEステートメントで削除できませんとあります。 > X[変数] = delete this.onenterframe ってしておいて、どっかで変数の値を表示すれば、 なるほど~! いろいろと教えていただき、ありがとうございます。 EnterFrameをやめてフレームに書き直してみます。 勉強になります。。。 検証してみて、あとでまたご報告させていただきます!

その他の回答 (2)

  • suo2k
  • ベストアンサー率44% (183/408)
回答No.2

あれ、原因そこじゃなかったみたいですね失礼しました。 じゃぁやはりenterFrameかな…。 delete (this.onEnterFrame); を delete this.onEnterFrame; と、括弧をとってみるとどうでしょうか。 あと、label2のonClipEvent (enterFrame)の部分ですが、 { と } の括弧の数が合わない気がするのでご確認ください。

nymph08
質問者

お礼

またご回答いただけて恐縮です! 括弧の数が合っていませんでした!初歩的なミスでお恥ずかしいです。。。 そして、 delete this.onEnterFrame; としてみました。 ですが、ループが直りませんでした。。。 そこでいま、 timerID = setInterval(function () { _root.gotoAndStop('label3'); clearInterval(timerID); }, 1000); delete (this.onEnterFrame); をやめて、 _root.gotoAndStop('label3'); だけにしたら、ループが直りました! setIntervalを使わなければ正常に動くようなので、 やはりdeleteが機能していない(?)のかなと思いました。 どうしてsetIntervalを使うとループになってしまうのかがわかりません。。。 教えていただいた部分に注意して、 setInterval以外の方法で(今の私にはわかりませんので、調べてみます)やってみようと思います。 いろいろとアドバイスいただき、ありがとうございました!!

  • suo2k
  • ベストアンサー率44% (183/408)
回答No.1

label1 の部分には、再生を停止する命令は書かれていますか? gotoAndplay('label1') とありますが、label1にstop書いてなければそのまま再生されちゃいますよね。 gotoAndstop('label1')にしたら止まるのではないでしょうか。

nymph08
質問者

お礼

ご回答ありがとうございました! なるほど、と思いgotoAndStop('label1')にしてみましたが、症状が変わりませんでした。 補足ですが、_rootには3つレイヤーを置き、一番上にaction、次にlabel、一番下がmcとなっています。actionのレイヤーには1、2、3フレーム目にstop();と書きました。 すみません、引き続きよろしくお願いいたします。

関連するQ&A

  • 3つのムービークリップ再生・巻き戻しの順番制御

    初めまして。 初心者につき、基本的な事だとは思うのですが、調べても分からなかったため、こちらで質問させて頂きたいと思います。 3つのムービークリップ(a_mc,b_mc,c_mc)【フレーム数30】と、 各々を再生させるためのボタン(A,B,C)を使って、 b_mcを再生中にAのボタンを押すと、b_mcを巻き戻した後で、 a_mcを再生するといった感じで3すくみのような状態にしたいのですが、b_mcの巻き戻しとa_mcの再生が同時に行われてしまいます。 現在のActionScriptは以下のようなものなのですが、どなたかご教授願えませんでしょうか? よろしくお願いいたします。 ボタンAのスクリプト on (release) { //Cの巻き戻し _root.c_mc.onEnterFrame = function() { if (this._currentframe>=2) { this.prevFrame();} else {delete this.onEnterFrame} } //Bの巻き戻し _root.b_mc.onEnterFrame = function() { if (this._currentframe>=2) { this.prevFrame();} else {delete this.onEnterFrame} } //BでもCでもないときの判別式? //Aの再生 _root.a_mc.onEnterFrame = function() { if (this._currentframe<=29){ this.gotoAndPlay(this._currentframe); delete this.onEnterFrame} } }

    • ベストアンサー
    • Flash
  • [Flash]actionscript2.0を用いて歯車を作りたいのですが

    Adobe FLASH CS2を使い2つのかみ合った歯車を制作しています。 ドラッグで片方の歯車を回転させると もう片方の方は逆回転になるはずですが、 うまいことactionscriptをかくことができません。 片方はこのようなactionscriptを使っているのですが うまい作り方はないでしょうか。 よろしくおねがいします。 on (press) { //このMCの基準点からのマウス座標を取得 rx0 = _root._xmouse-this._x; ry0 = _root._ymouse-this._y; //このMCの基準点とマウスとの距離を算出 td0 = Math.sqrt(rx0*rx0+ry0*ry0); //マウスによる回転の差分を算出 tr0 = (Math.PI/2+Math.atan2(ry0, rx0))*180/Math.PI-this._rotation; //onEnterFrame を定義 this.onEnterFrame = function() { //現在のMCの基準点からのマウス座標を取得 rx1 = _root._xmouse-this._x; ry1 = _root._ymouse-this._y; //このMCの回転を計算 this._rotation = (Math.PI/2+Math.atan2(ry1, rx1))*180/Math.PI-tr0; //このMCの移動を計算 }; } on (release, releaseOutside) { //この onEnterFrame を削除 delete this.onEnterFrame; }

  • FlashCS5 ActionScript2.0で3つのボタンを制御し

    FlashCS5 ActionScript2.0で3つのボタンを制御しています。 それぞれインスタンス名はbt1,bt2,bt3です。 動きはマウスオーバーで120%大きくなり、ロールアウトで100%へと戻るものです。 しかし、ロールアウトの動作中に他のボタンに触ると、ロールアウトの動作が中断してしまいます。 なぜでしょうか? //////////////////////////////////////// stop(); sx = 3; var i; //----------- for( i = 1; i < 4; i++){ Nov = "bt" + i; _root[Nov].onRollOver = function(){ Name = this._name; btOverMotion(Name); } _root[Nov].onRollOut = function(){ Name = this._name; btOutMotion(Name); } } //----------- function btOutMotion(eachNo){ No = eachNo; onEnterFrame = function(){ if(_root[No]._xscale < 100){ delete this.onEnterFrame; }else{ _root[No]._xscale -= sx*2; _root[No]._yscale -= sx*2; } } } //----------- function btOverMotion(eachNo){ No = eachNo; onEnterFrame = function(){ if(_root[No]._xscale > 120){ delete this.onEnterFrame; }else{ _root[No]._xscale += sx; _root[No]._yscale += sx; } } }

    • ベストアンサー
    • Flash
  • 慣性の効果がついたマウス追従

    マウス追従の効果で教えてください。 http://www.flashiroha.com/script/as8.htmlの慣性効果付加型のスクリプトは AS2.0で書かれています。 onClipEvent(load) { vx=0; vy=0 } onClipEvent(enterFrame) { vx=vx*0.65+(_root._xmouse-this._x)/a; vy=vy*0.65+(_root._ymouse-this._y)/a; this._x+=vx; this._y+=vy; } これをAS3.0で作成していますが、マウスに追従するどころか大きくステージから離れてしまいます。 どのように記述をしたらいいでしょうか。 my_mc.addEventListener(Event.ENTER_FRAME,onEnterframe); var vx ; var vy ; function onEnterframe(eventObj:Event):void{ vx= my_mc.x*0.65+(stage.mouseX-my_mc.x)/2; vy= my_mc.y*0.65+(stage.mouseY-my_mc.y)/2; my_mc.x+=vx; my_mc.y+=vy; trace(my_mc.x); }

    • ベストアンサー
    • Flash
  • ActionScript2.0のイベントについて

    親ムービークリップに配置した子ムービークリップのイベントが実行されなくて困っています。 親ムービークリップ自体には下記のイベントを設定しています。親ムービークリップはattachMovieで動的に配置しています。 onRollOver・・・onEnterFrameを設定 onRollOut・・・onEnterFrameを削除 子ムービークリップを配置して子ムービークリックにイベントを設定しました。onEnterFrameをは実行されますが、onReleaseが実行されず困っています。 function Parent() { this.onRollOver = function() { this.onEnterFrame = function(){・・・} } this.onRollOut = function(){ delete this.onEnterFrame; } this["child_mc"].onRelease = function() { trace('a') // 実行されない } this["child_mc"].onEnterFrame = function() { trace('b') // 実行される } } ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ _root.attachMovie("Parent", "parent_mc", _root.getNextHighestDepth(), new Parent()); 子ムービークリップはオーサリングで静的にParentに配置し、プロパティでchild_mcと設定しています。 onReleaseは実行できず、そこで止まっています。 なんでも良いので教えてください。

    • ベストアンサー
    • Flash
  • フレーム上からonClipEvent(load){をしていするには

    onClipEvent(load){ this._x = 0; this._y = 0; } というASをフレーム上から書くときはどの様に書けば良いのでしょうか? _root.MC.onEnterFrame = function(){ の様なかたちでやってみたのですがダメだったのですが、上記の様な事がしたい場合どの様にすれば良いのでしょうか。 ご教授ください。よろしくお願いします。

    • ベストアンサー
    • Flash
  • 再生スライダーと連続再生について。

    再生スライダーと連続再生について。 今、複数の外部swfをA.swfの置いたmcによんで 連続再生ができるものを作成しています。(01.swf<-02.swf) 再生スライダーも作ろうと、A.swfにseek_mcとbar_mcを使って設置しました。 つまみのseek_mcをドラッグしたり、動画と一緒に動いたりなどは出来たのですが、 終点までドラッグすると01.swfのはじめに戻ってしまします。 何もしなければ次のファイルをちゃんと再生してくれます。 いろいろ、入力して試してはいるのですが、まったく上手くいきません。 何かいい方法はないでしょうか?? よろしくお願いいたします。 flash8を使っています。 以下は、スライダーの置いてあるフレームに記入したASです。 また、01.swf02.swfに変更はできないので、 A.swfのフレームASを記入してgotoAnd...とenterframe にて連続再生ができるようにしてあります。 var left = this.bar_mc._x+this.seek_mc._width/2; var top = this.bar_mc._y; var right = left+this.bar_mc._width-this.seek_mc._width; var bottom = this.bar_mc._y; this.seek_mc._x = this.bar_mc._x; this.seek_mc._y = this.bar_mc._y; this.seek_mc.onPress = function() { _root.stop(); delete _root.onEnterFrame; this.startDrag(false, _root.left, _root.top, _root.right, _root.bottom); this.onMouseMove = MoveFrame; }; this.seek_mc.onRelease = function() { this.stopDrag();  var p = (this._x-_root.bar_mc._x)/(_root.bar_mc._width-this._width); _root.gamen_mc.gotoAndPlay(Math.floor(_root.gamen_mc._totalframes*p)); _root.onEnterFrame = _root.MoveSeek; delete this.onMouseMove; }; function MoveFrame() { var p = (this._x-_root.bar_mc._x)/(this.bar_mc._width-this._width); _root.gamen_mc.gotoAndStop(Math.floor(_root.gamen_mc._totalframes*p)); } function MoveSeek() { var p = _root.gamen_mc._currentframe/_root.gamen_mc._totalframes; this.seek_mc._x = _root.left+(this.bar_mc._width-this.seek_mc._width)*p; } _root.onEnterFrame = MoveSeek;

    • ベストアンサー
    • Flash
  • AS2.0 ボタンを押し続けた際の処理

    ボタンを押し続けた際に~する、という処理を実現するため 次のようなスクリプトを作成しました。 //ここから //1フレーム目 mc_hoge.onPress = function() { this.onEnterFrame = function(){ cnt++; if(cnt>=max_cnt) delete this.onEnterFrame; } } mc_hoge.onRelease = function() { delete this.onEnterFrame; if(cnt>=max_cnt) trace("~秒押し続けた際の処理"); else trace("普通のクリックをした際の処理"); cnt = 0; } max_cnt=24;//カウントの上限を設定します。適当に24としました。 cnt = 0;//カウント用変数を初期化 //ここまで onEnterFrameでボタンが押されている間、カウントを続けます。 (ボタンを離すか、上限に達したらonEnterFrrameを削除しています) そのカウントした値でボタンを押し続けたかを判定しています。 ここで、この方法よりも動作に負荷がかからないようにするためには このスクリプトをどのように書き換えればよいでしょうか。

  • インスタンス名の変更mcどうしのhittest

    お世話になります。Flash,actionscriptの初心者です。 現在actionscript2.0でちょっとしたFlashコンテンツを作っているのですが、解決できない ことがあり、ぜひお知恵を拝借できればと思います。 詳しくは添付図をご覧いただきたいのですが、 A1_mcとB1_mcのムービークリップをhittestで衝突判定させ、 B1_mcは見えないようにし、 A1_mcはgotoAndPlay(2)で2フレーム目にします(☆の絵)。 同時にthis._name="C1_mc"でインスタンス名を変更しました。 (ここまでは大丈夫で、trace(this._name)でも変更が確認できる。) 同じようにA2、B2、C2も設定しました。 そして、姿(○⇒☆)とインスタンス名(A⇒C)と変わった C1_mcとC2_mcをhittestで衝突判定させてD_mc(■)を見えるようにしたいのですが、 何も起きず、hittestが発動していないのではと思ってしまいます。 説明がわかりにくいと思うのですが、インスタンス名を変更した物どうしのhittestを うまく発動させるにはどうしたらよいか、教えていただきたいのです。 にわか知識のためFlashやactionscriptの根本的な問題を理解できてなさそうです・・・。 ちなみに何がやりたいかというと、○と○、○と☆ではお互いに反応しないが、 ○と◇が合体して☆になったもの同士(☆と☆)が接触すると、反応して■が出現する・・・ そんなFlashを作りたいのです。 自分の現状のやり方以外でこれが実現できるのなら、それでも大歓迎です。 長文になりましたが、ぜひともよろしくお願いいたします。 <参考・・自分の組んだAS> A1_mc.onEnterFrame = function() { if (this.hitTest(_root.B1_mc))     { _root.B1_mc.gotoAndPlay(2); //2フレーム目(空のキーフレーム)にとび、B1を消す this.gotoAndPlay(2);  //○⇒☆(2フレーム目)に姿を変える this._name="C1_mc"; //インスタンス名をA1_mcからC1_mcに変える     trace(this._name); //インスタンス名の変更を確認する。 delete this.onEnterFrame;     } else{ } }; A2_mc.onEnterFrame = function() { if (this.hitTest(_root.B2_mc))     { _root.B2_mc.gotoAndPlay(2); //2フレーム目(空のキーフレーム)にとび、B1を消す this.gotoAndPlay(2);  //○⇒☆(2フレーム目)に姿を変える this._name="C2_mc"; //インスタンス名をA2_mcからC2_mcに変える     trace(this._name); //インスタンス名の変更を確認する。 delete this.onEnterFrame;     } else{ } }; C1_mc.onEnterFrame = function() { if (this.hitTest(_root.C2_mc))     {     this.visible = false ; //姿を消す _root.C1_mc.visible = false; _root.D_mc.gotoAndPlay(2); //D_mcの出現(D_mcの1フレーム目は透明で見えなくしている。2フレーム目からアニメーションさせたいのでvisibleは使わない)     delete this.onEnterFrame; }   else{ } };

    • ベストアンサー
    • Flash
  • MCのgotoAndPlay制御について

    今現在すごく初歩的なものを作っています。 まず、MCですが、1~10フレームは歩く動作、11~20フレームは座る動作 と言ったフレームで動作を表現したものです。 このMC内で1~10フレームを繰り返すようにgotoAndPlay(1)と10フレーム目に書きました。 そして、このMCに onClipEvent (load) { // スピードの初期値 spd = 5; } onClipEvent (enterFrame) { // spd ずつ右へ移動 this._x += spd; if(this._x>100){ spd = 0; this.gotoAndPlay(11); } } といったように A地点~B地点は歩いている動作をさせながら5ずつ移動させ、100まで来たら停止させ、 そのB地点では座る動作(MCの11フレーム目から)をスタートさせるようにしました。 しかし、実際はMCの11フレーム目で固まった状態です onClipEvent (enterFrame)なので当たり前なのは分かっているのですが、 他に方法が分かりません。 何かなるべく完結な方法はありますでしょうか?

    • ベストアンサー
    • Flash

専門家に質問してみよう