• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:onRelease文での動作について・・・。)

onclick event behavior on a button in onEnterFrame

このQ&Aのポイント
  • Learn about the behavior of onclick event on a button in onEnterFrame
  • Find out how to continue counting even after the cursor leaves the button
  • Discover an alternative approach using onEnterFrame instead of a for loop

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

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

まず原因ですが。 this.onRollOver = function() { }; 内の this.onEnterFrame も, onRelease=function() { }; 内の onEnterFrame=function(){ } も, this.onRollOut = function() { }; 内の this.onEnterFrame = function() { } も, 全部そのムービークリップに対する, onEnterFrameイベントハンドラメソッドの定義です。 つまり同じ関数を何度も定義し直していることと同じになるため, 前に定義しておいた onEnterFrameイベントハンドラメソッド が, 新しく定義される onEnterFrameイベントハンドラメソッド によって消されてしまうので, ご質問で書かれていらっしゃるようなことになります。 次に解決できるかもしれないスクリプト例です。 しかしいまひとつさせたい動きがわかりません。 次のような感じでいかがでしょうか? ムービークリップ内 フレーム1 ↓ ---------------------------------- stop(); var flg1:Boolean = false; var flg2:Boolean = false; var num:Number; this.onEnterFrame = function() { if (!flg1) { if (this._currentframe>1) { this.prevFrame(); } } if (flg2) { trace("LOOP num ="+num); num++; if (num>30) { flg2 = false; } } }; this.onRollOver = function() { flg1 = true; this.play(); }; this.onRelease = function() { flg2 = true; num = 0; }; ---------------------------------- ムービークリップ内 最終フレーム ↓ ---------------------------------- this.stop(); this.onRollOut = function() { flg1 = false; }; ---------------------------------- this.onEnterFrame = function() { } は1つです。 フラグを2つ作っておいて, そのフラグによって this.onEnterFrame = function() { } 内の動向を変えています。 flg1 が 再生⇔逆再生 を切り替えるフラグで, flg2 が カウントアップ⇔カウント停止 を切り替えるフラグです。

I-NY
質問者

お礼

ご回答ありがとうございます。 まず原因についてですが、onEnterFrame~は便利なのでついつい使ってしまいます。 その時は1つのmcに対して1つだけ使うようにすれば良いのでしょうか? ロールオーバー時の動きの部分は見習う部分がありました。 ただこのスクリプトだと、ロールアウトするとカウントが止まってしまいます。 しかしその部分は別の関数を作ってonReleaseの中から呼び出す事で一応解決しました。 それはそれで新しい疑問が出てきましたが、頭の整理をしてからまた質問させて頂きます。 ありがとうございました。

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

関連するQ&A

  • FLASHでHPのメニュー画面

    FLASHを使って、ホームページのメニューを作りたいと思っています。 そこで、SONYのホームページのようにボタンを押すと、メニュー画面がスクロールして表示され、もう一度ボタンを押したらフレームが逆再生されてメニュー画面が消えるようにしたいと思い下記のように作成しました。 (suzuki-_-さんの方法を参考にして作らせていただきました。QNo.2540039) MC1に this.onEnterFrame=function(){ if(aaa%2==0){ this.prevFrame(); }if(aaa%2==1){ this.nextFrame(); } } ボタン1に on(press){ aaa=aaa+1; } としていました。 これでうまく動いていたのですが、ここでボタン2を作り、もう一つ同様のアクションをするものを作ったのですが、この場合MC1が表示されている場合、MC1を引っ込めてから、MC2を実行しようとして、以下のようにしたのですがうまく動作しません。どのようにしたらいいかアドバイスをお願いします。 MC1 this.onEnterFrame=function(){ if(aaa%2==0){ this.prevFrame(); }if(aaa%2==1){ this.nextFrame(); } } ボタン1 on(press){ aaa=aaa+1; if(bbb%2==1){ bbb=bbb+1; } } MC2 this.onEnterFrame=function(){ if(bbb%2==0){ this.prevFrame(); }if(bbb%2==1){ this.nextFrame(); } } ボタン2 on(press){ bbb=bbb+1; if(aaa%2==1){ aaa=aaa+1; } } これをメインのフレームに配置したのですがうまく動作しませんでした。 一応調べてみると、変数は定義したMCの中だけでしか有効ではないらしいということがわかりました。どうすれば、目的の動作が動くか教えていただきたいです。よろしくお願いします。

  • 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
  • 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
  • アニメーションするロールオーバーにリンクを張りたい

    http://www.geocities.jp/peperon44/peach.html←の様にアニメーションしてリンク先が出てくるロールオーバーを作っています。 http://www.geocities.jp/peperon44/peach.fla←に作っているファイルを置きましたが 一番上の階層にシンボル化したボタンを置き、その下の階層ですべてのフレームアニメーションをさせていますが、1フレーム目に this.stop(); //マウスカーソルがロールインした this.onRollOver = function() { //ロールオーバー開始 rollover = true; }; //マウスカーソルがロールアウトした this.onRollOut = function() { //ロールオーバー終了 rollover = false; }; //フレームが進む度に実行 this.onEnterFrame = function() { if (rollover) { //次のフレームへ進む(最終フレームでは無視される) this.nextFrame(); } else { //手前のフレームに戻る(先頭フレームでは無視される) this.prevFrame(); } }; を入れ大ボタンから出てくる紹介、名前、名簿をそれぞれフレームアニメーションにさせ、シンボル化させて各オブジェクトに on (release) { getURL("name.html", "_foot"); } を入れていますが、指定のURLにリンクがかかりませんのでボタンに反応してくれません。記述が間違っているのか、スクリプトを書く場所を間違えているのだと思います。 このつくりだと一番上の階層に on (release) { getURL("name.html", "_foot"); } と入れると指定のURLにリンクされますが、それでは3つリンク先を分けられないので大ボタンから3つの文字がアニメーションして出てくる意味がありません。大ボタンから出てくる小ボタンにリンクを張るようにしたいです。 FLASHに関してはまだまだの未熟者ゆえ解らないです。何方かお助け下さい。 環境はWindowsXP ソフトはFLASH8です。

    • ベストアンサー
    • 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を削除しています) そのカウントした値でボタンを押し続けたかを判定しています。 ここで、この方法よりも動作に負荷がかからないようにするためには このスクリプトをどのように書き換えればよいでしょうか。

  • 経過時間について

    こんにちは 経過時間を0から表示して、ボタンが押されたら経過時間の計測・表示をストップし次のフレームに行き、また0から経過時間を表示したいのですが、どうすればいいでしょうか? 時間を表示させるdisptime.textとbtnというボタンをステージに配置しています。↓いろいろ試してみたのですが、フレーム移動した際に経過時間を0から表示させる方法がわかりません。。 flash8を使っています。 stop(); startflag=true; this.onEnterFrame=function(){ if(startflag==true){ starttime=getTimer(); keika=getTimer();-starttime; disptime.text=Math.floor(keika/1000); } }; btn.onRelease = function(){ startflag=false; nextFrame(); };

    • ベストアンサー
    • Flash
  • 条件式の中に入れるとムービークリップが動作しない。

    条件式の中に入れるとムービークリップが動作しない。 またまた、悩みにはまってしまいました。 初期状態で、ボタンのムービークリップを全て、ラベルreadyの静止画像に設定し、 クリックされたときに、そのボタンのラベルhitに移動して、 そこに設定されたムービークリップの動作をさせようとしています。 以下のようなアクションスプリクトを書きましたが、 hitに移動するものの、hitに設定したムービークリップの、 1フレーム目の静止画像しか表示されません。 試しに6行目の_root[buttonName].gotoAndStop("ready"); のreadyをhitに変えると、hitラベルのムービークリップが動作します。 原因は何なのでしょうか??? ////////////////////////////////////////////////////////// var onMapButton_num = 0; onEnterFrame = function () { var buttonName = "onMapButton" + onMapButton_num + "_mc"; for ( var i:Number = 1; i < 6; i++) { // 初期設定 buttonName = "onMapButton" + i + "_mc"; _root[buttonName].gotoAndStop("ready"); //ボタンをすべて ready に } for ( var i:Number = 1; i < 6; i++) { // アクション if ( onMapButton_num== i ) { // ボタンが押された場合 buttonName = "onMapButton" + i + "_mc"; _root[buttonName].gotoAndStop("hit");     // ヒットしたボタンを hit に } } }; // ボタン(1~5)のアクションと 番号の取得 ////////////////////////////////// onMapButton1_mc.onRelease = function() { onMapButton_num = 1; }; onMapButton2_mc.onRelease = function() { onMapButton_num = 2; }; onMapButton3_mc.onRelease = function() { onMapButton_num = 3; }; onMapButton4_mc.onRelease = function() { onMapButton_num = 4; }; onMapButton5_mc.onRelease = function() { onMapButton_num = 5; }; stop();

  • 外部変数で条件分岐

    ムービークリップ内にダイナミックテキストを配置、インスタンス名をkijibox01、参照する変数名をkiji01としています。 ダイナミックテキストはトゥイーンさせているので、後々は記事トピックをボタン切り替えでひとつひとつ表示させ、さらにリンクがある記事にはボタン処理を施してジャンプさせるような仕組みを考えています。 ムービークリップ上のスクリプトは、 onClipEvent (load) { //log.txtから記事トピックを取得、url.txtからジャンプ先のURLを取得 this.LoadVariables("log.txt"); this.LoadVariables("url.txt"); //mcを押した際、url.txt内のURLにジャンプ this.onRelease = function() { this.getURL(url01); }; //ロールオーバー・アウト時のテキストカラーの変更 this.onRollOver = function() { this.kijibox01.textColor = 0x6633cc; }; this.onRollOut = function() { this.kijibox01.textColor = 0x000000; }; } で問題なく動くのですが、記事トピックにリンクが必要無い場合はボタン処理などを入れたくないので、リンクが無い時はurl01の変数をnoURLとし、条件分岐でurl01がnoURLでは無い場合のみボタン処理を与えるようにしたいのですがうまくいかずに困っています。 onClipEvent (load) { this.LoadVariables("log.txt"); this.LoadVariables("url.txt"); if (url01 != noURL) { this.onRelease = function() { this.getURL(url01); }; this.onRollOver = function() { this.kijibox01.textColor = 0x6633cc; }; this.onRollOut = function() { this.kijibox01.textColor = 0x000000; }; } } と記述したのですがうまくいきませんでした。 正常に動くスクリプトをifで区切っただけに思えるのですが何か間違っているのでしょうか? わかりにくい説明で恐縮ですがアドバイスをお願いします。

    • ベストアンサー
    • Flash
  • 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
  • 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