• 締切済み

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

  • Flash
  • 回答数2
  • ありがとう数1

みんなの回答

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

#1です。 結局 setTimeout で行きますか? もし行く場合はつぎのような感じでできると思います。 //------------------------------------------------------ //適当なフラグでも用意して初期値をfalseにでもしておく var flag:Boolean = false; //setTimrout参照用IDの宣言 var ID:Number; mc_hoge.onPress = function():Void { //2秒後にフラグをtrueにする ID = setTimeout(function ():Void { flag=true; }, 2000); }; mc_hoge.onRelease = mc_hoge.onReleaseOutside = function():Void { // setTimeoutを削除 clearTimeout(ID); if (flag) { trace("2秒押し続けた際の処理"); } else { trace("普通のクリックをした際の処理"); } //フラグを元のfalseに戻す flag = false; }; //------------------------------------------------------  

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

ActionScript 2.0 などと大きく書かれても答えにくいですが, ActionScript 2.0 でも Flash Player 8 以上 の SWF パブリッシュ する条件でしたら 私だと setTimeout を使うと思います。 Googl検索「setTimeout Flash 8」 http://www.google.co.jp/search?hl=ja&q=setTimeout+Flash+8 Flash Player 7 以下の場合だと... setInterval を使うと思いますが... Googl検索「setInterval ActionScript」 http://www.google.co.jp/search?hl=ja&q=setInterval+ActionScript しかし,私はあまり setInterval が好きではないので, 好みの問題ですが,ご質問で書かれていらっしゃるスクリプトの方で行く気がします。 (セット や 解除 が頻繁に起こると setInterval では管理が難しいのですよ。) ActionScript 2.0 が使えるのは Flash MX 2004 (Flash Player 7 用SWFが作成可能)以降ですから Flash MX 以下の場合はないものとします。

moyashi_room
質問者

お礼

解答ありがとうございます。 書き忘れていましたが私もsetIntervalはあまり使いたくなかったもので。 やはりonEnterFrameを使うのが適当なようです。 setTimeoutは恥ずかしながらその存在を知りませんでした。 こちらも調べてみます。

関連するQ&A

  • 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
  • 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
  • onEnterFrameの処理速度について

    onEnterFrameの処理速度についてご質問です。 下記のようなonEnterFrameの常時フラグを判定するスクリプトがあるとして、 //------------------ var testFlag:Boolean = false; this.onEnterFrame = function():Void{ if (testFlag == true){ trace("test") } } //------------------ この場合、testFlagがtrueになっていないときも、常に処理を行っていることになるのでしょうか? 例えば、いろいろなムービークリップに対して、このような「こうなったらこうしろ」的なif文を伴ったonEnterFrameを書いているとします。 その時、ひとつのonEnterFrameのif文だけが動くとすると、(他はif文を否定している状態)その処理速度は、ひとつだけが書かれている時とかわらないのでしょうか? 説明がややこしくなりましたが、 ・onEnterFrameがひとつ実行されている場合 ・onEnterFrameが複数個ある中で、if文によりひとつだけが実行されている場合 この2つの処理速度は変わらないものでしょうか? ご回答、お待ちしております。よろしくお願いいたします。

  • AS3 mc0~5をまとめて処理する

    AS3初心者です。 forにてmc0~5をまとめて処理したいのですが、 下記スクリプトで、function内mc0の書き換え方が分かりません。 よろしくお願いします。 ///////////////////////////////////////// import fl.transitions.easing.Regular; import fl.transitions.TweenEvent; var twObj:Tween; for(var i:int=0;i<=5;i++){ this["mc"+i].addEventListener(MouseEvent.ROLL_OVER, hiraku); this["mc"+i].addEventListener(MouseEvent.ROLL_OUT, modoru); } function hiraku(eventObj:MouseEvent):void { //mc0を["mc"+i]としまとめて処理したい twObj=new Tween(mc0,"rotation",Regular.easeInOut,0,30,1,true); } function modoru(eventObj:MouseEvent):void { //mc0を["mc"+i]としまとめて処理したい twObj=new Tween(mc0,"rotation",Regular.easeInOut,30,0,1,true); } //////////////////////////////////////////

    • ベストアンサー
    • Flash
  • AS3.0でボタン処理をまとめて書くには?

    はじめまして。当方、最近プログラム的なものを始めたばかりで困っています。 例えばルートにbtn0,btn1,btn2という3つのムービークリップを置いたとして、 ボタンを押したらそれぞれのムービークリップ名をトレースするには、 AS2.0以前ではルートのフレームアクションで for (var i=0;i<3;i++){  _root.["btn" + i].onRelease = function{   trace(this._name);  } } といった感じでforループでまとめられると思うのですが、 3.0ではどうしたらよいのか見当もつかず困っています。 for (var i=0; i<3; i++) {  ["btn"+i]addEventListener(MouseEvent.CLICK,over); } このようにまとめてリスナーに登録したとしても、 リスナー関数が別になってしまうので、this.nameは使えず…はて。といったところです。 なにとぞご教示よろしくお願い申し上げます。

    • ベストアンサー
    • Flash
  • アクションスクリプト ifがうまく働いてくれません…

    こんにちは。 FLASH8、OSwinXP、初心者 です。 アクションスクリプト「if」に関するご相談です。 ●クリップにマウスオン(rollover)するとダイナミックテキスト(_root.texbox_mc.hhh)の数字がカウントダウンされる、というものを作っています。 ★問題は、以下のスクリプトだとカウントダウンを50で止めたいのにスルーしてどこまでもカウントダウンしてしまい、 onClipEvent (load) { hoge = 1; snt = 100; } on (rollOver) { this.onEnterFrame = function() { hoge -= 1; cont = (snt+hoge); _root.texbox_mc.hhh = cont; //(1) if (cont<50) { cont = 50; } } } ★以下のスクリプトだとカウントダウンが50で止まるんですが、マウスオン(rollover)した瞬間、undefined未定義と表示されてから100が表示され、カウントダウンという展開になってしまいます…100からダウンしてくれたらいいんですが…。 onClipEvent (load) { hoge = 1; snt = 100; } on (rollOver) { this.onEnterFrame = function() { _root.texbox_mc.hhh = cont; //←(1)をここに上げるとifは効くが、undefinedが表示されてしまう hoge -= 1; cont = (snt+hoge); if (cont<50) { cont = 50; } } } ☆つまりはundefinedが出ないで100から始まり、50で止まってくれればいいんですが…。 どなたか教えてくださいませ。 前出があるかと検索しても出てきませんでしたが、これに類似したものでもよいのでページ等教えていただければ幸いです。

  • onEnterFrameで、条件を満たしたときにその処理から抜けたい。

    下のプログラムをフレームに書きました。そうすると、一応は重いどおりにうごいて、_alphaが増えていきphotoとなずけたがムービークリップが見えるという動きはできるのですが、問題は、traceさせてみるとずっと100、100と記述されます。できればこの処理から抜けて、traceで100と出てこないようにしたいです、なにか処理が重たそうなので。フレーム移動して処理抜けるのはできるかもしれませんが、できれば1フレームで終わらしたいなとおもっています。よろしくお願いいたします。バージョンはflashMX2004です。 this.onEnterFrame = function(){ if(photo._alpha >= 100){ photo._alpha = 100; trace(photo._alpha); }else{ photo._alpha += 5; } }

    • ベストアンサー
    • Flash
  • ドラッグ中の回転を止めたいのですが…

    ドラッグができて,なおかつクリックすると90度回転するようにするため,サンプル集を見てムービークリップ(sikaku_mc)に 次のようなアクションスクリプト(以下AS)を書きました。 もともと解説にあったのですが,これだとドラッグしている最中も 回転してしまいます。クリックすると回転しても ドラッグしているときは回転しないようにするためにはどうすればいいでしょうか。 ちなみにこのASはムービークリップ(sikaku_mc)の編集画面のタイムラインに書き込んだものです。 function onPress() { this.startDrag(false); var xm:Number = this._xmouse; var ym:Number = this._ymouse; this._x = _root._xmouse; this._y = _root._ymouse; sikaku_mc._x -= xm; sikaku_mc._y -= ym; this.onEnterFrame = mawasu; this.onMouseMove = updateStage; } function updateStage() { updateAfterEvent(); } function mawasu() { this._rotation += 90; } this.onRelease = this.onReleaseOutside=stopDragMe; function stopDragMe() { this.stopDrag(); delete this.onEnterFrame; delete this.onMouseMove; } ご教授よろしくお願いします。

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

専門家に質問してみよう