プルダウンメニューの移動

このQ&Aのポイント
  • プルダウンメニューの移動方法を教えてください。ムービークリップを使用して、ヘッドをドラッグしてメニューを動かしたいですが、うまくいきません。
  • ムービークリップを使ったプルダウンメニューの移動方法を教えてください。ヘッドをドラッグするとメニューを動かしたいです。
  • ムービークリップの中にヘッドがあり、ドラッグしてメニューを動かしたいです。しかし、うまくいきません。どのようにすればいいでしょうか?
回答を見る
  • ベストアンサー

プルダウンメニューの移動

ムービークリップ(インスタンス名:menu)を作成し、 その中にムービークリップ(インスタンス名:head)を作成しました。 head をマウスで動かすスクリプトは以下のようになっていて動かすことができます。 onClipEvent(load) { //ドラッグを開始します function dragFunc() { this.startDrag(frame, -400, -300, 400, 300); } //ドラッグを終了します function dropFunc() { this.stopDrag(); } } on(press) { this.dragFunc(); } on(release, releaseOutside) { this.dropFunc(); } しかし、head をドラッグして、menu を動かすことができません。(this を menu、menu.head に変更しても) どのようにしたら、いいでしょうか?

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

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

  • ベストアンサー
  • DPE
  • ベストアンサー率85% (666/776)
回答No.1

this を使う時は、this の指す対象にご注意ください。 onClipEvent アクションで this を使った関数を定義していますが、このアクションと on アクションをインスタンス menu に設定した時は、this は menu を指します。従って、menu 全体をドラッグのヒット領域(マウスが反応する部分)とするドラッグの処理が実行されることになります。 onClipEvent と on アクションを、menu 内部の head インスタンス( menu の元になっているシンボルの中にあるインスタンス head )に設定すると、this はhead を指します。従って、この場合は head だけがドラッグのヒット領域になりますが、ドラッグした時に動くのも head だけです。 onClipEvent と on を設定した場所が違う場合は、少々ややこしくなります。 onClipEvent を menu に、on を head に設定した場合、関数を所有しているのは menu で、関数内で使われている this が指す対象、つまりドラッグの対象も menu になります。 しかし、on の中で使われている this が指しているのは head です。this.dragFunc として関数を呼ぶと、head が所有する dragFunc を呼ぶという意味になりますが、head では関数を何も定義していないのですから、関数は未定義と扱われ、処理は何も行われません。 ちなみに、head に設定されている on の中で menu.*** と書いた場合は、head の中( head の下の階層)にある menu ムービークリップのターゲットパスになります。今回のムービークリップの構成では menu の中に head があるはずので、この書き方では menu へ指示を出すことはできません。 結論として、どうすればいいかと言いますと。 head と menu は入れ子の状態、つまり親子階層になっています。head から見ると、menu は親階層にあたります。子階層から親階層を指定するために、_parent というアクションが用意されています。this ではなく、こちらを使ってみてはいかがでしょうか。 関数を定義する onClipEvent アクションと、関数を呼ぶ on アクションを、ともに、head に設定してください。 それから、onClipEvent 内で定義している関数で使われている this を、それぞれ  _parent.startDrag(frame, -400, -300, 400, 300);  _parent.stopDrag(); このように、_parent に変更してみてください。 head に onClipEvent を設定し、その中で関数を定義すると、各関数の所有者は head となり、head に設定した on の中で this.dragFunc としても関数は正常に呼び出されます。ドラッグのヒット領域は on が設定されている head だけですが、ドラッグの対象は head 自身ではなく、その親である menu になります。 関数が定義されているターゲットやドラッグの対象を最終的に正確に指すことさえできていれば、実は、書き方はどんな書き方でも動作はします。もっとも、正常に動くというだけの話であって、分かりやすい書き方・推奨される書き方であるかどうかは、また別の問題ですが。 例えば、ご質問文のにある通りのアクションで、関数を定義する onClipEvent を menu に、関数を呼ぶ on アクションを head に設定して、  on(press)  {   _root.menu.dragFunc();  } と、絶対パスで呼び出してもいいですし(ただし、シンボルの汎用性はなくなります)、あるいは  on(press)  {   _parent.dragFunc();  } このように相対的に指定しても正常に呼び出されます。関数内の this は menu を指していますから、動くのは menu 全体ですが、ヒット領域になるのは、 on が設定されている head だけです。ただ、ドラッグの処理関数を所有しているのは menu ですので、head から関数を呼び出すには、menu までのターゲットパスの指定が必要です。 お使いの Flash が MX 以降であれば、MovieClip.on*** というイベントハンドラを利用して、クリックされた時に呼ぶ関数を予め定義しておくこともできます。  //headがクリックされたら、menuのドラッグを開始  _root.menu.head.onPress = function ()  {   _root.menu.startDrag();  }; MovieClip.on*** を使う時も、ターゲットの指定に関するルールは同じです。this や _parent も利用できます。 どの書き方が一番いいかは状況によって変わります。 MovieClip.on*** を利用すると、1箇所にまとめて処理を書いておけるのでスクリプトの管理がしやすく、for 文と eval というアクションを利用して大量のインスタンスに対する指示を一気に定義するなどの荒技も可能です。 しかし、同じシンボルから複数のインスタンスを作り、全てのインスタンスで同じ処理をさせたい場合は、シンボルに設定した方が効率的です。 目的に合わせて、いろいろな書き方を試してみてください。 長くなってすみませんでした。 不明な点がありましたら補足してください。

WETCOLD
質問者

お礼

ありがとうございます。  くわしいご説明で、大変よく分かりましたし、menu も動かすことができました。(flash は MX を使用しています。)

関連するQ&A

  • 外部ファイルを読み込んだMCをドラッグ&ドロップしたいんですが?

    flash(swf)で外部ファイルを読み込んだムービークリップ(MC)をドラッグ&ドロップで移動できるようにしたいんですが、どのようにすればできるでしょうか? 通常のライブラリなどに登録して表示させているMC(インスタンス名:photoL)は以下のようなASで処理できるんですが、外部ファイルを読み込んだMC(インスタンス名:photoF)では同じ書き方をしても表示はするんですが、ドラッグ&ドロップで移動できません。 --------------------------------------------------- photoF.loadMovie("test.jpg"); photoL.onPress = function(){ this.startDrag(false,v_leftLock,v_topLock,v_rightLock,v_bottomLock); }; photoL.onRelease = function(){ this.stopDrag(); }; photoL.onReleaseOutside = function(){ this.stopDrag(); }; photoF.onPress = function(){ this.startDrag(false,v_leftLock,v_topLock,v_rightLock,v_bottomLock); }; photoF.onRelease = function(){ this.stopDrag(); }; photoF.onReleaseOutside = function(){ this.stopDrag(); };

    • ベストアンサー
    • Flash
  • ドラッグアンドドロップアンドスムーズ移動

    x:0,y:0の座標に置いてあるムービークリップを 好きな場所にドラックができて話した瞬間x:0,y:0の座標に戻るという スクリプトが書きたいのですが、戻り方をだんだんとスムージングしていくような形で戻したいと思います。 以下をうまく組み合わせて実行したいと思っています。 どなたかご教授お願いします。 on (press) { this.startDrag(); } on (release) { this.stopDrag(); } onClipEvent (enterFrame) { xpos = 0; ypos = 0; this._x += (xpos-this._x)/2; this._y += (ypos-this._y)/2; }

    • ベストアンサー
    • Flash
  • ドラッグしたときの当たり判定

    ParaFlaを使ってFlashを制作しています aというスプライトをドラッグし bというスプライトにぶつかったらラベルCに飛ぶ というものを作りたいのですがうまくいきません aに記述しているアクションスクリプト on (press) { this.startDrag (true); } - on (release,releaseOutside) { this.stopDrag (); } - onClipEvent (enterFrame) { if(this.hitTest(_root.b) == true) { this.gotoAndPlay("c"); } } - onClipEvent (mouseMove) { updateAfterEvent(mouse); } バージョンはSWF8です ドラッグはできるのですがbとぶつかっても 何も起こりません bには何も記述していません どこを変更すればよいかわかる方 よろしくお願いします

    • ベストアンサー
    • Flash
  • Flash着せ替え用アクションスクリプト

    はじめまして。 FlashCS3で、キャラクター(体)にドラックドロップで服を着せられるような"着せ替え"を制作したいと考えています。 現在はキャラクターの体部分にあたるムービークリプ(インスタンス名"target")と服ににあたるムービークリップ(インスタンス名"clothes0")をシーン上に配置し、 "clothes0"内に this.onPress = function () { this.swapDepths(++_root.depth); this.startDrag(); } // this.onRelease = function () { this.stopDrag(); } // this.onMouseMove = function () { updateAfterEvent (); } というスクリプトを書いて、一応ドラックドロップで服だけ動くような感じです。 服の"clothes0"を体である"target"に吸着させる方法をご存じの方がいましたら教えてください! いろいろ検索などして調べたのですがどうもうまくいきません。 参考になりそうなwebサイトなどもありましたら教えていただけると助かります! ちなみにまだアクションスクリプトを触りだしたばかりの詳しくない者です;

  • ActionScript2.0

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

  • Flash 着せ替えゲームのアクションスクリプト

    現在Flashを使って着せ替えのゲームを作っています。 人物に洋服をドラッグドロップ吸着し、吸着しないと元に戻るところまではできるのですが、何着も洋服があると人物上で重なってしまいます。 それを、例えば洋服を着ているところに着物をドロップすると洋服が元にある場所に戻るということはできないのでしょうか。 現在のスクリプトはこのような感じです。 人物=mytarget 洋服のボタンのムービークリップのアクション(シーンに置く前) on (press) { this.startDrag(); } on (release, releaseOutside) { this.stopDrag(true); if (_droptarget == "/mytarget") { this._x = eval(_droptarget)._x; this._y = eval(_droptarget)._y; } else { this._x = oldX; this._y = oldY; } } シーン上に置いてある洋服のムービークリップ onClipEvent (load) { oldX = this._x; oldY = this._y; } ご回答出来る方がいらっしゃれば宜しくお願い致します。

  • ムービークリップの階層の問題?

    Flash8を使っています。 質問のタイトルと内容が合致しているのかどうか不安ですが以下のようなことをしようと思っています。  ------------------ | 選択した部品を置く領域choiceMC    ------------------    =================   |  部品を閲覧する領域 buhinMC   |                     ← |  ■   ■   ■   ■   ■    →→   |  部品となるムービークリップ      左右にスクロール   |  インスタンス名はなし   ==================                                →→→次の画面へボタン 部品となるムービークリップが約100個あります。インスタンス名はつけていません。 1画面で表示できないので画面を左右にスクロールして見ることができるようにしました。それがbuhinMCです。 使いたい部品のムービークリップはchoiceMCというムービークリップ上にドラッグアンドドロップをしておきます。 ここまではできているのですが、buhinMCを左右にスクロールをするとchoiceMC上にある部品のムービークリップまでが一緒にスクロールしてしまいます。 choiceMCとヒットした部品のムービークリップは、buhinMCがスクロールした後でも、そのままchoiceMC上に置いておきたいのです。 選択した部品には以下のようなスクリプトが書いてあります。 on (press) { this.startDrag(); } on (release) { this.stopDrag(); if (_root.choiceMC.hitTest(_root._xmouse, _root._ymouse, true)) { my_x = this._x; my_y = this._y; 以下続く これで説明しきれているかどうか分かりませんがどうか教えてください。

    • ベストアンサー
    • Flash
  • ドラックすると移動し、クリックすると地名インスタンスが複数選択される地図作成

    Flashで地図を作成しています。 大きめの地図なのでマスクをかけ、ドラックすると地図が移動され、非表示になっている箇所も表示できるように作成しました。 この地図に対して、更に各地名インスタンスを複数選択でき、選択された地名を地図横にテキストとして羅列させる仕組みを作りたいと思います。 移動する時の動作として、配置している全体地図をmap_mcとし、そのムービークリップに対して下記のようにスクリプトを記述しました。 onClipEvent (load) { press_flg = false; drag_flg = false; } //マウスのボタンが押されたら onClipEvent(mouseDown) { press_flg = true; } //マウスポインタが動かされたら onClipEvent(mouseMove) { if(press_flg && (!drag_flg)) { hidari = Stage.width-this._width/1.22; ue = Stage.height-this._height/1.2; migi = this._width/3.6; sita = this._height/3.3; this.startDrag(false, hidari, ue, migi, sita); drag_flg = true; } } //マウスボタンが押されて離されたら onClipEvent(mouseUp) { if(drag_flg) { this.stopDrag(); } else { ※空欄; } press_flg = false; drag_flg = false; } //マウスボタンが押され、範囲外で離されたら on(release, dragOut) { this.stopDrag(); press_flg = false; drag_flg = false; } 今は動作確認のため、「※空欄」箇所にgetURLなどの記述をしていますが、ここにどのようなスクリプトを記述すれば希望の動作をするのかわからず、ネットで検索しても参考になるものを見つけられずにいます。 よろしくお願いします。

    • ベストアンサー
    • Flash
  • ActionScript 3.0 D&Dの実装

    ステージ上に、インスタンス20個配置し (addChildは使わずに、普通に最初から置きます。  インスタンス名は mc1 ~ mc20)  それぞれをドラッグアンドドロップで自由に動かしたいです。 以下のようにプログラムを書いたのですが いざドラッグしようとすると 「TypeError: Error #1006: value は関数ではありません at MethodInfo-1()」 っとエラーが出てしまいました。 っと出てしまいました。 一体何が原因でしょうか? また、解決方法がありましたら是非ともよろしくお願いします。 addEventListener(MouseEvent.MOUSE_OVER,getname); function getname(e:MouseEvent) {    var str= e.target.name; trace(str); //マウスカーソルを乗せたムービークリップのインスタンス名が出ます。 addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown); function onMouseDown(e:MouseEvent) { str.startDrag(); } addEventListener(MouseEvent.MOUSE_UP, onMouseUp); function onMouseUp(e:MouseEvent) { str.stopDrag(); } }

    • ベストアンサー
    • Flash
  • 遠隔操作できるボタン

    こんにちは、FLASH初心者です。 ある程度自力で調べましたが、諸事情から時間が差し迫っているので、質問させてもらいます。 Movie Clip "A" に以下のスクリブトを書き、 on (press) { this.startDrag(false,0,0,0,100); } on (release, releaseOutside) { this.stopDrag(); } onClipEvent (enterFrame) { _parent._parent.star_mc.xXYposition(this._y); } 別のオブジェクト“star_mc”に以下を書き込み、 onClipEvent (load) { nMinX = -80; nMaxX = 80; nDistX = nMaxX-nMinX; nMinY = -20; nMaxY = 140; nDistY = nMaxY-nMinY; nXbarLength = 100; nYbarLength = 100; function xXYposition(nX, nY) { star_mc._x = nMinX+nX/(nXbarLength/nDistX); star_mc._y = nMinX+nX/(nXbarLength/nDistX)+50; } } Aを上下にドラッグするとstar_mcが斜めに動くようにしました。 このstar_mcを「クリックすると別のフレームへ移動できる」ボタンにしたいのですが、Button Clip等を使ってみてもうまくいきません(ポインタを上に持っていくと、カーソルが変わりはするが、クリックしても何も起こらない)。 詳しい方解決法をご教授ください。

    • ベストアンサー
    • Flash