• ベストアンサー

mcのドラッグ操作について

mcのドラッグ制御で悩んでいます。 よく公開されているサンプルでは写真などのmcがり、写真mcを右にドラッグすると写真mc自体も右にスライドしますが、 写真mcを右ドラッグをすると写真mcが左にスライドする仕様を作りたいと思っています。 当方初心者なので詳しくご教授頂けると幸いです。 開発環境はCS3、AS2.0で開発しています。 よろしくお願いします。

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

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

  • ベストアンサー
  • BlurFiltan
  • ベストアンサー率91% (1611/1754)
回答No.1

> 写真mcを右ドラッグをすると写真mcが左にスライドする そういうものをあまり見かけたことがありませんが, こんな感じ↓でしょうか。 新規ドキュメント(ActionScript2.0)を作成して, 次のように書いて(コピペして), パブリッシュ(AS2.0 FlashPlayer8 以上)などをするだけで 一応のサンプルはできます。 ////////////////////////////////////////////////////// // ---仮にスクリプトでMC「p_mc」を作成するだけです------ // 実際は写真をMCに変換してもOKです var _mc:MovieClip = this.createEmptyMovieClip("p_mc", 0); _mc._x = Stage.width/2; _mc._y = Stage.height/2; _mc.beginFill(0x0099FF); _mc.moveTo(-Stage.width/6, -Stage.height/6); _mc.lineTo(Stage.width/6, -Stage.height/6); _mc.lineTo(Stage.width/6, Stage.height/6); _mc.lineTo(-Stage.width/6, Stage.height/6); _mc.endFill(); // -------------------------------------------- // p_mc をマウスで押したときの動作を定義 p_mc.onPress = function() { // そのときのマウスの座標を記録 this.mou_x = _root._xmouse; // そのときのこのMCの座標を記録 this.my_x = this._x; // --- // マウスが動いたときの動作を定義 this.onMouseMove = function() { // マウスが動いた分だけ逆向きに移動 this._x = this.my_x+this.mou_x-_root._xmouse; // 移動の制限(不要であれば削除) if (this._x>Stage.width-this._width/2) { this._x = Stage.width-this._width/2; } else if (this._x<this._width/2) { this._x = this._width/2; } // 即更新 updateAfterEvent(); }; // --- }; // p_mc からマウスを放したときの動作を定義 p_mc.onRelease = function() { // マウスが動いたときの動作定義を削除 delete this.onMouseMove; }; // p_mc を外で放したときの動作を定義 p_mc.onReleaseOutside = p_mc.onRelease; ////////////////////////////////////////////////////// ちなみに..., > 写真mcを右ドラッグをすると写真mcが左にスライドする というのとはちょっと違いますが, こんな感じ↓のでしたらよく見ますね。 ///////////////////////////////////////////////////////// // ---仮にスクリプトでMC「p_mc」を作成するだけです------ // 実際は写真をMCに変換してもOKです var _mc:MovieClip = this.createEmptyMovieClip("p_mc", 0); _mc._x = Stage.width/2; _mc._y = Stage.height/2; _mc.beginFill(0x0099FF); _mc.moveTo(-Stage.width/6, -Stage.height/6); _mc.lineTo(Stage.width/6, -Stage.height/6); _mc.lineTo(Stage.width/6, Stage.height/6); _mc.lineTo(-Stage.width/6, Stage.height/6); _mc.endFill(); // ---仮にスクリプトでテキストフィールドを作成するだけです--- var _txt:TextField = this.createTextField("c_txt", 1, 0, 0, 0, 0); _txt.autoSize = true; _txt.selectable = false; _txt.text = ""; // -------------------------------------------- // 最高速度の設定 var spd:Number = 20; // p_mc をマウスで押したときの動作を定義 p_mc.onPress = function() { // そのときのマウスの座標を記録 this.mou_x = _root._xmouse; // マウスを消す Mouse.hide(); // --- // 1フレーム進むごとに随時実行する関数を定義 this.onEnterFrame = function() { // 代用マウスの表示と座標指定 if (this.mou_x>_root._xmouse+2) { c_txt.text = "←◎))"; } else if (this.mou_x<_root._xmouse-2) { c_txt.text = "((◎→"; } else { c_txt.text = "((◎))"; } c_txt._x = _root._xmouse-c_txt._width/2; c_txt._y = _root._ymouse-c_txt._height/2; // // マウスが動いた量を算出して5で割る this.idou = (_root._xmouse-this.mou_x)/5; // 上限を ±spd 内に押さえる if (this.idou>spd || this.idou<-spd) { this.idou = spd*this.idou/Math.abs(this.idou); } // マウスが動いた分だけ逆向きに移動 this._x -= this.idou; // 移動の制限(不要であれば削除) if (this._x>Stage.width-this._width/2) { this._x = Stage.width-this._width/2; } else if (this._x<this._width/2) { this._x = this._width/2; } }; // --- }; // p_mc からマウスを放したときの動作を定義 p_mc.onRelease = function() { // 1フレーム進むごとに随時実行する関数を削除 delete this.onEnterFrame; // マウスを出す Mouse.show(); // 代用マウスを消す c_txt.text = ""; }; // p_mc を外で放したときの動作を定義 p_mc.onReleaseOutside = p_mc.onRelease; /////////////////////////////////////////////////////////

gardens64
質問者

お礼

BlurFiltan様ご回答ありがとうございます。 私のつたない質問を理解して頂いたと共に、素晴らしいサンプルをご教授頂けた事に大変感激しております。 丁寧にコメントを挿入して頂いたおかげで、初心者の私でも理解することができました。 また、フレームアクションのみで上記サンプルができることに、驚きと刺激を受けました。これを機に今まで以上に勉強に励みたいと思います。 度々このサイトで質問することがあると思いますが、機会があれば再度ご教授頂ければ幸いと思います。 ありがとうございました。

関連するQ&A

  • ポインタをmcに追随させるには?

    ポインタをmcに追随させるには? mcをスライドさせるTween使用のas2サンプルを、 クリックをロールオーバーにして、クリックにリンクを設定するものにアレンジ。 [フレーム] import mx.utils.Delegate; import caurina.transitions.Tweener; function tw(_x1:Number,_x2:Number,_x3:Number,_mc1:MovieClip,_mc2:MovieClip,_mc3:MovieClip):Void{ Tweener.addTween (_mc1,{_x:_x1,_y:80,time:2,transition:"easeOutBack"}); Tweener.addTween (_mc2,{_x:_x2,_y:80,time:2,transition:"easeOutBack"}); Tweener.addTween (_mc3,{_x:_x3,_y:80,time:2,transition:"easeOutBack"}); } panel01_mc.onRollOver = Delegate.create (this,function():Void{ tw (200,300,100,panel01_mc,panel02_mc,panel03_mc); }); panel02_mc.onRollOver = Delegate.create (this,function():Void{ tw (100,200,300,panel01_mc,panel02_mc,panel03_mc); }); panel03_mc.onRollOver = Delegate.create (this,function():Void{ tw (300,100,200,panel01_mc,panel02_mc,panel03_mc); }); [ムービークリップ] on(rollOver){ topDepth = _parent.getNextHighestDepth(); this.swapDepths(topDepth); } on(release){ getURL("index.html"); } 問題は、前面中央にスライドするmcに連動して、 中央からスライドする別のmcにポインタが反応(ロールオーバー)すること。 ロールオーバーでmcがスライドした際、 ともにポインタを自動的に追随させる方法がありましたらお教えください。 もちろん別の解決方法があれば、そちらの方をお教えいただければ助かります。 当方はas3ではタイムラインのコントロールもおぼつかないレベルです。

  • スライダをドラッグして変数を吐き出させる方法

    MacOSX FlashMX2004環境です。 オリジナルのスクロールバーを製作して、 そのドラック位置によって変数を吐き出させる仕組みを作りたいのですが、迷宮入りしてしまい質問させていただきました。 よろしくお願いいたします。 恥ずかしながら、オリジナルのスクロールバーの作り方もわかっていません。原理はなんとなく頭に浮かぶのですが、どう書けばいいのか困っています。 内容は、 小さなMC(最初は左端)[以下スライダ]を右にドラッグするとドラックした分だけ、 上にある別のMCが動くという仕組みです。 スライダを右にドラッグした分の数字が変数 pNum に吐き出され、 スライダを左にドラッグした分の数字も変数 pNum に吐き出される。 吐き出したい変数は1から150です。 一番左端の時は1、右端の時は150としたいです。 スライダは左端~右端まで130pxのみ動かしたい。 スライダを使わずに上にある別のMCが動いてもスライダが動いて欲しい。(上にある別のMCとスライダを連動させたい) お時間よろしい方がおられましたら、 助けていただけませんか? お願いいたします。

    • ベストアンサー
    • Flash
  • ドラッグ中の回転を止めたいのですが…

    ドラッグができて,なおかつクリックすると90度回転するようにするため,サンプル集を見てムービークリップ(sikaku_mc)に 次のようなアクションスクリプト(以下AS)を書きました。 もともと解説にあったのですが,これだとドラッグしている最中も 回転してしまいます。クリックすると回転しても ドラッグしているときは回転しないようにするためにはどうすればいいでしょうか。 ちなみにこのASはムービークリップ(sikaku_mc)の編集画面のタイムラインに書き込んだものです。 function onPress() { this.startDrag(false); var xm:Number = this._xmouse; var ym:Number = this._ymouse; this._x = _root._xmouse; this._y = _root._ymouse; sikaku_mc._x -= xm; sikaku_mc._y -= ym; this.onEnterFrame = mawasu; this.onMouseMove = updateStage; } function updateStage() { updateAfterEvent(); } function mawasu() { this._rotation += 90; } this.onRelease = this.onReleaseOutside=stopDragMe; function stopDragMe() { this.stopDrag(); delete this.onEnterFrame; delete this.onMouseMove; } ご教授よろしくお願いします。

    • ベストアンサー
    • Flash
  • ドラッグの調子が悪いです

    エクスプローラなどでファイルやフォルダをマウス左ボタンでドラッグしていると途中でそのファイルやフォルダがかなりの確立で消えてしまいます。(ファイル自体が無くなるわけではありません。) 何が悪いのでしょうか?。 マウス右ボタンで出てくる切り取り、コピー、貼り付けを使えば問題ないのですが、やはりドラッグ&ドロップの方が作業が早いので何とか直したいです。 OSはWindowsNT4.0です。よろしくお願いします。

  • MCを最背面に表示したい+ムービーの方向・速さを変えたい

    こんばんは。 FLASHアクションスクリプトで、以下のスクリプトを利用して、 背景にものが動いているムービーを作りたいと思っております。 ↓ライブラリにあるMCをコピーする http://hakuhin.hp.infoseek.co.jp/main/as/movieclip.html#MOVIECLIP_07 こちらのスクリプトは問題なく動作したのですが、 スクリプトの内容が把握できず、困っております。 3つのご質問がございます。 (1)質問1 シーン1の上部レイヤーに違うオブジェクトを配置しており、 その下のレイヤーに上記のMCを配置しているのですが、 再生すると上記MCの方が上レイヤーのオブジェクトより前に表示されてしまいます。 このMCを最背面に表示させたいと考えております。 (2)質問2 MCの動きをもうちょっと早くしたいと思っております。 (3)質問3 上記サンプルMCでは、左から右へ移動しているのですが、 これを、下から上へ移動させたいと考えております。 スクリプトのどの部分で操作するのか教えていただける方いらっしゃいますでしょうか? 以下、作業環境です。 ----------------------------- WinXP FLASH8 ----------------------------- どうか、よろしくお願い致します。

  • MC内から_rootへのgotoAndPlay

    初めての投稿です。 宜しくお願い致しますm(__)m FlashCS3、AS2.0を利用です。 _rootで15個位のレイヤーに分け格レイヤーにMCを置き、その中でオブジェクトの制御を行うにホームページのトップ画面を作りました。 ASを1フレーム目に記述するとバグが発生する可能性があると聞いたので、 _rootのみASは2フレーム目に記述したので、ホームページのトップとしては_rootの2フレームしか使っていません。 _rootに swfの読み込み。 stop(); var loader = new MovieClipLoader (); loader.loadClip("Window_scroll.swf", _root.Window_Pic_MC); レイヤーの1つにmp3を読み込み、再生停止の制御を行うMC。 があります。 _rootにMC(1)があり、その中のMC(2)をボタンとして利用していて、 on (rollOver) { this._parent.swapDepths(95); this._parent.gotoAndPlay("n1"); } on (rollOut, releaseOutside) { this._parent.swapDepths(-1); this._parent.gotoAndPlay("n2"); } on (release) { _root.gotoAndPlay("m"); } とMC(2)に直接打ち込んでいます。 "m"が_rootの3フレームから10フレームまでで、 on (release)されるとMC(2)自体が小さくなるように モーショントゥーンで作っています。 そこで質問なのですが、 読み込んだswfの上に別レイヤーでWindowの枠があり、 MC(2)がon (release)時にswfの映像が消えて、 枠が大きくなる様にしたいのですが動いてくれません。 しかも swfも消えなく、小さくなったMC(1)を再度クリックすると 音が再度読み込まれ2重になって流れます。。。 この時微妙に枠が大きくなったり、アルファをかけてあるMC等の色が 濃くなったりするので、全てが2重になっているのかもしれません。 これはバグなのか。。。 長々とスミマセン!! 質問が多くなってしまったので、 _rootのMC(1)の中にあるMC(2)をon (release)した時、_rootにある枠が 大きくなる方法を教えて下さい。 宜しくお願い致します。

    • ベストアンサー
    • Flash
  • 異なるドライブ間におけるファイルの左ドラッグがコピーになる仕様を変更するアプリ

    普通、異なるドライブにファイルを左ドラッグしドロップするとコピーになります。「右ドラッグ→移動」や「SHIFT+左ドラッグ」などの操作を行えば移動することは可能ですが、どちらも左ドラッグより面倒なので左ドラッグで移動を標準操作にしたいです。 色々調べた結果XPの設定を変更することでこの仕様を変更する方法は見つかりませんでした。 そこで、これを実現する常駐アプリなどをご存知の方がいましたらご教授をよろしくお願いします。

  • FlashのMCに複数の動作をつけるためには

    ムービークリップに スクリプト(以下(1)(2))をつけたいのですが、 そのスクリプトを別々(フレームやムービークリップ)に設定しているためか、 思うような動きを出すことができません。 同じフレームにスクリプトを書くことができれば 解決できると思うのですがそれができなくて・・・。 私の考えるイメージは以下の通りです・・・。 (1)フレーム上に赤の四角□(R_mc1、R_mc2)と白の四角□(W_mc1、W_mc2)のムービークリップ(MC)があります。 (2)赤のMCはドラッグすることができ、ドラッグしたMCは他のMCに重なると常に上に表示される。 (3)ドラッグした赤のMCが白のMCにヒットすれば(重なれば)、赤から黄へと色が変わる。  (そのために、赤のMC内のタイムラインには、フレーム1に赤、フレーム2に白、フレーム3に黄色の四角□を置いて、ヒットすればMC内のフレーム3にいくようにする。) (4)赤の四角□をドラッグせずにクリックだけをした場合は、MC内のフレーム2に行き、赤から白に色が変わる。 (5)リセットボタンをクリックすると、赤や黄のMCが元の位置に戻る。(最初のMCに戻る) 環境は、Flash Professional CS5.5 Action Script 2.0   Flash Player10 です。 以下はフレームに書いたスクリプト(1)です。 //--------------------------- //深度カウント用変数を用意 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内をフレーム3で停止 this.gotoAndStop(3); } else { //★それ以外はドラッグ中のMC内をフレーム1で停止 this.gotoAndStop(1); } } //--------------------------- 以下はR_mc1とR_mc2自体に書いたスクリプト(2)です。  R_mcをクリックしたときに白色になるようにR_mc 内のフレーム2(白い四角□)に行くようにしてあります。 (本当は、上記に示したフレームに書くスクリプト(1)に加えて書かなければいけないのだと思うのですが、その書き方がわからないので、R_mc自体に書いています。) //--------------------------- on (release) { this.gotoAndPlay(2); } //--------------------------- 以上のようなスクリプト(1)(2)にすると、赤のMC(R_mc1、R_mc2)をドラッグすると、スクリプト(1)ではなく、スクリプト(2)が優先されて、赤から黄にしたいのに、白に変わってしまうのです。 上記の私の考えるイメージ(1)~(5)が実行できるようなフレームに書くスクリプトを教えてください。 どうぞよろしくお願いいたします。 補足 リセットボタンには以下のスクリプトを書いてあります。    リセットボタンは同じフレーム内にスクリプトを書かずに、リセットボタン自体に書いてもかまいません。 //------------------ on (release) { //変数 i に 1~2を入れながらループ for (i=1; i<=2; i++) { //「R_mc○」を削除 this["R_mc"+i].removeMovieClip(); } gotoAndStop(1); gotoAndStop(2); } //------------------

    • ベストアンサー
    • Flash
  • BLADE MSRはどこがすごい?

    BLADE MSRと似たようなヘリはワルケラ以外からも色々と出ているようですね。 そして、どのヘリもどれかを真似たのかヘリ界の常識なのか似たような形をしています。 そういう中で、BLADE MSRはすばらしいという評価を得ていますよね。 技術的にはどこがすばらしいのでしょうか? ヘッドの構造? 軽さ? それともスティック操作に対して、単純にサーボが動いているわけではなく、 すばらしいコンピューター制御がされている? (最近の腕前) ホバリングができるようになり、その後右旋回ばかり練習してました。 右ができるからといって、左がすぐにできるということはなく、左旋回も練習しました。 ここまで来ても、右スライド左スライドは怖くてさわれませんでしたが、それもできるようになりました。 送信機も初心者モードは卒業しました。機体もスワッシュプレートを上級者仕様に調整しました。

  • 別のSWFを操作

    お世話になっております。 質問させていただきます。 環境 ・Flash CS3 ・AS 2.0にて制作 まず下記のswfが同一ページにあったとします。 ・main.swf ・btn.swf この[btn.swf]を押したときに[main.swf]が2フレームまで進むようにする。としたら、どのようなasが必要でしょうか? 仕様上、[main.swf]の中に[btn.swf]の機能をもったmcを配置することは難しいのです。どうにかしてswfから別swfを操作したいのですが…。 やはりサーバに一回、情報送信とかしないとだめなのでしょうか…? 以上です。宜しくお願い致します。

    • ベストアンサー
    • Flash

専門家に質問してみよう