FlashCS5 ActionScript2.0で3つのボタンを制御する方法

このQ&Aのポイント
  • FlashCS5 ActionScript2.0を使用して3つのボタンを制御する方法について説明します。
  • 3つのボタンはbt1、bt2、bt3というインスタンス名を持っています。
  • マウスオーバーするとボタンのサイズが120%に大きくなり、ロールアウトすると元のサイズに戻ります。しかし、ロールアウトの動作中に他のボタンに触れると、ロールアウトの動作が中断されます。なぜでしょうか?
回答を見る
  • ベストアンサー

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
  • 回答数2
  • ありがとう数6

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

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

書かれていらっしゃるスクリプト中にある onEnterFrame = function(){…} は スクリプトを書かれていらっしゃるタイムラインに対して(_rootに対して)定義している onEnterFrameイベントハンドラメソッドです。 つまり _root.onEnterFrame = function(){…} と書いているのと同じことです。 1つのムービークリップ(_rootもムービークリップの一種) に対して 同じ種類のイベントハンドラメソッド は1つしか定義できません。 _root.onEnterFrame = function(){A}; _root.onEnterFrame = function(){B}; _root.onEnterFrame = function(){C}; と書いた場合,結局 _root.onEnterFrame = function(){C}; だけ書いたのと同じになります。 (同じ関数名の関数を再定義し直しているだけ) 回避策としては, ボタンをボタンインスタンスとして用意するのではなく ボタンをムービークリップインスタンスとして用意し そのムービークリップに対して 各ムービークリップ.onEnterFrame = function(){…}; を定義するのが一般的です。 しかし ボタンはボタンインスタンスでしか用意できない場合は, onEnterFrame 定義用のムービークリップを作成しても良いと思います。 それと... var なしで関数内に変数を作成すると その変数はグローバルなタイムライン変数になってしまいますよ。 その点も入れてスクリプトを修正↓ ================= stop(); sx = 3; var i; //----------- for (i = 1; i < 4; i++) { Nov = "bt" + i; //_rootの深度iにムービークリップ「bt[1~4]_mc」を作成 _root.createEmptyMovieClip(Nov + "_mc", i); _root[Nov].onRollOver = function() { Name = this._name; btOverMotion(Name); }; _root[Nov].onRollOut = function() { Name = this._name; btOutMotion(Name); }; } //----------- function btOutMotion(eachNo) { //↓このNoはローカルであるべき var No = eachNo; //各ムービークリップに対してonEnterFrameを定義 _root[No + "_mc"].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はローカルであるべき var No = eachNo; //各ムービークリップに対してonEnterFrameを定義 _root[No + "_mc"].onEnterFrame = function() { if (_root[No]._xscale > 120) { delete this.onEnterFrame; } else { _root[No]._xscale += sx; _root[No]._yscale += sx; } }; } ================= このままでも動作に支障はないようですが 意味合いからすると Nov = "bt" + i; なども本当は var Nov = "bt" + i; のようにすべきだと思います。

q0190dg
質問者

お礼

大変ありがとうございます!! よくわかりました。ガッデム理解です! なるほどonEnterFrameって個々に当てられるんですね。 これで解決です。 グローバル変数についてもよくわかっていないのですが、ここではvarを当てた方が「よりベター」ということですよね。まあ、動くかもしれないけど、あとあと重複したりすることになって動かなくなるよ、ということで理解しました。 グローバル変数にすると"いつでもどこでも"使うよ、っていうものになってしまうのでうまくないわけですね。勉強になりました。ありがとうございます。 取り急ぎ御礼までです。

その他の回答 (1)

  • tracer
  • ベストアンサー率41% (255/621)
回答No.2

この場合の、onEnterFrameはいわゆる時計(タイマー)のようなものです。 同時に2つ以上の行動が起こせないのは、その時計が1つしかないからです。 たとえば、今回のロールオーバー・アウトのアクションは、「一定時間毎に大きさを3%づつ変化させ、ある大きさになったらストップする」というものですが、この一定時間を計測しているのがonEnterFrameです。ひとつのボタンからロールアウトして、時間を計測中にも関わらず、新たなロールオーバーによって計測をリセットしてしまうというのが、今回の現象です。 つまり時計の数を増やすことで、この問題は解決できます。 例の記述では、記述したタイムラインの時計を使っているので、それを各ムービークリップの時計を使用するようにすれば、よいかと思います。 具体的な方法は、BlurFiltanさんの例が参考になりますね。

q0190dg
質問者

お礼

おかげさまで理解できました。 なるほど、rootの時計、各ムービークリップの時計で分ければいろいろな時間を使えるっていうわけですね。 わかりやすい説明ありがとうございました!

関連するQ&A

  • ムービークリップの拡大縮小

    MCをクリックしたら拡大・縮小をさせたく、過去の投稿を参考にしながら、以下のscriptを作りました。 onClipEvent(load){ v_orgScale = this._xscale; v_orgX = this._x; v_orgY = this._y; zoomState = false; } on(release, releaseOutside){ zoomState = !zoomState;  this.onEnterFrame = function(){   if( zoomState ){    if(this._xscale >= v_orgScale*2.3){     delete this.onEnterFrame;    }else{     this._xscale *= 1.1;     this._yscale *= 1.1;    }   }else if( !zoomState){    if(this._xscale <= v_orgScale){     this._xscale = v_orgScale;     this._yscale = v_orgScale;     delete this.onEnterFrame;    }else{     this._xscale *= 0.9;     this._yscale *= 0.9;    }   }  }; } ただ、これだとMCの基準点(0,0)に対しての拡大縮小なのでクリックしたポイントが拡大するにつれてどんどんずれていきますよね? これをクリックしたポイントがずれないように拡大縮小する事は可能でしょうか? 宜しくお願いいたします。

    • ベストアンサー
    • Flash
  • createEmptyMovieで作成したMCの基準点

    アクションスクリプト2.0、FlashCS、WinXPを使用しています。 createEmptyMovie("test",1); _root.test.loadMovie("test.jpg"); _root.test._xscale = 10; _root.test._yscale = 10; onEnterFrame = function(){ _root.test._xscale += 10; _root.test._yscale += 10; } としたとき、基準点が左下になっているのですが、 これを中心とか、右上とかに変更するためには どのようにしたらいいのでしょうか。。

    • ベストアンサー
    • Flash
  • scriptを使いまわしたい。

    見よう見まねで下記のようなスクリプトを記述しています。 複数のムービークリップに設定していますが、編集するのにかなり手間がかかります。うまく使いまわす方法はございませんでしょうか…。 また、記述の仕方にも問題等ありましたらご指南ください。。 onClipEvent (load) {  sx_move = Math.floor(Math.random() * -10) - 3;  sy_move = Math.floor(Math.random() * 6) - 3;  s_scale = Math.floor(Math.random() * 40) + 40;  _xscale = (s_scale);  _yscale = (s_scale);  n = 1; } onClipEvent (enterFrame) {  _x += (sx_move);  _y += (sy_move); } on (rollOver) {  mx.behaviors.DepthControl.bringToFront(_root);  this.onEnterFrame = function () {   n += 1;   _x -= (sx_move);   _y -= (sy_move);   if (n < 20) {    _x = (_x + 25) / 1.5;    _y = (_y + 12) / 1.5;    _xscale = (_xscale + 50) / 1.5;    _yscale = (_yscale + 50) / 1.5;   } else if (n < 40) {    stop();   } else if (n < 50) {    _x += 13;    _y += 13;    _alpha -= 20;    _xscale = (_xscale) / 1.2;    _yscale = (_yscale) / 1.2;   } else {    stop();   }  }; }

    • ベストアンサー
    • Flash
  • 画像を中央にズームさせるには

    Flash超初心者です。 小さな画像が2、3個横に並んでいて、一つをクリックすると中央にズームし、他の画像をクリックすると先にズームされていた画像がもとの小さな画像に戻るようにしたいです。 http://www.suntory.co.jp/sho-chu/srk/urabanashi.html 過去ログに参考になるものがあり http://oshiete1.goo.ne.jp/kotaeru.php3?q=1444680 少し変更して下記のようにしました。 onClipEvent (load) { yScl = this._yscale; xScl = this._xscale; yPos = this._y; xPos = this._x; } on (rollOver) { this.onEnterFrame = function() { this._yscale *= 1.1; this._xscale *= 1.1; if (this._yscale>=yScl*2.5) { this._yscale = yScl*2.5; this._xscale = xScl*2.5; this.swapDepths(++_root.Depth); } }; } on (rollOut, dragOut) { this.onEnterFrame = function() { this._yscale *= 0.9; this._xscale *= 0.9; this._y += (yPos-this._y)*0.3; this._x += (xPos-this._x)*0.3; if (this._yscale<=yScl) { this._yscale = yScl; this._xscale = xScl; this._y = yPos; this._x = xPos; this.onEnterFrame = null; } }; } でも、これは画像のある同じ場所でズームするので画面の中央でズームさせたいです。 座標を指定すればいいという理屈はわかるのですが、どの部分にどういASを入れたらいいのがわかりません。 また、上記のASでは、ズームしたあとマウスがオブジェクトからはずれると画像がもとの大きさにもどってしまいます。 on (rollOut, dragOut)と入れているからでしょうが、では何を入れたらいいの悩んでしまいましてご相談させていただきました。 どなたかご教授ください。よろしくお願いいたします。

    • ベストアンサー
    • 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
  • 揺れるスクリプトについて

    こちらで教えていただいたサイトで揺れるスクリプト を勉強していたのですが、 ■をMCにして、  onClipEvent (load) {    this._xscale = this._yscale = 0;    function sMove(mScale,acc,conv) {      theScale = theScale*acc+(mScale-this._yscale)*conv;      this._xscale = this._yscale += theScale;    }  }  onClipEvent (enterFrame) {    if (this.hitTest(_root._xmouse,_root._ymouse,1)) {      sMove(130,0.8,0.2);    } else {      sMove(100,0.8,0.2);    }  } と書いたのですがプレビューすると真っ白なままなにも 表示されません。 なぜなのでしょうか?

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

    以下のようなスクリプトで、写真のメニューを作っています。 画像の読み込みまでは、うまくできたのですが、ボタンにする ところでつまづいています。 以下のスクリプトでは、どのボタンをクリックしても、変数mに10が代入されているため、10.jpgがphoto_mcに表示されてしまいます。どのようにすれば、 menu1_mcをクリックすれば、1.jpg、 menu2_mcをクリックすれば、2.jpg、 menu3_mcをクリックすれば、3.jpg・・・ のようになるのでしょうか?説明が下手で申し訳ありません m(_ _)m i = 10; /*trace(i);*/ for (y=0; y<10; y++) { m = y+1; obj = this.attachMovie("menu", "menu"+m+"_mc", y); obj._x = 30; obj._y = 70*y+10; /*画像読み込み*/ name = "menu"+m+"_mc"; this[name].photo_mc.loadMovie("photo/"+m+".jpg this[name].photo_mc._xscale = 15;//% this[name].photo_mc._yscale = 15;//% /*ボタン化*/ this[name].onRelease = function() { _root.photo_mc.loadMovie("photo/"+m+".jpg"); }; } 環境はFlashCS3、ActionScript2.0です。 よろしくお願いします。

  • [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; }

  • onEnterFrameの中止

    お世話になります。 1フレームには下記のようにマウスに追従させています。 function moveCross() { this._x = _root._xmouse; this._y = _root._ymouse; } closs.onEnterFrame = moveCross; 1フレームのメニューから2フレームに進んだ時に、この追従をさせないようにしたいのですが できません。delete onEnterFrameを使えばいいとわかったのですが。 すみませんが、教えてください。

    • ベストアンサー
    • Flash

専門家に質問してみよう