• 締切済み

続ドラッグ&ドロップ

前に回答頂いたのですが、 お皿に乗った果物の上にさらに置くことができてしまうところを 置けないようにしたいのですが、どのようにしたらいいでしょうか? もう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(); }

  • Flash
  • 回答数3
  • ありがとう数0

みんなの回答

noname#35109
noname#35109
回答No.3

#2です。 > 1一度果物をお皿に置いて、その果物を持っても > 同じお皿に置けるにしたいと思っています。 なるほど, 同じお皿に置けるつもりでしたが,そうなっていませんでしたね。 これは次の 2 と 3 によって解消しました。 > 2お皿上以外でマウスを離しても > 戻るようにしたいと思っています。 これが少し難しかったです。 本当はフラグを使いたくなかったので, なるべくフラグを使わない方向にしていましたが, どうも使わないと詰まるようになったので, フラグである,「adh_flg」という変数を登場させてなんとかできるようにしました。 下のスクリプトで,変更点に ★ 印をつけました。 > 3最初に果物を一個皿に一度置いて > それを持ち上げた瞬間は、3皿にドラッグ可能なので、 > そのときは3皿光るようにしたい。 これは簡単。  if (_root["osara"+i].hitTest(_root["kudamono"+j]) && !_root["osara"+i].hitTest(this)) {     // その osara を フレーム1 へ     _root["osara"+i].gotoAndStop(1);  } 条件をプラスしただけです。 下のスクリプトで,変更点に ★★ 印を付けました。 というわけでスクリプト。 kudamono0 ~ kudamono? のムービークリップに書くスクリプトです。 ---------------------- onClipEvent (load) { // osara の枚数を登録 var o_num = 3; // kudamono の個数を登録 var k_num = 5; // 最初の座標の記録 var my_x = this._x; var my_y = this._y; // 吸着(adhesion)フラグ(flag)の初期値 ★ var adh_flg = 0; } // on (press) { // 吸着フラグ を 0 にする ★ var adh_flg = 0; // ドラッグ開始(中央に吸着) startDrag(this, true); // 全ての osara を フレーム2 に進ませる for (var i = 0; i<o_num; i++) { _root["osara"+i].gotoAndStop(2); } // もし,osara が kudamono のどれかとヒットしていれば // なおかつ この果物とその osara がヒットしていなければ ★★ for (var i = 0; i<o_num; i++) { for (var j = 0; j<k_num; j++) { if (_root["osara"+i].hitTest(_root["kudamono"+j]) && !_root["osara"+i].hitTest(this)) { // その osara を フレーム1 へ _root["osara"+i].gotoAndStop(1); } } } } // // MC上もしくはその他でマウスアップしたとき on (release, releaseOutside) { for (var i = 0; i<o_num; i++) { // ドラッグ中のMCの真下にosara? があって if (_root["osara"+i].hitTest(_root._xmouse, _root._ymouse, true)) { // なおかつ osara? のフレームが 2 の場合 if (_root["osara"+i]._currentframe == 2) { // ドラッグ中のMCを osara? に吸着 this._x = _root["osara"+i]._x; this._y = _root["osara"+i]._y; // 吸着フラグ を 1 にする ★ var adh_flg = 1; } } } // もしこの果物がどの皿とも吸着していなければ ★ if (adh_flg == 0) { // 座標を元に戻す this._x = my_x; this._y = my_y; } // // 全ての osara を フレーム1 に進ませる for (var i = 0; i<o_num; i++) { _root["osara"+i].gotoAndStop(1); } // ドラッグ終了 stopDrag(); } // onClipEvent (mouseMove) { updateAfterEvent(); } ----------------------------------- と,こんな感じでしょうか。 答えてくださる必要はありませんが, しかし,一体これは何に使えるのでしょうか(笑)。 回答するために, こちらでも作っているわけですが, 作りながら, 何を作ろうとされているんだろう? トランプの ポーカー でもスピードでもないし, 何を一生懸命にされているんだろう? と,フツフツ疑問が湧いてきます。 自分でも作りながら作ったもので遊んでみて, 結構面白く楽しめるのですが, その面白さより,何コレ??? という不思議さの方おかしくて,笑えてしまいます。

noname#35109
noname#35109
回答No.2

前回回答した者ですが, こんな感じでしょうか。 ★印の部分のみを修正しました。 -------------------------------- onClipEvent (load) { // osara の枚数を登録 var o_num = 3; // kudamono の個数を登録 var k_num = 5; // 最初の座標の記録★ var my_x = this._x; var my_y = this._y; } // 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); } } } } // // MC上もしくはその他でマウスアップしたとき★ on (release, releaseOutside) { for (var i = 0; i<o_num; i++) { // ドラッグ中のMCの真下にosara? があって★ if (_root["osara"+i].hitTest(_root._xmouse, _root._ymouse, true)) { // なおかつ osara? のフレームが 2 の場合★ if (_root["osara"+i]._currentframe == 2) { // ドラッグ中のMCを osara? に吸着 this._x = _root["osara"+i]._x; this._y = _root["osara"+i]._y; } else { // それ以外の場合は座標を元に戻す★ this._x = my_x; this._y = my_y; } } } // // 全ての osara を フレーム1 に進ませる for (var i = 0; i<o_num; i++) { _root["osara"+i].gotoAndStop(1); } // ドラッグ終了 stopDrag(); } // onClipEvent (mouseMove) { updateAfterEvent(); } -------------------------------- ActionScript が難しいのではなくて, 「どういう状況の場合どうしたいのか」 という「場合の数」のようなものが少し難しいのです。 > お皿に乗った果物の上にさらに置くことが > できてしまうところを置けないようにしたい この状況をよく考えます。 ドラッグ中の果物からマウスを放したとき, お皿に先に果物が乗っている状況であれば, お皿ムービークリップ内のタイムラインのフレームは, フレーム1で光っていない状態のはずです。 ここから,  もし お皿が光っていれば   →そのまま吸着  もし お皿が光っていなければ   →元の位置に戻す 言いかえると  もし お皿がフレーム2であれば   →そのまま吸着  もし お皿がフレーム1であれば   →元の位置に戻す というプログラムが考えられます。 ここまでが主にプログラミングに当たります。 そして次に, そのプログラムを実際にActionScript に コーディング すれば良いわけです。 (※ コーディング=プログラムを具体的なプログラムコードにすること。コード・イング。) すると次のようになります。  // osara? のフレームが 2 の場合  if (_root["osara"+i]._currentframe == 2) {     // ドラッグ中のMCを osara? に吸着     this._x = _root["osara"+i]._x;     this._y = _root["osara"+i]._y;  } else {  // それ以外の場合は座標を元に戻す     this._x = my_x;     this._y = my_y;  } my_x と my_y という変数は, その果物ムービークリップが表示されたとき, その初期位置を記録しておいた変数です。  onClipEvent (load) {    // 最初の座標の記録    var my_x = this._x;    var my_y = this._y;  }

tomgreen
質問者

補足

ありがとうございます。 なるほど、初期位置を記録しておいた変数を使うのですね。 徐々に理解できてきたのですが、 1一度果物をお皿に置いて、その果物を持っても同じお皿に置けるにしたいと思っています。 2お皿上以外でマウスを離しても戻るようにしたいと思っています。 3最初に果物を一個皿に一度置いてそれを持ち上げた瞬間は、3皿にドラッグ可能なので、そのときは3皿光るようにしたい。2個目だと、持ち上げた瞬間は2皿にドラッグ可能なので2皿光るようにしたいと思っています。 本当に何度もお答え頂いていて、補足質問ばかりで申し訳ないのですが お願いできますでしょうか?

  • perse
  • ベストアンサー率74% (113/152)
回答No.1

>元の位置に戻にはどうしたらいいでしょうか? 元の位置のxy座標を覚えて置けばいいのです。 あとはrelease時に覚えておいた座標に移動させるだけです。 onClipEvent(load)で変数x,yを定義して var x var y on(press)時に x = this._x y = this._y on(release)時に this._x = x this._y = y ですね。 >置くことができてしまうところを置けないようにしたいのですが 前回の質問のことは知らないのですが「置けないようにしたい」が 元の位置に戻したいという意味ならもう解決ですね。 それ以外なら補足願います。

関連するQ&A

  • for文での配列の書き方で質問です

    CS3でゲームを作っています。 レモンが31個あり落ちてくるのをうけとります。 この受け取るときのfor文に以下のように書きました。 lemon_s.lemon0.hana.kajituの0~30までを参照したいのですが 配列のところがわかりません。 _root["lemon_s.lemon"] + i+["hana.kajitu"] というのがたぶん違っていてうまくいかないのだと思いますが 正しい書き方を教えてください。 onClipEvent (enterFrame) { for (i = 0; i < 30; i++) { if (this.in_ok.hitTest (_root["lemon_s.lemon"] + i+["hana.kajitu"])) { _root.point++; trace (_root.point); _root["lemon_s.lemon"] + i+["hana"].gotoAndStop (3); } } }

  • ドラッグしたときの当たり判定

    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でドラッグしたMCをリセットして戻すには

     今回もまたFlashのことで教えてください。 先日教えていただいた「ドラッグしたMCを常に上に表示&色の変化」がきちんと動作できて とても助かりましたが、また、新たな課題が出たので教えて下さい。(これまでできていたリセットボタンがうまく動作しなくなっちゃったのです。) 具体的に言うと、つまずいている課題は以下の通りです。  ドラッグして移動したMCを元の位置(フレーム上の最初にあった位置)に戻すために「リセットボタン」を配置しましたが、このボタンでリセットしてもなぜかドラッグして移動したMCもそのまま残った状態で表示されるのです。つまり、完全リセットされないのです。  ドラッグしたMCが元の位置に戻り、ドラッグする以前のフレームが表示されるようにしたいのでどうか教えてください。 私が書いたスクリプトとタイムラインを示しますので、どうぞよろしくお願いいたします。 バージョン Flash CS5.5    アクションスクリプト2.0     Flash Player 6 です。   フレーム1とフレーム2があり、フレーム1はフレーム2に進むためのボタンを配置。 フレーム2には赤の□2つ。白の□2つを配置。 フレーム2に書いたスクリプト(1)は以下の通り (ドラッグしたMCが常に上に表示&色の変化をさせるスクリプト) (赤の□のインスタンス名「R_mc1」「R_mc2」   白の□のインスタンス名「W_mc1」「W_mc2」 ) //--------------------------- //深度カウント用変数を用意 var dep_cnt:Number = 1; //変数 i に 1~2 を入れながらループ for (var i:Number = 1; i<=2; i++) { //★「R_mc○」内の再生を停止 this["R_mc"+i].stop(); //★「R_mc○」内の変数 target_mc に「W_mc○」の参照を代入 this["R_mc"+i].target_mc = this["W_mc"+i]; //「R_mc○」押下時に関数 dragMC を実行 this["R_mc"+i].onPress = dragMC; //「R_mc○」を放した時に関数 dropMC を実行 this["R_mc"+i].onRelease = dropMC; //「R_mc○」をMC外で放した時にも関数 dropMC を実行 this["R_mc"+i].onReleaseOutside = dropMC; } //関数 dragMC の定義 function dragMC():Void { //深度カウント用変数をカウントアップ dep_cnt++; //押下されたMCをその深度に移動 this.swapDepths(dep_cnt); //押下されたMCのドラッグを開始 this.startDrag(); //★マウスが動く度に関数 watchHitW_mc を実行 this.onMouseMove = watchHitW_mc; } //関数 dropMC の定義 function dropMC():Void { //放されたMCのドラッグを終了 this.stopDrag(); //★マウスが動く度に関数 watchHitW_mc を実行するのを解除 delete this.onMouseMove; } //★関数 watchHitW_mc の定義 function watchHitW_mc():Void { //★ドラッグ中のMCがそのMC内の変数 target_mc に // 代入したMCとヒットしていれば if (this.hitTest(this.target_mc)) { //★ドラッグ中のMC内をフレーム2で停止 this.gotoAndStop(2); } else { //★それ以外はドラッグ中のMC内をフレーム1で停止 this.gotoAndStop(1); } } //--------------------------- ドラッグしたMCを元の位置に戻すための「リセットボタン」に書いたスクリプト(2)は以下の通り。 (以前に以下のようなスクリプトで元の配置にリセットされたので同じく書いてみましたが、今回はドラッグしたMCが消えず、そのまま表示されてしまいました。 //--------------------------- on (release) { gotoAndPlay(1); } on (release) { gotoAndStop(2); } //---------------------------  

    • ベストアンサー
    • Flash
  • actionscript1.0でJPGを読み込んでるところをSWFに、

    actionscript1.0でJPGを読み込んでるところをSWFに、、、 初心者のため良く分からないため質問いたします。 FLAを開くと設定はFlashのactionscript1.0 パブリッシュ設定がFlash Player8.0でした。 現在上記設定で下記scriptが書かれているものをFlashCS4で開いています。 そして現在3つのJPGを読み込んでいるのですが、そこをSWFに変更したいと考えています。 現在はAS1.0ですが、これを機会にAS3.0に変えたいとも考えています。 どう調べていいか分からないので質問させていただきました。 質問自体よく分からないかもしれませんが、非常に困っています。 よろしくお願いいたします。 onClipEvent (load) { Pass = "img_top_flash/"; Timer = _root.Sec*30; cnt = 0; this._y = 300; //元はthis._y = -20; this.loadVariables( Pass + "top_flash_url.txt"); function loadJPG() { _root.Loaded = false; cnt = 0; if (num == Max) { num = 0; } else if (num<0) { num = Max-1; } depth++; if (depth>1) { _root.mc["m"+(depth-2)].removeMovieClip(); } navi.slider._alpha = 100; mcName = "m"+depth; _root.mc.attachMovie("pic",mcName,depth); _root.mc[mcName].fileName = Pass+picArray[num]+".jpg"; for (i = 0; i < Max; i++) { if (i == num) { navi.mc["b"+i].gotoAndStop(2); } else { navi.mc["b"+i].gotoAndStop(1); } } } } onClipEvent (data) { picArray = files.split(","); Max = picArray.length; for (i = 0; i < Max; i++) { mcName = "b"+i; navi.mc.attachMovie("navi_btn",mcName,i); navi.mc[mcName].num = i; navi.mc[mcName]._x = i*20; } navi.mc.attachMovie("sankaku","sankaku",Max); navi.mc.sankaku._x = Max*20; num = depth = 0; loadJPG(); } onClipEvent (enterFrame) { if (Max>1 && _root.Loaded) { //this._y -= this._y/4; this._y -= this._y/100; if ( this._y <= 280 ) { this._y = 280; } navi.slider._x += (num*20-navi.slider._x)/_root.spd; navi.slider._alpha += (50-navi.slider._alpha)/_root.spd; cnt++; if (cnt>Timer) { num++; loadJPG(); } } }

    • ベストアンサー
    • Flash
  • ドロップ先のターゲットパスの指定について.

    いつもお世話になっております.今回はドラッグ&ドロップに関して質問です.以下に記述されているASの間違った部分の修正をお願いします. やりたいことは「mc1~80をドラッグでき.back1~80のどれにでもドロップできる」といったことです. 現在,以下のASでうまく機能していることは,ドラッグ&ドロップできるがbcak1~80に吸着されない....といったところです. どうか解決のほどよろしくお願いします. for(i=0; i<=80; i++) { _root["mc"+i].onPress = function(){ this.startDrag (true); } } for(i=0; i<=80; i++) { _root["mc"+i].onMouseUp = function(){ if (this._droptarget == _root["back"+i]) { this._x = _root["back"+i]._x; this._y = _root["back"+i]._y; } stopDrag (); } } for(i=0; i<=80; i++) { _root["mc"+i].onMouseMove = function(){ updateAfterEvent(); } }

    • ベストアンサー
    • Flash
  • 良いソースの書き方について(複数のインスタンスをまとめてヒットテストする方法)

    ■例文: ---------------------------------------------------------------- onClipEvent (enterFrame) { if ( this.hitTest(_root.char1)) { _parent.nextFrame(); } else if ( this.hitTest(_root.char2)) { _parent.nextFrame(); } else if ( this.hitTest(_root.char3)) { _parent.nextFrame(); } else if ( this.hitTest(_root.char4)) { _parent.nextFrame(); } else if ( this.hitTest(_root.char5)) { _parent.nextFrame(); } else if ( this.hitTest(_root.char6)) { _parent.nextFrame(); } else if ( this.hitTest(_root.char7)) { _parent.nextFrame(); } else if ( this.hitTest(_root.char8)) { _parent.nextFrame(); } else if ( this.hitTest(_root.char9)) { _parent.nextFrame(); } else if ( this.hitTest(_root.char10)) { _parent.nextFrame(); } else if ( this.hitTest(_root.char11)) { _parent.nextFrame(); } } ---------------------------------------------------------------- 上記は、_root.char1 から_root.char11までインタンス名をつけたムービークリップとのヒット確認をするアクションスクリプトです。 こういう動作をしたい場合。 for文を駆使する等で、ソースを短くまとめる方法はありませんでしょうか。 いい案がありましたら、是非ご教授の程宜しくお願い致します。

    • ベストアンサー
    • Flash
  • for文の変数の扱いについて

    お世話になります。ムービー1及びムービー2が領域に来たらムービーBを 表示するというアクションスクリプトを作成しています。 領域をryouiki 移動するムービーがmovie1とmovie2 表示されるムービーをmovieB としています。下記のように作成したのですが。 onClipEvent (enterFrame) { for (i=1;i<=2;i++){ moviex="movie" + i; _root.onoff = this.hitTest(_root.[moviex]); _root.movieB._visible = _root.onoff; } } 演算子の後にはフィールド名が必要です。とのエラーメッセージ が表示されます。 _root.onoff = this.hitTest(_root.moviex1) という風に修正すると、無事動くので、変数の扱いがおかしいの だと思うのですが。 よろしくお願いいたします。

    • ベストアンサー
    • Flash
  • 条件式の中に入れるとムービークリップが動作しない。

    条件式の中に入れるとムービークリップが動作しない。 またまた、悩みにはまってしまいました。 初期状態で、ボタンのムービークリップを全て、ラベルreadyの静止画像に設定し、 クリックされたときに、そのボタンのラベルhitに移動して、 そこに設定されたムービークリップの動作をさせようとしています。 以下のようなアクションスプリクトを書きましたが、 hitに移動するものの、hitに設定したムービークリップの、 1フレーム目の静止画像しか表示されません。 試しに6行目の_root[buttonName].gotoAndStop("ready"); のreadyをhitに変えると、hitラベルのムービークリップが動作します。 原因は何なのでしょうか??? ////////////////////////////////////////////////////////// var onMapButton_num = 0; onEnterFrame = function () { var buttonName = "onMapButton" + onMapButton_num + "_mc"; for ( var i:Number = 1; i < 6; i++) { // 初期設定 buttonName = "onMapButton" + i + "_mc"; _root[buttonName].gotoAndStop("ready"); //ボタンをすべて ready に } for ( var i:Number = 1; i < 6; i++) { // アクション if ( onMapButton_num== i ) { // ボタンが押された場合 buttonName = "onMapButton" + i + "_mc"; _root[buttonName].gotoAndStop("hit");     // ヒットしたボタンを hit に } } }; // ボタン(1~5)のアクションと 番号の取得 ////////////////////////////////// onMapButton1_mc.onRelease = function() { onMapButton_num = 1; }; onMapButton2_mc.onRelease = function() { onMapButton_num = 2; }; onMapButton3_mc.onRelease = function() { onMapButton_num = 3; }; onMapButton4_mc.onRelease = function() { onMapButton_num = 4; }; onMapButton5_mc.onRelease = function() { onMapButton_num = 5; }; stop();

  • 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です

  • Now Loadingから次のフレームに行かない

    Flash8です。 1フレームに全体のサイズを読み込むスクリプト ------------------------- this.onEnterFrame = function() { nParcent = (_root.getBytesLoaded()/_root.getBytesTotal())*100; if (nParcent == 100) { _root.play(); delete this.onEnterFrame; } }; _root.stop(); ------------------------- と、%を数字で表記するためのスクリプト ------------------------- onClipEvent (enterFrame) { num = Math.floor(_root.getBytesLoaded()/_root.getBytesTotal()*100); _root.nowloading.percent = num+"%"; } ------------------------- を入れていて、100%読み込んだら次のフレームより開始(再生)したいのですけど、 現状読み込んで(数字も0から100に上がって行って)、100%になった状態でストップして再生しません。 何が足りないのでしょうか? アドバイスお願いします!

専門家に質問してみよう