ActionScript2.0のイベントについて

このQ&Aのポイント
  • 親ムービークリップに配置した子ムービークリップのイベントが実行されなくて困っています。
  • 親ムービークリップにはonRollOverイベントとonRollOutイベントを設定しました。
  • 子ムービークリップのonEnterFrameイベントは実行されますが、onReleaseイベントが実行されず困っています。
回答を見る
  • ベストアンサー

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

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

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

まず3行目に次のように書かれていらっしゃいますよね。 > this.onRollOver = function() これで,そのスクリプトを書いたムービークリップに ボタン系の on○○イベントハンドラメソッド が定義されます。 そして10行目にに次のように書かれていらっしゃいますよね。 > this["child_mc"].onRelease = function() これで,そのスクリプトを書いたムービークリップ内にある「child_mc」というインスタンス名のムービークリップに ボタン系の on○○イベントハンドラメソッド が定義されます。 ActionScript 2.0 以下では,ボタン機能は入れ子にできないんですよ。 ボタン系の on○○イベントハンドラメソッド,または on(○○) イベントハンドラ は,上下や内外に重ねられないということです。 もし,重ねた場合,上のボタンが優先になります。 ムービークリップは一種の箱のようなものですから, 箱自体がボタンであるような箱の中にボタンは入れられない, 入れても先に箱を押してしまうので,中のボタンにまで手が届かないという感じです。 ボタン機能を上下に(内外に)重ねる場合は, 一般的には,片方のムービークリップに hitTest を使います。 「onハンドラを使わずにロールオーバー/ロールアウトを検出する」 http://fumiononaka.com/TechNotes/Flash/FN0308001.html --------------------------------- 最近 Flash を始められた方であれば区別が付きにくいと思うのですが, ムービークリップの on○○イベントハンドラメソッド には大きく分けて2種類のものがあるのです。 1つは Flash 4 以前からあるボタン由来の on○○イベントハンドラメソッド で, もう1つは Flash 5 以降に登場したムービークリップ由来の on○○イベントハンドラメソッド です。 「ムービークリップのイベントハンドラ」 http://homepage3.nifty.com/ginga-b/MX/mc_eventhandler.html ボタン系の on○○イベントハンドラメソッド,または on(○○) イベントハンドラ は,上下に重ねられませんが, ムービークリップ系 on○○イベントハンドラメソッド,または onClipEvent(○○) イベントハンドラ は, マウスでそのもの自体をクリックするとかしないとか関係ないので,上下に重ねられます。

sh_200911
質問者

お礼

ご回答頂きありがとうございます。 お礼が遅くなり申しわけございません。 詳しい説明と参照アドレスのおかげで問題を解決することができました。 >最近 Flash を始められた方であれば区別が付きにくいと思うのですが, >ムービークリップの on○○イベントハンドラメソッド には大きく分けて2種類のものがあるのです。 >1つは Flash 4 以前からあるボタン由来の on○○イベントハンドラメソッド で, >もう1つは Flash 5 以降に登場したムービークリップ由来の on○○イベントハンドラメソッド です。 2種類の違いをまったく理解していませんでしたので大変勉強になりました。 親ムービークリップの処理をhitTestとonEnterFrameを使って書き換えることで、希望の処理ができました。 本当にありがとうございます。

関連する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
  • Flash ActionScript(アクションスクリプト)の挙動

    Flash ActionScript(アクションスクリプト)の挙動が 思うようにならず困っています。 ●使用ツール  Macromedia Flash MX ●やりたいこと  ムービークリップ【mc_4_0】【mc_4_1】【mc_4_2】が配置されている。  各ムービークリップにマウスが乗っているかを毎フレーム判定し、  乗っていればx/yscaleを1.5倍に、乗っていなければ1倍に戻す。 ●現在の処理  ○メインタイムラインの処理 ---------------------------- //最初のシーンを設定 _global.scene = SceneMcSelect //毎フレーム、シーン関数を呼ぶ onEnterFrame = function() { //現在シーンを呼ぶ eval( _global.scene )(); } ----------------------------  ○SceneMcSelect関数の定義 ---------------------------- function SceneMcSelect(){ for( count = 0 ; count < 3 ; count++ ){ //マウスが乗ったか? eval("mc_4_" + count).onRollOver = function(){ trace(count); eval("mc_4_" + count)._xscale = 150; eval("mc_4_" + count)._yscale = 150; } //マウスが離れたか? eval("mc_4_" + count).onRollOut = function(){ trace(count); eval("mc_4_" + count)._xscale = 100; eval("mc_4_" + count)._yscale = 100; } } } ---------------------------- ●現在の挙動  onRollOverやonRollOutの判定は正しく行われているようですが、  x/yscaleの変更処理が行われません。  traceでcountの値を確認すると、なぜか【3】になっています。 難しい処理をしているわけではないと思うのですが、 思うとおりの挙動にならず困っています。 何か間違いや見落とし等ございましたら、ご指摘お願いいたします。

    • ベストアンサー
    • Flash
  • ActionScript 孫のパス

    こんにちは。 今Flashを編集しているのですが、(初心者です) ┏━━━━━━━┓ ┃┌─────┐┃ ┃│ mc1_1    │┃ ┃└─────┘┃ ┃           ┃ ┗━━mc1━━━┛ mc~はムービークリップのインスタンス名です。 上のようにmc1の中にさらにmc1_1というムービークリップがある、という形です。 「_root.mc1.mc1_1.onRollOver~」のように指定したイベントが動きません。 (onReleaseも同様) 「_root.mc1.onRollOver~」は正常に動きました。 ただし、 「_root.mc1.mc1_1._visible = ~」のように書くと、ちゃんと動作していました。 この場合どういった原因が思い当たりますか? パスが間違っているんでしょうか… ちなみにCS3、ActionScript2.0です。 よろしくお願いします。

  • ActionScript3.0フレーム移動について

    お世話になります。 Flash ActionScript3.0で、ボタンをクリックしたら、 階層違いのシーンに移動するという 単純なところでつまずいています。 一番上の階層には、 1フレーム目 フレームラベル "a" 2フレーム目 フレームラベル "b" として、それぞれ this.stop();を書いてあります。 "a""b"には、それぞれムービークリップが配置してあって、 今やりたいことは、"a"に配置してあるムービークリップの 2つ下(中?)の階層にあるボタンをクリックしたら、一番上の階層の"b"に移動して、 "b"に配置してあるムービークリップを表示するようにしたいのです。 "a"のムービークリップのボタンのあるフレームには、 this.stop(); button01.addEventListener(MouseEvent.CLICK,jumpB); function jumpB(event:MouseEvent):void { MovieClip(parent.parent).gotoAndStop("b"); } と書いてみましたが、 [TypeError: Error #1009: null のオブジェクト参照のプロパティまたはメソッドにアクセスすることはできません。] と怒られます。 試しに MovieClip(stage).gotoAndStop("b"); とか、"b"に配置してあるムービークリップにインスタンス名"b_mc"を与えて MovieClip(parent.parent).b_mc.play(); などと苦し紛れにやってみましたが、すべて同じように怒られます。 どのようにすれば、下の階層から一番上の階層の別フレームに 移動することができますでしょうか? よろしくお願い致します。

  • ActionScript2.0

    actionscript2.0で作成をしている初心者です 今、ドラッグが可能なムービークリップを作成し、 その下の階層にボタンを作成しています。 onClipEvent (enterFrame){ this.onPress = function(){ドラッグ開始} this.onRelease = function(){ドラッグ終了} this.button1.onPress = function(){ボタン押した処理} [現状] ムービークリップをドラッグ不可能にすれば、ボタンを押すことは可能なのですが、ドラッグ可能にするとボタンが押せなくなります。 ムービークリップのドラッグが可能で、かつムービークリップ階層下のボタンを有効にするためにはどうしたらよいでしょうか。 宜しくお願いします

  • actionscript2のクラスの中の書き方について

    Flash ActionScript2のクラスの中の書き方について悩んでいます。 クラスの中にMcを定義するものですがthis.mct.onPressのところで class testAの中の_move()が実行できません。いろいろ試してみました がうまく実行できませんでした。なにかいいやり方はないでしょうか? よろしくお願いします。 class testA{  var mct:MovieClip;  function testA(mct:MovieClip){   this.mct = mct;   this.mct.onPress = function(){    _parent._move();   }  }  function _move(){    this.mct.onEnterFrame = function(){   }  } }

    • ベストアンサー
    • Flash
  • 外部変数で条件分岐

    ムービークリップ内にダイナミックテキストを配置、インスタンス名を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
  • ドラッグ中の回転を止めたいのですが…

    ドラッグができて,なおかつクリックすると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
  • ActionScriptで、押したボタンの判別方法を教えてください。

    ActionScriptで、押したボタンの判別方法を教えてください。 ActionScript3.0で作成しています。 6フレームの【oya_mc】というムービークリップの各フレームに フレーム1ラベル[m1]に【ko1_mc】 フレーム2ラベル[m2]に【ko2_mc】 フレーム3ラベル[m3]に【ko3_mc】 フレーム4ラベル[m4]に【ko4_mc】 フレーム5ラベル[m5]に【ko5_mc】 フレーム6ラベル[m6]に【ko6_mc】 というムービークリップを配置しています。 配置しているムービークリップには、それぞれ6個のボタンを呼び出して配置しています。 【btn1】【btn2】【btn3】【btn4】【btn5】【btn6】 【btn3】を押したときに【oya_mc】を3フレーム目に移動。 【btn6】を押したときに【oya_mc】を6フレーム目に移動。 というようにしたいのですが、なかなかうまくいきません。 FLASH初心者ですが、どうかご指導よろしくお願いします。 【ko1_mc】に書いたスクリプトを抜粋して書きます。 ------- for(var i:int = 1; i <= 6; i++){ this["btn" + i].addEventListener(MouseEvent.CLICK,Down); function Down(mo:Event):void{ MovieClip(parent).gotoAndPlay("m"+i); } } ------- よろしくお願いします。

    • ベストアンサー
    • Flash
  • 取得した変数の階層について

    どうしても解らないのでご質問させてください。 Flashで、親MC内の複数の子MCのインスタンス名から数字を取得し (product1~product9)それぞれのマウスアクションを まとめて親MC内のフレームに記述しました。 試行錯誤の末、 for (i=1; i<10; i++) { this["product"+i].Para = i; this["product"+i].onRollOver = function() { trace(this.Para); this._parent["product"+this.Para].onEnterFrame = function() { this._parent["product"+this.Para]._alpha -=this._parent["product"+this.Para]._alpha/2; }; }; } で、上手く動くようになったのですが、this.Paraを代入すると this["product"+this.Para]では動かなかったのです。 階層がthis._parentじゃないと動かないのが、謎です。 ちなみに全部ルート上において、階層を_rootのみで指定すると上手く行きました。 なぜ、親MC内だとthis._parentという指定になるのか、 知りたいです。 このままだと肝心な事が解っていないまま、なんとなくできてしまった感じなので…どうぞよろしくお願いいたします。

    • ベストアンサー
    • Flash

専門家に質問してみよう