• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:onEnterFrameで予定の位置で止まってくれない。)

onEnterFrameで位置が止まらない問題について

このQ&Aのポイント
  • フラッシュのサイズが800×600pxで、9つのパネルを並べたイラストを作成し、指定した位置で止まるようにしたいです。
  • 右上の番号を押すと想定の位置で止まらずに微妙にズレてしまいます。
  • OnEnterFrameとdeleteを使用して座標位置を指定して止める方法がわかりません。どなたか教えていただけませんでしょうか。

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

  • ベストアンサー
  • BlurFiltan
  • ベストアンサー率91% (1611/1754)
回答No.1

まず原因です。 原因はわかると思いますが..., 例えば最初 colorpannel の座標は (_x , _y)=(0 , 0) であるとします。 ややこしくなるので _x にのみついて考えると _x = 0 であるとします。 この状態で例えば num2 が押されると _x のみに関しては次のスクリプトが動作します。 num2.onRelease = function() {   _root.onEnterFrame = function() {     if (_root.colorpannel._x>=-800) {       _root.colorpannel._x -= 30;     }     if (_root.colorpannel._x<=-800) {       _root.colorpannel._x += 30;     }   }; }; 最初の座標は _x = 0 なのですから, この中の if (_root.colorpannel._x>=-800) {   _root.colorpannel._x -= 30; } によって colorpannel の _x は -30 ずつ減算されるわけですから 次のようになります。 _x = 0 _x = -30 _x = -60 _x = -90 _x = -120  ~省略~ _x = -660 _x = -690 _x = -720 _x = -750 _x = -780 ←まだ 800 以下 _x = -810 ←なので -30 されて行き過ぎる ここで 20px 左に行きすぎます。 行き過ぎるので,最初に書いたスクリプトの if (_root.colorpannel._x<=-800) {   _root.colorpannel._x += 30; } が動作してしまって, _x = -810 _x = -780 になります。 この状態でこの _root.onEnterFrame は1 実行が終了します。 つまり結局 -800 には行き着かない状態 -780 で終わります。 また, 次のフレーム時間では最初 _x = -780 ですから, if (_root.colorpannel._x>=-800) {   _root.colorpannel._x -= 30; } によって colorpannel の _x は -30 ずつ減算されるわけですから次のようになります。 _x = -780 ←現在 800 以下 _x = -810 ←なので -30 されて行き過ぎる 行き過ぎるので, if (_root.colorpannel._x<=-800) {   _root.colorpannel._x += 30; } が動作してしまって, _x = -810 _x = -780 になってしまします。 →これの繰り返しで 「_x = -780 から動かない」 ということになります。 (実際は -810 と -780 を振動している感じになり,見えるのは -780 の状態だけになります。) /////////////////////////////////////////////////////////// 対処法ですが, 「行き過ぎたら目標座標で固定する」 という方法を使うのが 一番近道で良いと思います。 ------------------------------------ num1.onRelease = function() { _root.onEnterFrame = function() { if (_root.colorpannel._x>0) { _root.colorpannel._x -= 30; } if (_root.colorpannel._x<0) { _root.colorpannel._x += 30; } if (_root.colorpannel._x>0-30 && _root.colorpannel._x<0+30) { _root.colorpannel._x = 0; } if (_root.colorpannel._y>0) { _root.colorpannel._y -= 30; } if (_root.colorpannel._y<0) { _root.colorpannel._y += 30; } if (_root.colorpannel._y>0-30 && _root.colorpannel._y<0+30) { _root.colorpannel._y = 0; } }; }; num2.onRelease = function() { _root.onEnterFrame = function() { if (_root.colorpannel._x>-800) { _root.colorpannel._x -= 30; } if (_root.colorpannel._x<-800) { _root.colorpannel._x += 30; } if (_root.colorpannel._x>-800-30 && _root.colorpannel._x<-800+30) { _root.colorpannel._x = -800; } if (_root.colorpannel._y>0) { _root.colorpannel._y -= 30; } if (_root.colorpannel._y<0) { _root.colorpannel._y += 30; } if (_root.colorpannel._y>0-30 && _root.colorpannel._y<0+30) { _root.colorpannel._y = 0; } }; }; num3.onRelease = function() { _root.onEnterFrame = function() { if (_root.colorpannel._x>-1600) { _root.colorpannel._x -= 30; } if (_root.colorpannel._x<-1600) { _root.colorpannel._x += 30; } if (_root.colorpannel._x>-1600-30 && _root.colorpannel._x<-1600+30) { _root.colorpannel._x = -1600; } if (_root.colorpannel._y>0) { _root.colorpannel._y -= 30; } if (_root.colorpannel._y<0) { _root.colorpannel._y += 30; } if (_root.colorpannel._y>0-30 && _root.colorpannel._y<0+30) { _root.colorpannel._y = 0; } }; }; ------------------------------------ ↑ 30が連発しています。 こういう場合,本当は ------------------------------------ // スピードとなる変数 spd の設定 spd = 30; ------------------------------------ と最初に書いておいて,その続きに, ------------------------------------ num1.onRelease = function() { _root.onEnterFrame = function() { if (_root.colorpannel._x>0) { _root.colorpannel._x -= spd; } if (_root.colorpannel._x<0) { _root.colorpannel._x += spd; } if (_root.colorpannel._x>0-spd && _root.colorpannel._x<0+spd) { ~以下省略~ ------------------------------------ と書く方が, 速度の調節時の 書き替えミス や 書き替え労力 が激減できて良いです。 > deleteで止めれば良いのかな? 目標の _x 座標 と _y座標 に到達する時刻が違いますから, いつ delete するべきかを判定させるスクリプトが入って, さらにもっと複雑になってしまいますよ。 本当は delete した方が良いかもしれませんが, 上の計算くらいでしたらさほど CPU の負担にもならないので, delete する必要も特にないかなと思います。 (上の計算より,画像を動かす為に使う CPU への負担の方が数百~数千倍以上多いと思います。)  

hiro8358
質問者

お礼

有難うございます!!! 教えていただいた方法で完璧にできました。 「行き過ぎたら目標座標で固定する」方法は今後も何かと重宝すると思います。 まだまだ始めたばかりでわからないことだらけで、頭を抱えておりましたが、おかげさまでスッキリしました。 有難うございました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • onEnterFrameの止め方につきまして

    ※間違って違う場所に書き込んでしまったのでこちらに改めて記入します。 b1、b2、b3、b4、b5というインスタンスを作成し、横方向に均等に並べ、それとは別にnextbuttonというボタンを作成し、そこにマウスを乗せるとb1からb5までがx座標値が増える方向に一斉に流れ、nextbuttonからマウスがアウトすると止まるようにしました。 _root.stop(); nextbutton.onRollOver = function(){ _root.onEnterFrame = function(){ _root.b1._x += 10; _root.b2._x += 10; _root.b3._x += 10; _root.b4._x += 10; _root.b5._x += 10; }; }; nextbutton.onRollOut = function(){ _root.onEnterFrame = function(){ stop(); }; }; と記述しました。 しかし、このままではどこまでも右に行ってしまうので、b1のx座標値が徐々に増ていって、x:85に達した時点でonEnterFrameの動作が止まるようにしたいのです。 どなたかわかる方がいらっしゃいましたら、よろしくお願い致します。

    • ベストアンサー
    • Flash
  • Flashでのインスタンスの座標について

    こんばんは。 一つflashのインスタンスの座標について質問なのですが、 試しに actionscriptで  _root.attachMovie("1","2",1); _root[2]._x = 300; という動作をさせたところ、_root[2]のx座標を300に設定していてもステージのx=300(左上を0,0とした座標)の位置と違う位置に表示されてしまいます。 これは何故このような現象がおきてしまうのでしょうか?ステージのx,yとインスタンスのx,yは基点が違うのでしょうか?ご教授頂ければ幸いです。

  • スライドバーのアクションスクリプト

    いつも大変お世話になっております。 伸び縮むサイドバーを作っているのですが、伸ばしたまではいいのですが、元の位置に戻すほうがどうもうまくいきません。 以下、途中まで書いたスクリプトです。 ■.recruit_mcがバーの部分になります。 onClipEvent (load) { _root.recruit_mc._x = 859; _root.recruit_mc._y = 272; } onClipEvent (enterFrame) { rec_to_button.onRelease = function() { _root.recruit_mc.onEnterFrame = function() { if (_root.recruit_mc._x>=620) { _root.recruit_mc._x -= 10; } }; }; } -------------------------------------------------------------- if (_root.recruit_mc._x>=620) { _root.recruit_mc._x -= 10; } の箇所で else を使って、逆の場合をいろいろと書いているのですが どうもうまくいきません。 ボタンを押したら859→620まで移動、またボタンを押したら620→859 まで移動するようにするには、あとどう書き加えればいいですか? ご教授よろしくお願いします。

    • ベストアンサー
    • Flash
  • movie clipのインスタンス名を変数にし文字列+数字を代入し.g

    movie clipのインスタンス名を変数にし文字列+数字を代入し.gotoAndStopを行ったが動作しない。 Flash 初心者です。 「なぞ」にはまり込んでしまいました。よろしくお願いします。 作っているのは、 丸いボタンをクリックすると、下にある白い札の色が変わるインタラクションです。 丸いボタンは2個あり、四角の札も2個あります。 クリックするボタンに対応した札が色が変わり、その札以外は白になります。 初め次のようなアクションスクリプトを書いて、うまく動かすことができました。 var onMapButton_num = 0; onEnterFrame = function () {      if (onMapButton_num == 0) { spotName1_mc.gotoAndStop("white"); spotName2_mc.gotoAndStop("white"); } else if (onMapButton_num == 1) { spotName1_mc.gotoAndStop("orange"); spotName2_mc.gotoAndStop("white"); } else if (onMapButton_num == 2) { spotName1_mc.gotoAndStop("white"); spotName2_mc.gotoAndStop("orange"); } }; onMapButton1_mc.onRelease = function() { onMapButton_num = 1; }; onMapButton2_mc.onRelease = function() { onMapButton_num = 2; }; ボタンを増やしたいので、記述を短するために次のように変えてみました。 (spotNameという変数を作りました) var onMapButton_num = 0; onEnterFrame = function () { var spotName = "spotName" + onMapButton_num + "_mc"; /* spotName */ if (onMapButton_num == 0) { spotName1_mc.gotoAndStop("white"); spotName2_mc.gotoAndStop("white"); } else if (onMapButton_num == 1) { spotName.gotoAndStop("orange"); /* spotName の使用*/ spotName2_mc.gotoAndStop("white"); } else if (onMapButton_num == 2) { spotName.gotoAndStop("white"); /* spotName の使用*/ spotName2_mc.gotoAndStop("orange"); } }; onMapButton1_mc.onRelease = function() { onMapButton_num = 1; }; onMapButton2_mc.onRelease = function() { onMapButton_num = 2; }; 結果、1つめのボタンをクリックしても、札の色が変わらなくなりました。 変数の使い方に問題があるのでしょうか? よろしくお願いします!

    • ベストアンサー
    • Flash
  • loadMovieとonEnterFrameについて

    はじめまして FLASH8を使用しています。 ActionScript初心者です。よろしくお願いします。 単体のswfだと機能するのですが、loadMovie後機能しなくなってしまいます。 読み込ませる側のアクションは ▽ボタンシンボルに on (press) { _root.moveMenu_1 = -138; menu_name.text = "キッズメニュー"; menu_text.text = kidsData; } ▽フレームアクション loadVariables("kidsmenu.txt", this); loadVariables("menmenu.txt", this); loadVariables("ladymenu.txt", this); loadVariables("seniormenu.txt", this); moveMenu_1 = -296; this.onEnterFrame = function() { img_y._x += ((0-moveMenu_1)-img_y._x)*0.1; }; MCのインスタンス名は「img_y」です。 他にボタンが3つほどあります。 swf単体だと機能します。 loadMovie後text・外部テキストは読み込むのですが、スクロールしなくなってしまいます。 これを3_1.swfとしました。 読み込む側のアクションは ▽ボタンシンボルに on (press) { _root.moveMenu = 2100; } 他に4つほどボタンがあります。 ▽フレームアクション scroll_flag = 0; moveMenu = 0; this.onEnterFrame = function() { if (scroll_flag == -1) { if (back_img._x<0) { moveMenu -= 20; } else { moveMenu = 0; } } if (scroll_flag == 1) { if (back_img._width+back_img._x>700) { moveMenu += 20; } else { moveMenu = 2800; } } back_img._x += ((0-moveMenu)-back_img._x)*0.1; }; back_img.c_1.loadTarget.loadMovie("1_1.swf"); back_img.c_2.loadTarget.loadMovie("2.swf"); back_img.c_3.loadTarget.loadMovie("3_1.swf"); back_img.c_4.loadTarget.loadMovie("4.swf"); back_img.c_5.loadTarget.loadMovie("5.swf"); スクロールするMCを「back_img」としました。 他に読み込んだものは機能したんですが 3_1だけうまく機能しません。 長々と失礼しました。

    • ベストアンサー
    • Flash
  • 複数のムービークリップについて

    毎度すみません。 複数のムービークリップ(以下MC)をステージに時間差でバラバラの位置に登場させたいのですが、最初で行き詰まってしまいましたのでご質問させてください。 5個のMC(1~5)をステージに配置し、インスタンス名をmc1~mc5で振っています。 スクリプトレイヤーに以下の様に記述しています。 ------------ for(i=1;i<5;i++){ var mc = this["mc"+i]; mc.num = i; } mc.num._visible = false; mc.num._alpha = 0; //MCを時間差で任意の位置に表示 var t=0; this.onEnterFrame = function(){ t++; if(t==25){ mc1._visible = true; mc1.onEnterFrame = function(){ this._y = 50; } } if(t==50){ mc2._visible = true; mc2.onEnterFrame = function(){ this._y = 100; } } if(t==75){ mc3._visible = true; mc3.onEnterFrame = function(){ this._y = 150; } } //以降、mc4、mc5は省略 } --------- --------- mc.num._visible = false; mc.num._alpha = 0; --------- の部分で、デフォルト時はmc1~5を非表示にしているつもりが、 最初から表示されてしまいます。 初心者なので、近いフラッシュを見よう見真似で作成しています。 根本的に記述法を間違えておりましたら、恐れ入りますがご指摘ください。 またもっと効率的な方法がありましたら、ご教授いただければ幸いです。 Flash8.0、ActionScript2.0で制作しています。

    • ベストアンサー
    • Flash
  • onRelease文での動作について・・・。

    ムービークリップをボタンにして、その階層の最初のフレームに this.onRollOver = function() { this.onEnterFrame = this.nextFrame; }; onRelease=function(){ var num:Number=0 onEnterFrame=function(){ trace("LOOP num ="+num) num ++ if(num>30){ delete onEnterFrame } } } stop() 最後のフレームに this.onRollOut = function() { this.onEnterFrame = function() { if (this._currentframe > 1) { this.prevFrame(); } }; }; とした場合について質問です。 ボタン上にカーソルがある場合は30までカウントされます。 しかし、クリック直後にカーソルがボタン上から離れるとカウントが停止します。 ボタンから離れてもカウントを続けるにはどうすればよいでしょうか?? ちなみに、このスクリプトは簡単に流れが分かるように作ったものなのでfor文などではなくonEnterFrame~での対処法を教えて下さい。 実際にはonEnterFrame以下はもっと長くなっているので・・・。 どうかお願いしますっ!!! m(_ _)m

    • ベストアンサー
    • Flash
  • 吸着後の事

    吸着後についてわからない事があります。 ドラッグ&ドロップでmaru_mcをsikakuというMCに吸着させています。 sikakuというMCに衝突していない時は指定座標に戻るようにしているのですが、二点うまくいかないところがあります。 吸着後、maru_mcをsikakuから離す時、maruがその場を動こうとしない時があり、すんなりドラッグできない。 maru_mcが、衝突していない時でも指定座標にもどらず、sikakuに吸着してしまう時があります。 改善点等たくさんあるとおもいますが、よろしくお願いします。 下記スクリプトです。 maru_mcのスクリプト on (press) { this.startDrag(); this.onEnterFrame = function() { if (this.hitTest(_root.sikaku)) { this._x += (_root.sikaku._x-this._x)/4; this._y += (_root.sikaku._y-this._y)/4; } }; } on (release, releaseOutside) { this.stopDrag(); this.onEnterFrame = function() { if (!this.hitTest(_root.sikaku)) { this._x += (400-this._x)/6; this._y += (300-this._y)/4; } else { this._x += (_root.sikaku._x-this._x)/4; this._y += (_root.sikaku._y-this._y)/4; } }; }

  • ActionScriptでの繰り返し記述をすっきりまとめたい

    FLASHのActionScriptを勉強中です。 繰り返し同じ様なものを記述する場合、for文か何かを使うと思うのですが、以下の場合はどうすればいいのでしょうか? *プログラムの内容は複数のインスタンスを表示してクリックで順次消えるというものです。インスタンスに記述ではなく、フレームに記述しています。(イベントハンドラメソッド) this.b1.onRelease = function(){ _root.b1._visible = false; }; this.b2.onRelease = function(){ _root.b2._visible = false; }; this.b3.onRelease = function(){ _root.b3._visible = false; };      以下繰り返し… お詳しい方、よろしくお願いいたします。

    • ベストアンサー
    • Flash
  • ムービークリップがマウスカーソルを追いかけ、マウスカーソルと同じ位置に来たときにムービークリップを変えたい

    以下のようにスクリプトを書いたのですが ムービークリップがマウスカーソルと同じ位置に来ても ムービークリップがフレーム2に移動しません。 ドラゴンクエストVIIIのトップページのFlashのような 表現をしたいのですがうまくいきません。 http://www.square-enix.co.jp/dragonquest/eight/ _mc.onEnterFrame = function() { this._x += ( _root._xmouse - this._x ) / 5; if( this._x == _root._xmouse ) this._mc.gotoAndStop(2); else this._mc.gotoAndStop(1); }; どうすればこの問題を解決することができるのでしょうか。 ご存知の方がおられましたらご回答をよろしくお願いします。

    • ベストアンサー
    • Flash