- ベストアンサー
ドラッグ&ドロップ
ドラッグ&ドロップして果物3個をお皿3つに吸着させたいのですが、 例えば、果物一つをまず、お皿一つどれかに吸着させた後2個目の果物が他の二つのお皿にドラッグ可能であることがわかるように果物をドラッグさせた時点でお皿の色が変わるようにしたいのです。最初の果物をどの皿にいれても、他の二皿が変わるようにするにはどうすればいいでしょうか? 説明がわかりにくいとは思いますがどうぞよろしくお願いします。flagやif文をつかえばいいのでしょうか?
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
#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に同じ事を書き続ける必要はなくなります。
その他の回答 (3)
- suzuki-_-
- ベストアンサー率77% (152/195)
■基本内容 ・一度お皿に置いたら移動できない ・お皿には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; } } } // 質問者さんが望んでるのはこんな感じですかね
お礼
ご回答ありがとうございます。 自分が思っていたようになりました。 本当ありがとうございました。
#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); } ----------------------------------------
補足
素早い回答ありがとうございます。 まだまだ、for文を自分で書けといわれても戸惑ってしまう状態で まだまだ勉強が足りないと痛感しております。 二個目の果物をお皿に置いたとき一個目の果物を置いた皿の色が変わってしまうんです。 この点が解消できればこの仕様でもいいのですが、 説明不足で思っていた動作と違う感じなのですが、回答して頂いているのに申し訳ないのですが、お時間ありましたらご回答頂けるとうれしいです。 一個目の果物をプレスした時点で、3皿にドラッグ可能である事がわかるように色を変えて、まず一個の果物を皿におきます。 二個目の果物をプレスした時、ほかの2皿にドラッグ可能である事がわかるように色を変えたいです。 よろしくお願いいたします。
皿の色を変える方法も色々ありますが, 私は色を変えるというのに,あまり着色スクリプトを使用しません。 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); } ---------------------------------------- こんな感じでいかがでしょうか。 果物は全て同じスクリプトで行けます。
お礼
とても分かりやすい回答ありがとうございます。 すごい勉強になりました。