Flash初心者のための引数の渡し方

このQ&Aのポイント
  • Flash初心者の方にとって、引数の渡し方は少し難しいことかもしれません。今回は、rootから数えて4階層下のムービークリップ「hit_area」から、2階層上のフレームラベル「damage」の最初のフレームのムービークリップへ引数を渡す方法を探っています。同様の引数渡しはできたものの、うまくいかない部分があるようです。どのようにすれば解決できるのか、教えていただきたいとのことです。
  • Flash初心者の方が引数を渡す方法について困っているようです。具体的には、rootから数えて4階層下のムービークリップ「hit_area」から2階層上のフレームラベル「damage」の最初のフレームのムービークリップへ引数を渡したいとのことです。同じような引数の渡し方は他の箇所でできているが、この部分だけがうまくいかないようです。どのようにすれば問題が解決するのか、アドバイスを求めています。
  • Flash初心者の方が引数の渡し方について質問しています。具体的には、rootから数えて4階層下のムービークリップ「hit_area」と、その下の1階層下にある「attack_hit」という関数へ引数を渡したいとのことです。同じような処理は他の箇所でできているが、この部分だけがうまくいかないようです。問題を理解してもらうために具体的なスクリプトも記載されています。どのようにすれば解決するのか、アドバイスをお願いします。
回答を見る
  • ベストアンサー

引数の渡し方

Flash初心者です。 色々と探し回ったのですが、似た問題の解決法が見付けられなかったので質問させて頂きます。 FlashMX2004を使っております。 内容ですが… rootから数えて4階層下の「hit_area」というムービークリップ自体を変数「this」として、そこから2階層上の、2つ目のフレームラベル「damage」の最初のフレームのムービークリップ(インスタンス名は付けてません)の1階層下の「attack_hit」という関数に引数として渡したいのです。 同じ要領で、rootから数えて4階層下の、同じ「hit_area」を、そこから3階層上の最初のフレームに書かれている「attack_hit」という関数に渡すことは出来ました。 後者のスクリプトは… onEnterFrame = function() { _parent._parent._parent.attack_hit(this); } です。 これを真似て、前者を… onEnterFrame = function() { _parent._parent.damage.attack_hit(this); } としてみましたが、うまくいきませんでした。 これで理解して頂けるかわかりませんが、ご理解頂けましたらどうすればよいか教えて下さい。 似たような引渡しが出来れば違う方法でも結構です。 宜しくお願いします。

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

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

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

#1です。 一応書かれていらっしゃるような階層構造を作成しました。 そして, stand_mc の フレーム1 には次のように書き, ------------------------------ function attack_hit(AAA) { trace(this); trace(AAA); } ------------------------------ damage_mc の フレーム1 にも同じく次のように書き, ------------------------------ function attack_hit(AAA) { trace(this); trace(AAA); } ------------------------------ hit_area の フレーム1 には次のように書いて, ------------------------------------------ this.onEnterFrame = function() { _parent._parent.stand_mc.attack_hit(this); _parent._parent.damage_mc.attack_hit(this); delete this.onEnterFrame; }; ------------------------------------------ 「制御」→「ムービープレビュー」してみた結果, 一応次の値が出力されました。 出力結果↓ ////////////////////////////////////// _level0.char1.char.stand_mc _level0.char1.char.attack_mc.hit_area _level0.char1.char.damage_mc _level0.char1.char.attack_mc.hit_area ////////////////////////////////////// パスは合っているようですよ。 ただ, hit_area の フレーム1 に this.onEnterFrame = function() を除いて, _parent._parent.stand_mc.attack_hit(this); _parent._parent.damage_mc.attack_hit(this); だけを書いた場合は何も実行されませんでした。 この2行のスクリプトを 今度はフレーム2に移動させれば実行されました。 つまりパスは合っているのですが, stand_mc と hit_area に function attack_hit が定義されるタイミングが, hit_area のフレームで実行される attack_hit(this); より遅くなるようです。 この時間差をなんとかすれば(上の場合 onEnterFrame でずらす), うまく行くと思います。

vlaxophone
質問者

お礼

お手数お掛けしまして申し訳ないです。 ありがとうございます。 パスの問題はクリアとのことなので、あとはタイミング合うように頑張ります。 お世話になりました。

その他の回答 (1)

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

ご質問から階層構造を考えると次のようになります。  _root   └ムービークリップ 「?1」 - attack_hit ○     └ムービークリップ 「?2」       ├ムービークリップ 「?3」 - attack_hit ×       └ムービークリップ 「?3’」         └ムービークリップ 「hit_area」 さらに, > ムービークリップ(インスタンス名は付けてません)の > 1階層下の「attack_hit」という関数に引数として渡したいのです。 ということですから, 相対パス自体は次のようになります。 _parent._parent.damage.attack_hit(this);   ↓変更↓ _parent._parent.ムービークリップ 「?3」.attack_hit(this); 少なくとも, ムービークリップ 「?3」 にはインスタンス名が必要ですね。 それと,  ↓階層 ↓階層 ↓フレームラベル _parent._parent.damage. このような勝手なルールは最初から通じません。 あえて似たようなことをするのでしたら, _parent._parent.ムービークリップ 「?3」.gotoAndStop("damage"); _parent._parent.ムービークリップ 「?3」.attack_hit(this); となります。 その時に存在しないオブジェクトになど命令はできません。 関数も,それ以前に定義されていないと実行できません。

vlaxophone
質問者

お礼

丁寧なご回答ありがとうございました。 若干伝わりきれなかった部分があったためか、うまくいきませんでした。

vlaxophone
質問者

補足

補足と整理をさせて頂きます。 ご回答の通り、ムービークリップに名前を付け、整理したところ… _root  └ムービークリップ「char1」   └ムービークリップ「char」    ├ムービークリップ「stand_mc」ラベル「stand」(フレーム1)    ├ムービークリップ「damage_mc」ラベル「damage」    └ムービークリップ「attack_mc」ラベル「attack」     └ムービークリップ「hit_area」 となりました。 質問の後に試した場合も入れ、質問の時の例に当てはめると… _root  └ムービークリップ「char1」― attack_hit ○   └ムービークリップ「char」― attack_hit ○    ├ムービークリップ「stand_mc」― attack_hit ×    ├ムービークリップ「damage_mc」― attack_hit ×    └ムービークリップ「attack_mc」     └ムービークリップ「hit_area」 となりました。 直接「damage_mc」内へ引数が渡せなかったので、フレーム1にある「stand_mc」なら出来るのではと思い、「hit_area」に… _parent._parent.stand_mc.attack_hit(hit_area); と書いて試してみましたが、「stand_mc」の中へも入れません。 質問の時に実証済みの通り、階層を上がることは出来ます。 更に、成功した「char1」より余計に1階層上に上がってから「char1」に戻るパスを書いてみると、ちゃんと中へ入ることが出来ました。

関連するQ&A

  • 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
  • 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(); などと苦し紛れにやってみましたが、すべて同じように怒られます。 どのようにすれば、下の階層から一番上の階層の別フレームに 移動することができますでしょうか? よろしくお願い致します。

  • 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で、親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
  • gotoAndPlayされないです

    はじめてFlashを作ります。 "ATTACK1"と"ATTACK2"のフレームを0.2秒の間隔で10回交互に表示したあと、 "ATTACK3"と"ATTACK4"のフレームをenterが押されるまで交互に表示する というプログラムを作りたいのですが、 "ATTACK1"と"ATTACK2"のフレームを交互にずっと表示されるだけで、 ATTACK3へ移動しません。 "ATTACK1"というラベルのフレームに以下のように書きました。 ActionScript2.0でやっています。 どこが悪いのか教えてください。お願いします。 ATTACK1フレームのActionscript var timeCount = true; var endTime = getTimer()+0.2*1000; stop(); onEnterFrame = function() { if( timeCount ){ time = Math.ceil((endTime-getTimer())/1000); if( time <= 0 ){ timeCount = false; if( count >= 10 ){ gotoAndPlay("ATTACK3"); count=0; delete this.onEnterFrame(); } gotoAndPlay("ATTACK2"); count=count+1; delete this.onEnterFrame(); } } }; ATTACK2フレームのAcctionscript var timeCount = true; var endTime = getTimer()+0.2*1000; stop(); onEnterFrame = function() { if( timeCount ){ time = Math.ceil((endTime-getTimer())/1000); if( time <= 0 ){ timeCount = false; gotoAndPlay("ATTACK1"); delete this.onEnterFrame(); } } };

    • ベストアンサー
    • Flash
  • ActionScript2.0

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

  • 格納式の動くメニューとヒット領域判定について

    ロゴをさわると格納されていたメニューがモーションを伴いながらでて、そのまま消えずに維持、一定以上左のエリアにいってしまうとメニューが消えるメニューを作りたいと思っています。 http://fashion.dior.com/dior.html イメージとしてはこちらのどれかリンクを選んでいただいて各コンテンツを表示させるメニューをクリックした時の動きが近いです。 格納→維持→エリア外にいくと消えるしくみまではなんとか作れたのですが、不思議なことにメニューが現れるときにモーションをともなわず、最後のフレームだけが再生されるようになってしまいました。 なお、ロゴには下記のスクリプトをつけました。 ヒットテストにしていないのはその後も条件をつけるためにはヒットテストだとできない?かなと思ったからです。 onClipEvent (mouseMove) { if (this._parent._xmouse>749.6 && this._parent._xmouse<966.6 && this._parent._ymouse<228.6 && this._parent._ymouse>28.6) { this._parent.menu.gotoAndPlay(2); } else if (this._parent._xmouse<698.9) { this._parent.menu.gotoAndStop(1); } else { this._parent.menu.gotoAndStop(7); } } 表示させるメニューのムービークリップ(menu)には onClipEvent (mouseMove) { if (this._parent._xmouse>698.9) { this.gotoAndStop(7); } else if (this._parent._xmouse<698.9) { this.gotoAndStop(1); } } と書きました。 かなり無理矢理なスクリプトだと思いますがご教授お願いします。! ちなみに制作環境はflashMX2004です。

  • ボタンから一つ上の階層のムービークリックを徐々にアルファ値を上げたり下げたりする。

    はじめまして、jpncan15といいます。 初めて質問させていただきます。 階層がややこしい状態ですが、ボタンから一つ上の階層のムービークリップのアルファ値を徐々に上げたり下げたりしたいのですが、なかなかうまく行かず昨晩から悩み中です。 もし、ご存じの方がいればご教授お願いいたします!! ○状況 シーン1  mc1(ムービークリップ)   mc2(ムービークリップ:インスタンス名:image)   mc3(ムービークリップ) buttan(ボタン:ボタン名:b1) ○buttan(ボタン:ボタン名:b1)のスクリプト ※触っていると、アルファ値が0→70%に変わって行く。 ボタンをはなすとアルファ値が70→0%変わって行く。 ※このスクリプトだと、徐々に変わって行くのではなくいきなり、アルファ値が「5」変わるだけなのです。。。 on (rollOver) { if (this._parent.image._alpha < 70){ this.common_b._alpha += 5; } } on (rollOut) { if (this._parent.image._alpha > 70){ this.common_b._alpha -= 5; } }

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

専門家に質問してみよう