• ベストアンサー

ドラッグ&ドロップ

ドラッグ&ドロップして果物3個をお皿3つに吸着させたいのですが、 例えば、果物一つをまず、お皿一つどれかに吸着させた後2個目の果物が他の二つのお皿にドラッグ可能であることがわかるように果物をドラッグさせた時点でお皿の色が変わるようにしたいのです。最初の果物をどの皿にいれても、他の二皿が変わるようにするにはどうすればいいでしょうか? 説明がわかりにくいとは思いますがどうぞよろしくお願いします。flagやif文をつかえばいいのでしょうか?

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

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

  • ベストアンサー
noname#35109
noname#35109
回答No.3

#1です。 > 一個目の果物をプレスした時点で、 > 3皿にドラッグ可能である事がわかるように色を変えて、 > まず一個の果物を皿におきます。 > 二個目の果物をプレスした時、 > ほかの2皿にドラッグ可能である事がわかるように > 色を変えたいです。 はは~ぁ,なるほど。 ちょっと難しいですね。 中学高校の 集合 や 余事象 なんかがが頭の中を回りますよ。 仮に, 皿 は「osara0」,「osara1」,「osara2」 の3枚があった場合です。 また,果物にもインスタンス名を付けます。 果物のインスタンス名は 「kudamono0」,「kudamono1」,「kudamono2」,「kudamono3」,「kudamono4」,の5個があった場合です。 各果物MCに書くスクリプトです。 ------------------------------------ onClipEvent (load) { // osara の枚数を登録 var o_num = 3; // kudamono の個数を登録 var k_num = 5; } // on (press) { // ドラッグ開始(中央に吸着) startDrag(this, true); // 全ての osara を フレーム2 に進ませる for (var i = 0; i<o_num; i++) { _root["osara"+i].gotoAndStop(2); } // もし,osara が kudamono のどれかとヒットしていれば for (var i = 0; i<o_num; i++) { for (var j = 0; j<k_num; j++) { if (_root["osara"+i].hitTest(_root["kudamono"+j])) { // その osara を フレーム1 へ _root["osara"+i].gotoAndStop(1); } } } } // on (release) { for (var i = 0; i<o_num; i++) { //ドラッグ中のMCの真下にosara? があれば if (_root["osara"+i].hitTest(_root._xmouse, _root._ymouse, true)) { // ドラッグ中のMCを osara? に吸着 this._x = _root["osara"+i]._x; this._y = _root["osara"+i]._y; } } // // 全ての osara を フレーム1 に進ませる for (var i = 0; i<o_num; i++) { _root["osara"+i].gotoAndStop(1); } // ドラッグ終了 stopDrag(); } // onClipEvent (mouseMove) { updateAfterEvent(); } ------------------------------------ これは, ActionScript が難しいのではなくて, 場合の数などを考える数学が難しいのだと思います。多分。 ActionScript では, hitTest (当たり判定)くらいが難しいかもしれません。 「当たり判定について」 http://hakuhin.hp.infoseek.co.jp/main/as/hittest.html 他は,VBA でも JavaScript でも何処にでも登場する for文 くらいですか。 http://isvalid.jp/actionscriptLab/ASlesson/actionsctipt_for.html ================== しかし, 上の通りだと果物MCに同じ事を書くのは労力とファイル容量の無駄ですし, どこか1箇所訂正したいときでも全ての果物MCのスクリプトを直す必要も出てきて, 間違いも起こりうるので, 果物MCには "何も書かず", 果物MC「kudamonno0」~「kudamono4」が存在する _root のフレームに, 次のように書いても良いです。 -------------------------- // osara の枚数を登録 var o_num = 3; // kudamono の個数を登録 var k_num = 5; // // for (i=0; i<k_num; i++) { _root["kudamono"+i].onPress = function() { // ドラッグ開始(中央に吸着) startDrag(this, true); // 全ての osara を フレーム2 に進ませる for (var i = 0; i<o_num; i++) { _root["osara"+i].gotoAndStop(2); } // もし,osara が kudamono のどれかとヒットしていれば for (var i = 0; i<o_num; i++) { for (var j = 0; j<k_num; j++) { if (_root["osara"+i].hitTest(_root["kudamono"+j])) { // その osara を フレーム1 へ _root["osara"+i].gotoAndStop(1); } } } }; } // for (i=0; i<k_num; i++) { _root["kudamono"+i].onRelease = function() { for (var i = 0; i<o_num; i++) { //ドラッグ中のMCの真下にosara? があれば if (_root["osara"+i].hitTest(_root._xmouse, _root._ymouse, true)) { // ドラッグ中のMCを osara? に吸着 this._x = _root["osara"+i]._x; this._y = _root["osara"+i]._y; } } // // 全ての osara を フレーム1 に進ませる for (var i = 0; i<o_num; i++) { _root["osara"+i].gotoAndStop(1); } // ドラッグ終了 stopDrag(); }; } // _root.onMouseMove = function() { updateAfterEvent(); }; -------------------------- ますます for文が増えますが, これで, 1つ1つの果物MCに同じ事を書き続ける必要はなくなります。

tomgreen
質問者

お礼

とても分かりやすい回答ありがとうございます。 すごい勉強になりました。

その他の回答 (3)

  • suzuki-_-
  • ベストアンサー率77% (152/195)
回答No.4

■基本内容 ・一度お皿に置いたら移動できない ・お皿には1つしか果物を置くことができない ・空いてるお皿は果物を持ったときにわかるよう見た目を変える ■構成 □果物MC3個 ・インスタンス名  fruit1 fruit2 fruit3 □お皿MC3枚 ・インスタンス名  plate1 plate2 plate3 ・AS  フレーム1 stop();(通常の状態)  フレーム2 (お皿におけるという意を表した状態) // 全て_root上に配置 _root上のフレームに以下を記述 // AllCtrl("START"); function STDrag() { startDrag(this, true); AllCtrl("PRESS"); } function ENDDrag() { stopDrag(); AllCtrl("END", this); } function AllCtrl(VAL, _fr) { for (var i = 1; i<=3; i++) { switch (VAL) { case "START" : this["fruit"+i].onPress = STDrag; this["fruit"+i].onRelease = ENDDrag; break; case "PRESS" : if (!this["plate"+i].exit) { this["plate"+i].gotoAndStop(2); } break; case "END" : var _pl = this["plate"+i]; if (_fr.hitTest(_pl) && !_pl.exit) { _pl.exit = true; _fr._x = _pl._x; _fr._y = _pl._y; delete _fr.onPress && delete _fr.onRelease; } _pl.gotoAndStop(1); break; } } } // 質問者さんが望んでるのはこんな感じですかね

tomgreen
質問者

お礼

ご回答ありがとうございます。 自分が思っていたようになりました。 本当ありがとうございました。

noname#35109
noname#35109
回答No.2

#1です。 すみません。 else文なんか使った所が間違いでした, #1のスクリプトのみ次のように訂正します。 ---------------------------------------- on (press) { // ドラッグ開始(中央に吸着) startDrag("", true); } on (release) { // 全ての osara のフレームを 1 でストップ for (var j = 0; j<=2; j++) { _root["osara"+j].gotoAndStop(1); } for (var i = 0; i<=2; i++) { //ドラッグ中のMCの真下にosara? があれば if (_root["osara"+i].hitTest(_root._xmouse, _root._ymouse, true)) { // ドラッグ中のMCを osara? に吸着 this._x = _root["osara"+i]._x; this._y = _root["osara"+i]._y; // 全ての osara のフレームを 2 に進めて for (var j = 0; j<=2; j++) { _root["osara"+j].gotoAndStop(2); } // この吸着した osara のみフレーム1 でストップ _root["osara"+i].gotoAndStop(1); } } // ドラッグ終了 stopDrag(); } onClipEvent (mouseMove) { updateAfterEvent(mouse); } ----------------------------------------

tomgreen
質問者

補足

素早い回答ありがとうございます。 まだまだ、for文を自分で書けといわれても戸惑ってしまう状態で まだまだ勉強が足りないと痛感しております。 二個目の果物をお皿に置いたとき一個目の果物を置いた皿の色が変わってしまうんです。 この点が解消できればこの仕様でもいいのですが、 説明不足で思っていた動作と違う感じなのですが、回答して頂いているのに申し訳ないのですが、お時間ありましたらご回答頂けるとうれしいです。 一個目の果物をプレスした時点で、3皿にドラッグ可能である事がわかるように色を変えて、まず一個の果物を皿におきます。 二個目の果物をプレスした時、ほかの2皿にドラッグ可能である事がわかるように色を変えたいです。 よろしくお願いいたします。

noname#35109
noname#35109
回答No.1

皿の色を変える方法も色々ありますが, 私は色を変えるというのに,あまり着色スクリプトを使用しません。 1つのムービークリップ内のフレーム1に 普通の状態のお皿を用意しておいて stop(); させておき, フレーム2 に光ったお皿などを描いておいて, 色を変えたいとき,フレーム2 に進ませます。 その方が自由自在,色々な色や形のお皿に変えられます。 また,色や形を変えられるだけでなく, フレーム2 にピカピカ光が点滅するようなMCを置いておくこともできます。 というわけで, お皿ムービークリップのフレームは 2 フレームにしておいて, フレーム1 で stop(); をかけておきます。 そして,3枚あるお皿には,それぞれ, 「osara0」,「osara1」,「osara2」 というインスタンス名を付けておきます。 ===================== 次にドラッグ&ドロップする果物のスクリプトですが, ドラッグ&ドロップ&吸着にも何通りかの方法があります。 これまた私の好きな方法で, ターゲットのお皿MCと果物MCとマウスが重なっていたら吸着というパターンのスクリプトで考えてみました。それが次の果物MCのスクリプトです。 ---------------------------------------- on (press) { // ドラッグ開始(中央に吸着) startDrag("", true); } on (release) { for (var i = 0; i<=2; i++) { //ドラッグ中のMCの真下にosara? があれば if (_root["osara"+i].hitTest(_root._xmouse, _root._ymouse, true)) { // ドラッグ中のMCを osara? に吸着 this._x = _root["osara"+i]._x; this._y = _root["osara"+i]._y; // 全ての osara のフレームを 2 に進めて for (var j = 0; j<=2; j++) { _root["osara"+j].gotoAndStop(2); } // この吸着した osara のみフレーム1 でストップ _root["osara"+i].gotoAndStop(1); } else { // 全ての osara のフレームを 1 でストップ for (var j = 0; j<=2; j++) { _root["osara"+j].gotoAndStop(1); } } } // ドラッグ終了 stopDrag(); } onClipEvent (mouseMove) { updateAfterEvent(mouse); } ---------------------------------------- こんな感じでいかがでしょうか。 果物は全て同じスクリプトで行けます。

関連するQ&A

  • 続ドラッグ&ドロップ

    前に回答頂いたのですが、 お皿に乗った果物の上にさらに置くことができてしまうところを 置けないようにしたいのですが、どのようにしたらいいでしょうか? もう1点なのですが、果物をお皿以外でreleaseしたら、果物の位置を 元の位置に戻にはどうしたらいいでしょうか? たいへん申し訳ないのですがよろしくお願いします。 onClipEvent (load) { // osara の枚数を登録 var o_num = 3; // kudamono の個数を登録 var k_num = 5; } // on (press) { // ドラッグ開始(中央に吸着) startDrag(this, true); // 全ての osara を フレーム2 に進ませる for (var i = 0; i<o_num; i++) { _root["osara"+i].gotoAndStop(2); } // もし,osara が kudamono のどれかとヒットしていれば for (var i = 0; i<o_num; i++) { for (var j = 0; j<k_num; j++) { if (_root["osara"+i].hitTest(_root["kudamono"+j])) { // その osara を フレーム1 へ _root["osara"+i].gotoAndStop(1); } } } } // on (release) { for (var i = 0; i<o_num; i++) { //ドラッグ中のMCの真下にosara? があれば if (_root["osara"+i].hitTest(_root._xmouse, _root._ymouse, true)) { // ドラッグ中のMCを osara? に吸着 this._x = _root["osara"+i]._x; this._y = _root["osara"+i]._y; } } // // 全ての osara を フレーム1 に進ませる for (var i = 0; i<o_num; i++) { _root["osara"+i].gotoAndStop(1); } // ドラッグ終了 stopDrag(); } // onClipEvent (mouseMove) { updateAfterEvent(); }

  • jQueryを用いたドラッグ&ドロップについて

    jQueryを用いてドラッグ&ドロップによって要素を移動できるプログラムを書いています。 draggableとdroppableによって「要素を移動しました」とメッセージを表示させる事は出来ましたが、ドロップした所へ要素をcloneでコピーし、appendで追加するとその要素はドラッグ出来ません。 その原因として、javascriptが読み込まれた後に生成された要素に対してjavascriptが機能しないからだと思っています。 目的としましては、 1.要素をドラッグ&ドロップで移動可能とし、  2.ドロップされた所へ要素を挿入し、 3.ドロップされた順番に整列を行い、 4.また他の要素内へドラッグ可能 とした機能を実現したいと考えています。 特に3番目の「ドロップされた要素をドロップした要素内に整列を行う」箇所に重点をおいています。 アドバイス宜しくお願いします。

  • ファイルのドラッグ&ドロップが出来なくなった

    ファイルのドラッグ&ドロップが出来なくなった とあるシステムにログインするため、IE8をアンインストールしてIE6にダウングレードしました (そのシステムがIE8に対応していないため)。 ところがその後、Windows上でファイルのドラッグ&ドロップが出来なくなってしまいました。 他のシステムやソフトは正常に動作していますし、マウスを交換してウィルス検索も行いましたが、 ダメでした。 どなたか原因のわかる方いらしゃいませんか? Windows XP SP3を使用しています。 よろしくお願いします。

  • jQueryでシンプルドラッグドロップがまずい

    Javascript,jQuery初心者です。主にWINDOWS7、GoogleChrome使用です。 jQueryでシンプルなドラッグドロップ自作をやってみました。 <!DOCTYPE html> <html> <head> <meta carset="utf-8"> <script src="js/jquery-1.11.0.min.js"></script> <style> #chr{ position:absolute; left:100px; top:100px; } </style> <body> <div id="msg"></div> <div id="chr"> <img src="parts/usl470.jpg"> </div> <script> dragflg=false; $("#chr").mousedown(function(){ dragflg=true; $("#msg").html("on")}) .mouseup(function(){ dragflg=false; $("#msg").html("up")}); $(window).mousemove(function(e){ if(dragflg) { $("#chr").css("left",e.clientX-20+"px") .css("top",e.clientY-20+"px"); } }); </script> </body> </head> </html> mousedown、mouseupの検出を確認するために、隅にon、upと表示するようにしてあります。 思惑通り、押すとon、離すとupが表示されますが、ドラッグドロップした後は、離している状態のupになってくれず、押さずに動かしても#chrはついてきてしまいます。まともなドラッグドロップと違い、もう1回クリックでやっと離してくれる、という具合です。  #chr上でボタンを離している時はそれを検出するんじゃないのか?と思ってしまうのですが、ついでに、ドラッグ動作自体も、移動禁止マークが出てちょっとおかしいし、詳しい人はどうやってこういう症状を回避してドラッグドロップの動作を実現しているのでしょうか?  ネットで見て回って参考にしようにも、短くてシンプルなjQueryのドラッグドロップのサンプルが見つからず、ここで何が間違いなのか意見を仰ごうと思ったものです。手っ取り早くjQueryUIを導入すれば、やりたいこと自体は出来るんでしょうけど、ボタン離していても検出できないのが何なのかは、すっきりしておきたいと思いました。どうかよろしくお願いします。

  • VC++でドラッグドロップ

    いつもお世話になっております。 今回はドラッグ&ドロップについてお聞きしたいです。 リストボックスにフォルダをドラッグしてそのフォルダの中身を リストに表示するというものを作りたく、ネットでいろいろ調べた所 以下のように作りました。 ResourceViewでドロップドラッグを許可にチェックを入れる case WM_CREATE:   DragAcceptFiles(::GetDlgItem(hWnd, IDC_LIST1), TRUE);   return TRUE; case WM_DROPFILES:   { // ドロップされた内容を取得   hdrop = (HDROP)wParam;   DWORD dwSize;   CHAR szPath[MAX_PATH+1];   ZeroMemory(szPath, sizeof(szPath));   int num = ::DragQueryFile(hdrop, -1, NULL, 0);   for (int i = 0; i < num; i++);{     dwSize = ::DragQueryFile(hdrop , i, szPath, MAX_PATH+1);     if (dwSize <= 0) //取得失敗     {       return FALSE;     }     else{ //以下にszPathから中身を表示させる処理 ・・・} 以上のようにするとドラッグしたファイルの数は 正しく取得しているのですがファイル名を得る関数部分で 1.i=0としているのに、最初からi=numの数になってしまう 2.二つ目のDragQueryFileのiを1にしても戻値(ファイル名のサイズ)は 0となって取得していない となってしまいます。 なぜこのようになってしまうのか、ご教授願います。 環境はVisual C++6.0 OSは windowsXP SP2です

  • 画像をドラッグ&ドロップで移動したい

    画像をドラッグ&ドロップで移動したいのですが、 DIV内でテキスト文だと移動できるのですが、画像だけだと移動できません(テキスト文と画像を入れるとテキスト文と一緒に画像が移動しますが、テキスト文なしの画像だけで移動させたいです。) 何故、画像だけでドラッグ&ドロップで移動させることができないのでしょうか?画像だけで移動させるにはどうしたらいいでしょうか? 宜しくお願いいたします。 IE7です。 <HTML> <HEAD><TITLE>画像をドラッグ&ドロップで移動したい</TITLE> </HEAD> <SCRIPT language="JavaScript"> var target; var isDrag=0; function document_onmousedown(){ isDrag=1; target=event.srcElement;} function document_onmousemove(){ if( isDrag ){ target.style.top=event.clientY; target.style.left=event.clientX;} } function document_onmouseup(){ isDrag=0; //alert(text1.style.top); //alert(event.srcElement); } </SCRIPT> <BODY onmousemove="document_onmousemove()" onmousedown= "document_onmousedown()" onmouseup="document_onmouseup()"> <DIV style="position:absolute;font-size:24px;cursor:hand; "> <img src="画像.gif"> </DIV> <BR> <BR></BODY></html>

  • サンダーバードのフォルダへのドラッグ&ドロップ

    メールソフトのサンダーバード5.0を使用しています。 受信トレイのメールを、左側に並んでいるフォルダにドラッグ&ドロップして振り分ける作業の際、Outlookのようにドロップの時にフォルダの色が反転しないので、振り分けたいフォルダが選択されているか、上下の他のフォルダに入ってしまわないか、非常にわかりにくいです。 (特に複数のメールを選択して振り分ける際) これを解決するアドオンや設定などご存じの方、いらっしゃいましたらご教授お願い致します。

  • ドラッグ&ドロップでコンテンツを移動させる。(scriptaculaus)

    お世話になります。 ドラッグ&ドロップでコンテンツを自由に並び替えができるものを作ろうとしております。 以下のソースでドラッグ&ドロップで並び替えが出来るのですが もう少し手を加えたいと思っております。 やりたい事 1.ドラッグ中(onmousedown状態)で、配置元の下に同じ大きさのボックス(破線:border-style: dashed)を表示。 2.ドラッグ中、順番が変化した時点(Sortable.createのonChange状態)で、配置先に選択した同じ大きさのボックス(破線:border-style: dashed)を表示。  かつ配置元で表示したボックスは消去。 つまりはgoogleのパーソナライズドホームと同じことが出来ればと思っております。 お忙しいところ申し訳ありませんが どうかご教授よろしくお願いいたします。 バージョン:scriptaculous-js-1.6.1 ソースを載せようと思ったら、文字数制限で引っかかってしましました。 のちに回答を頂いた後、補足で載せます。

  • ドラッグアンドドロップでファイルの移動しても無視される

    Windows98 SEでファイルの移動をドラッグアンドドロップすると、移動先のフォルダの色が変わりますが、その後無視されファイルの移動ができません。この現象はデスクトップ・フォルダ内などどの場面でもおきます。 どうすればファイルの移動ができるのか教えてください。!!

  • mcのドラッグアンドドロップ処理について

    現在、http://okwave.jp/qa3589973.htmlのドラッグアンドドロップを使用させて頂いております。 上記のスクリプトですと、mcからマウスを放したとき(falseのとき)、瞬時にmcの動作が止まるようになっているのですが、これを目的の座標に移動しつつゆっくりと止まっていくようにするには、どのようにスクリプトを書き換えればよいのでしょうか? また、このmcの中にボタンを配置してリンクを張る場合、どういった方法でスクリプトを書けばよいのかもお教え頂けると助かります。 お分かりの方がいらっしゃいましたらご教授いただけると幸いです。 よろしくお願い致します。 // この MC が表示されたとき onClipEvent (load) { // 重さの変数 weight を設定(変えてください) weight = 10; // ●x座標の最小値 min_x を設定(変えてください) min_x = 100; // ●x座標の最大値 max_x を設定(変えてください) max_x = 300; // ●y座標の最小値 min_y を設定(変えてください) min_y = 50; // ●y座標の最大値 max_y を設定(変えてください) max_y = 350; // クリックしたかどうかの変数 click_flag を false にする click_flag = false; } // この MC を押したとき on (press) { // クリックしたかどうかの変数 click_flag を true にする click_flag = true; // ★押した座標を保存 pos_x = this._xmouse; pos_y = this._ymouse; } // この MC をとにかく放したとき on (release, releaseOutside) { // クリックしたかどうかの変数 click_flag を false にする click_flag = false; } // 1フレーム進む時間毎に随時実行 onClipEvent (enterFrame) { // click_flag が true の時だけ if (click_flag) { // この座標を 1/weight ずつ ★マウス座標-押した座標 に近づける this._x += (_root._xmouse-pos_x-this._x)/weight; this._y += (_root._ymouse-pos_y-this._y)/weight; // ●設定した x座標最小値以下の場合 if (this._x<=min_x) { this._x = min_x; } // ●設定した x座標最大値以上の場合 if (this._x>=max_x) { this._x = max_x; } // ●設定した y座標最小値以下の場合 if (this._y<=min_y) { this._y = min_y; } // ●設定した y座標最大値以上の場合 if (this._y>=max_y) { this._y = max_y; } } }

    • ベストアンサー
    • Flash

専門家に質問してみよう