Flashのフラッシュ宝箱のスライド式メニューとドラッグ&ドロップでグリッドに吸着がうまく動作しない問題について

このQ&Aのポイント
  • Flash宝箱のスライド式メニューとドラッグ&ドロップでグリッドに吸着がうまく動作しない問題について教えてください。
  • 具体的には、スライド式メニューと『glid.fla』を組み合わせたものを作りたいのですが、『glid.fla』が反応せずに正常に動作しません。
  • 解決策を考える上で、パスの設定やonClipEvent(load)の重複などに問題があるのかもしれません。質問者はFlash経験が浅く、MAXを久しぶりに使用しているそうです。
回答を見る
  • ベストアンサー

onClipEvent(load)かhitareaの問題かと・・・わからない

すいません。ちょっとややこしいですが 教えてほしいんのです。 「フラッシュ サンプル」でぐぐった一番最初のページの フラッシュ宝箱のこのページ(このページは感謝しまくりです) http://www.condo.fromc.jp/flash/memo/index.html の 5番目、スライド式メニューと『glid.fla』 3番目、ドラッグ&ドロップでグリッドに吸着『slide.fla』 をいっしょになったものを創りたいのです。 まずは、『slide.fla』をダウンして、 例えば、CONTENT2 の部分に 『glid.fla』を入れたいのです。 ですが、うごきません。 本来のスライドのはするのですが、 『glid.fla』はまったく反応しません。 たしかにどっちもonClipEvent(load){ から始まってるので、これが駄目なんだと思い slide.flaに swfを読み込ませばいいんだと勝手に解釈 CONTENT2 にムービークリップ(インスタンス=img)をいれて そこにonClipEventで『glid.swf』をよみこましました。 onClipEvent (load) { nMyNum = 2; nTotal = 4; nMinX = 60; nMaxX = 340; nDest = nMaxX; nDelay = 5; //ヒットエリアの設定 this.hitArea = button_mc3; ・・・・      img.loadMovie("glid.swf");←←← ですが・・swfは読み込むのですが、全く反応しません ドラッグできない以前にマウスが指マークにすらなりません。 これはナゼなんですか? FLASHは5しかつかったことなくて、 随分久しぶりにMAXを触ってます。 多分、パスの設定とか どちらもonClipEvent(load)が2つある事 その辺りだとおもうんですけど・・・ 気が付いてやったことは、 this.hitarea=button_mc は 帯の部分だけにしているます。 ほんとに参ってます。 どなたか、よろしくお願い致します。 (多分幼稚な事きいてるんだろうなと思ってます。)

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

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

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

幼稚なことなどではありません。難しい問題です ^^; まず、簡単な実験をしてみますと。 赤の丸を描いてボタンシンボルに変換し、「オーバー」のフレームでは、これを青に塗り替えます。 何の変哲もないボタンですから、カーソルを合わせると、赤い丸が青に変わります。 次に、このボタンのインスタンスを更にムービークリップに変換し、ボタンをムービークリップの入れ子にします。 この状態ではボタンは反応しますが、ムービークリップに on(press) アクションを設定すると、ボタンは反応しなくなります。 このボタンはムービークリップの一部でもあるので、親のムービークリップが press や release などのボタンとしての機能を利用している時は、ボタンの上でマウスを操作しても、Flash の内部では親のムービークリップで起きたイベントと見なされます。 ボタンではイベントそのものが起きていないことになりますから、ボタンは全く反応しなくなるというわけです。 ボタンとムービークリップを例にしましたが、ムービークリップ同士でも同じことです。 ムービークリップ CONTENT2 に img を作り、これに glid.swf を読み込むと、glid.swf が持っていたムービークリップやボタンは、全て img の子になります。 img は CONTENT2 の子です。 CONTENT2 に on(press) などのボタンイベントを利用するアクションが書かれていると、CONTENT2 の子になっているムービークリップやボタンではボタンイベントは検出されません。 ------------------------------------------------------ Flash 側からイベントが発行されない以上は、親がボタンイベントを使っていても、子の階層で擬似的にイベントを検出できる仕組みを考えなければなりません。 press や release イベントが発生した時にどんなことが起きているかを考えると、これらに代わる処理は何となく浮かんでくると思います。 press は”ムービークリップやボタンがクリックされた時”に起こるものです。 (この先は文章が複雑になるなので、ムービークリップだけで考えます) つまり、  ・マウスのボタンが押される  ・ムービークリップにカーソルが重なっている この2点が条件です。 では、release はどうでしょう。release イベントは、必ず press イベントが起きた後に発生します。 従って  ・マウスのボタンが押されて離された時に発生する  ・ムービークリップにカーソルが重なっている となります。 マウスボタンに関しては、ムービークリップの mouseDown や mouseUp イベントで検出できます。 ただ、これらのイベントはムービークリップの上でなくても発生するので、別途、カーソルがムービークリップの上にあるかどうかを判断しなければなりません。 ムービークリップとカーソルが重なっているかどうかは、衝突判定をとる hitTest で何とかなりそうです。 擬似 onPress 処理をスクリプトにしますと、 (↓各行頭に全角のスペースが入っています。コピーする際はご注意ください)  //擬似onPress処理  onClipEvent(mouseDown)  {   //カーソルと重なっていたら、pressイベント発生と見なす   if( this.hitTest( _root._xmouse , _root._ymouse , true ) )   {    /*ここにpressイベント発生時の処理を書く*/   }  } こんな感じになります。 ところで、ドラッグは release の他に、releaseOutside イベントも利用することがあります。 releaseOutside とは、press と同様にムービークリップの上でマウスのボタンをクリックした後、ムービークリップ外でマウスのボタンが離された時に起こるイベントです。 release はカーソルとムービークリップが重なっていないと発生しませんが、releaseOutside ではカーソルが重なっていなくてもいいのですから、カーソルとの衝突判定をとる必要はありません。 つまり、このどちらかのイベントが起きた時にドラッグを終了するのであれば、  ・press イベントが発生した後(ドラッグ中)である  ・マウスのボタンが離された この2点の条件が揃った時に、ドラッグをやめればいいことになります。 そこで、変数(フラグといいます)を1つ用意し、ドラッグを開始した時に、ドラッグ中であるという記録を残します。 ドラッグ中かどうかだけ分かればいいので、値は true と false で充分です。 この変数を見ると、ドラッグ中だったかどうかが分かります。mouseUp イベントが起きた時は、ドラッグ中の場合だけ、ドラッグをやめればいいわけです。 まとめますと、glid.swf のムービークリップに書くスクリプトは、大体、次のようになります。 slide.swf に読み込んだ時に on(press) や on(relase,releaseOutside) は意味をなくしてしまいますので、コメントにしておくといいでしょう。 ドラッグ中かどうかの情報を保持する変数は drag_flg としています。 onClipeEvent(load) の中で、  //ドラッグフラグ  //ドラッグ中true、それ以外はfalse  drag_flg = false; というように初期化をしてください。  //擬似onPress処理  onClipEvent(mouseDown)  {   //カーソルと重なっていたら、pressイベント発生と見なす   if( this.hitTest( _root._xmouse , _root._ymouse , true ) )   {    //ドラッグ開始    this.startDrag();    //ドラッグ中であることを記録    this.drag_flg = true;   }  }  //擬似onRelease・onReleaseOutside処理  onClipEvent(mouseUp)  {   //ドラッグ中だった時のみ、release・releaseOutsideイベント時と同じ処理を実行   if( this.drag_flg )   {    //ドラッグ終了    this.stopDrag();    //ドラッグフラグをクリア    this.drag_flg = false;    /*ここに、ドラッグ終了時に実行する処理を書く*/   }  } glid.swf のムービークリップをドラッグはできますが、手のひらカーソルには変わりません。 手のひらカーソルに変わるのはボタンイベントが起きた時だけなので、仕方ありませんね。 どうしてもというのなら、カスタムカーソルのムービークリップを用意し、glid.swf のムービークリップを動かしている時だけ、カーソルを消してカスタムカーソルを表示するといった方法になるかと思います。 長くなってすみませんでした。 不明な点がありましたら、補足してください。

deepimpact
質問者

お礼

すごい!!!!!!!!!!!!!!!!!!!!! ここまで解説していただけると お礼だけでいいのかな?と思ってしまいます。 これまで疑問に思ってた内容も随分クリアになりました。 本当にありがとうございます。 すごすぎる。

関連するQ&A

  • 外部テキストを読み込んで外部swfを表示

    flashの中に外部テキストに指示されたswfを読めるようにしたいのです。 今、試しているのが、 外部のテキスト(pics.txt)の中は pict="51.swf"と書いて flaには onClipEvent (load) { this.loadVariables(”pics.txt”); } onClipEvent (data) { myPict=pict; myStage.loadMovie(myPict); } とやってみたのですが、ぜんぜんダメでした。 どうしたもんでしょう? よろしくお願いいたします。

    • ベストアンサー
    • Flash
  • フラッシュMXのナウローディングとロードムービー

    最近フラッシュMXをウインドウズXPで使い始めています。質問です。よろしくお願いします。 フラッシュで a.swf に b.swfを読み込ませたいと思っています。b.swfにはナウローディングをつけています。 b.swfの最初につけたナウローディングスクリプトです。 onClipEvent (load) { _root.stop(); var LoaderMC = _root; } onClipEvent (enterFrame) { this.percentloaded = Math.floor(LoaderMC.getBytesLoaded()/LoaderMC.getBytesTotal()*100); trace(this.percentloaded+"%"); this.percentMC.percentdisplay = percentloaded+"%"; this.loaderbalken._xscale = percentloaded; if (percentloaded == 100 && !initialized) { initialized = true; trace("ロード終了"); _root.gotoAndPlay("loadok"); } } a.swfにb.swfを読み込むために、a.swfに次のスクリプトをつけています。 loadMovie("b.swf", "***"); 読み込まれることは読み込まれるのですが、b.swfのローディング画面でストップしてしまい、それ以降b.swfは再生されません。 a.swfに配置してあるアニメは問題なく再生されているのですが。ちなみにb.swfは単体では正常にナウローディング後、再生されます。 なぜ b.swfは再生が止まってしまうのでしょうか。よろしくお願いします。

  • 外部swfファイルの読み込みについて

    外部ファイルの読み込みができません。 _root  →content(MC)   →top(MC) といった具合にメインフレームにcontent(MC)、content(MC)の中にtop(MC)を設置しています。 次に、top(MC)の中にload_mc(MC)・load_mc2(MC)を置いていて、それぞれにinfo_img.swf・info_img2.swfを読み込ませたいのですが上手く行きません・・・どのような方法でロードすれば良いのでしょうか? 上手く説明できてないかもしれませんが、誰か教えてください。お願いいたします。

    • ベストアンサー
    • Flash
  • 変数で外部のswfファイルを読み込む…

    今、オールFLASHのサイトを作っていて、メニューバーをアクションスクリプトで下から上にスライドするように作ってます。 メニューhome.flaファイルの中のmenu_back_mcというムービークリップに作ってあります。その中のスクリプトは sliderという、タイムラインの中にslide_mcというムービークリップを作っててます。 参考書を参考に作ったのですが現時点では、slide_mcの中にbtnとpicに分けて、 btn部分にスクリプトを書いてduplicateMovieClipで複製するようになっていて、メニューをクリックすると、getURLで飛ぶように設定されてます。 この部分をhome.flaファイル内にscreen_mcに外部swfを変数で読み込ませて、各コンテンツに飛ぶように設定したいのですが、どういうふうに変えたらいいかわかりますか…? 因みに環境はFLASH MX 2004、OSはXPです。 宜しくお願いします。 必要であれば、スクリプトを載せます。宜しくお願いします。

  • onClipEvent (load)でリンク先を指定ウインドウ(フレーム)に開くには?

    本に載ってたスライドするメニューを利用してやってみたんですが、ボタンをクリックしたときのURLのジャンプ先を指定ウインドウ(フレーム内の右側フレーム:フレーム名migi)にしたいんです。 メニューの.swfはフレームhidariにおいてます。 スクリプトは下記のように書いてあって、これに、 urls[0] = "abc.html","migi"; ↑というように、 ,"migi" をつけてもジャンプは同フレーム(hidari)に なってしまってできませんでした。 どういうふうに指定すればいいかわかりますか? このスクリプトだと、getURLは使えないですよね? どなたかわかりましたら教えてください。 よろしくお願いします。 (↓スクリプト) onClipEvent (enterFrame) { nowY = _root._ymouse; if (drag) { // ドラッグ処理 posSlide = startSlideY + ( nowY - startY ); Diff = nowY - oldY; oldY = nowY; } else { // 非ドラッグ処理 posSlide = this._y + Diff - 1; Diff = Diff * 0.9; } // 折り返し処理 if (posSlide <= -pic_width*pics) { posSlide = posSlide + pic_width*pics; } else if (posSlide > 0) { posSlide = posSlide - pic_width*pics; } this._y = posSlide; } onClipEvent (load) { // ドラッグ状態の有無 drag = 0;      // リンク先 urls = new Array(); urls[0] = "abc.html"; urls[1] = "def.html"; urls[2] = "ghi.html"; // イメージの枚数 pics = 3; // イメージの縦幅 pic_width = 75; // Y軸方向の移動量 Diff = 200;           (以下つづく…)

    • ベストアンサー
    • Flash
  • mcの中のフレームラベルの移動

    初めまして。 当方初心者なので、よくわからないので、質問させていただきます。 外部にswfとしてフレームラベルの複数ついたものがあって、 それをmc(mcs_mc)で読み込みし、スクリプトで一定時間毎に mcに読み込んだ外部swfのフレームラベル(chapter1~chapter10)を移動させたいのですが、うまく動いてくれません。 どの用にしたらよいでしょう?よろしくお願いします。 onClipEvent(load){ this._lockroot = true; } onClipEvent(enterFrame){ setInterval( function(){ mcs_mc.gotoAndPlay("chapter2"); }, 1000); }

    • ベストアンサー
    • Flash
  • 外部swfの読込について

    1枚のFlashに二つの外部swfを読み込む方法を教えて下さい。 今参考書を見ながらやってみたのですが外部ファイルが読み込まれていないようで 書き出したswfファイルには何も表示されません。 試した方法ですが・・・ 外部swfファイル読込用ムービークリップを作成、 オブジェクトアクションを挿入 --------------------------------- onClipEvent (load) { function Load (file) {  this.loadMovie (file);   } } --------------------------------- フレームを作成し下記アクション挿入 --------------------------------- contents_mc.Load("about.swf") --------------------------------- 使用ソフトはFlash5です。 どうぞ宜しくお願いします。

    • ベストアンサー
    • Flash
  • フレーム上からonClipEvent(load){をしていするには

    onClipEvent(load){ this._x = 0; this._y = 0; } というASをフレーム上から書くときはどの様に書けば良いのでしょうか? _root.MC.onEnterFrame = function(){ の様なかたちでやってみたのですがダメだったのですが、上記の様な事がしたい場合どの様にすれば良いのでしょうか。 ご教授ください。よろしくお願いします。

    • ベストアンサー
    • Flash
  • 外部ファイルのフレームラベルにリンクをさせたい。

    こんにちわ。 色々、探してみましたが、頭がこんがらがってしまい、時間ばかりが過ぎて行くので質問させていただきます。 外部ファイルのフレームラベルにリンクをさせたいのですが、どなたかご存じの方ご教授ください。 flame.swfを読み込んだときは自動的にcontents1.swf→contents2.swfと進み、ボタンをクリックすると 指定されたフレームラベルにリンクさせたいのです。 色々試してみたのですが、うまく外部ファイルが読み込めなかったりボタンが機能しない状態です。 flame.swf contents1.swf contents2.swf flame.fla  kazari   ボタンの飾りグラフィクが置いてある。  button1-1 1-1(contents1.swf内1-1フレームラベルにリンクするボタン)  button1-2 1-2(contents1.swf内1-2フレームラベルにリンクするボタン)  button2-1 2-1(contents2.swf内2-1フレームラベルにリンクするボタン)  button2-1 2-2(contents2.swf内2-2フレームラベルにリンクするボタン)  mytarget mytarget(movie clip。ここにcontents1.swfもしくはcontents2.swfを読み込ませる) 1 フレーム目のアクションスクリプトに stop(); button1-1のボタンスクリプトに on (release) { gotoAndPlay("1-1"); /コメント:フレームラベル1-1にボタン飾りがあるため同じシーン内の「1-1」に行くように/ } 1 フレーム目のmytargetアクションスクリプトに onClipEvent (load) { loadMovieNum("contents1.swf", 1); } フレームラベル1-1のmytargetアクションスクリプトに onClipEvent (load) { this.mytarget.loadMovie("contents1.swf" , 1); flg='contents1.swfのフレームラベル'; } contennts1(2).fla 1フレーム目のアクションスクリプトに stop(); gotoAndPlay(flg); 環境:Max OS 10.3.6 Flash8

    • ベストアンサー
    • Flash
  • 外部の画像をボタンとして使用

    オンマウスで画像が変わるボタンを作成したいのですが、 使用する画像を外部ファイルにしたところうまく動作しません。 ボタン用のMCを設置し、MCアクションに以下のように記述しましたが 画像は表示されませんでした。 onClipEvent (load) {  filename = "images/button.gif";  loadMovie(filename,this); } どこをどう直せば画像を読み込めるようになりますか? ※FLASH CS3 / AS2.0です ※画像のパスは正しい事を確認しています。

    • ベストアンサー
    • Flash