- ベストアンサー
ドラッグする記述
FLASH CS4 アクションスクリプト3.0で制作中です。 大変初歩的な質問なのですが、ムービークリップをドラッグする記述で困っています。 onDragを使用してひとつだけドラッグで動かすことはできたのですが、 他のムービークリップに同じ記述をすると 関数の定義が重複しています、とエラーが出てしまい、色々やってはみたものの対処法がわからず困っている次第です…。 大変お恥ずかしいですが、助言よろしくお願いいたします。 ちなみにドラッグしたいものがたくさんあるのですが(20個近く)、一挙に設定する方法はありますでしょうか。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
> onDragを使用して ActionScript には onDrag などという言葉は存在しないので何のことかわかりません。 === === === 仮に,メインのタイムライン上にある 「mc0」, 「mc1」, 「mc2」 というインスタンス名を付けたMCを 一気にドラッグしたいとします。 その場合次のようなスクリプトをメインのタイムラインのフレームに書けば一応できます。 ///////////////////////////////////////////////////////////////////// // ドラッグ対象MCのインスタンス名登録用オブジェクトを作成 var name_obj = new Object(); // インスタンス名を登録(例「mc0」「mc1」「mc2」) for (var i:int=0; i<=2; i++) { name_obj["mc"+i]=true; } // ステージにイベントリスナーを登録(マウスダウン時,実行関数onDown) stage.addEventListener(MouseEvent.MOUSE_DOWN,onDown); // 関数 onDown の定義 function onDown(evt:MouseEvent):void { // マウス座標のPointインスタンス pos を作成 var pos:Point=new Point(stage.mouseX,stage.mouseY); // 配列 lst に pos の下にあるオブジェクトを取得 var lst:Array=stage.getObjectsUnderPoint(pos); // 配列 lst の要素数分 ループ for (i=0; i < lst.length; i++) { // obj に pos の下にあるインスタンスを1つずつ取得 var obj:DisplayObject=lst[i].parent; // もし obj の名前が name_obj に登録されていれば if (name_obj[obj.name]) { // そのMC内の変数 down_flg を true にする MovieClip(obj).down_flg=true; // そのMC内の変数に現在のマウスの座標を記録 MovieClip(obj).down_x=obj.mouseX; MovieClip(obj).down_y=obj.mouseY; } } // ステージにイベントリスナーを登録(マウスムーブ時,実行関数onMove) stage.addEventListener(MouseEvent.MOUSE_MOVE,onMove); } // 関数 onMove の定義 function onMove(evt:MouseEvent):void { // インスタンス名を登録した name_obj 内を捜査 for (var str:String in name_obj) { // もし登録インスタンス内の変数 .down_flg が trueであれば if (this[str].down_flg) { // マウスに合わせてそのMCの座標を移動 this[str].x=stage.mouseX-this[str].down_x; this[str].y=stage.mouseY-this[str].down_y; } } // 表示を即更新 evt.updateAfterEvent(); } // ステージにイベントリスナーを登録(マウスアップ時,実行関数onUp) stage.addEventListener(MouseEvent.MOUSE_UP,onUp); // 関数 onUp の定義 function onUp(evt:MouseEvent):void { // インスタンス名を登録した name_obj 内を捜査 for (var str:String in name_obj) { // 登録インスタンス内の変数 .down_flg を false にする this[str].down_flg=false; } // ステージのイベントリスナーを削除(マウスムーブ時,実行関数onMove) stage.removeEventListener(MouseEvent.MOUSE_MOVE,onMove); } ///////////////////////////////////////////////////////////////////// インスタンス名がバラバラである場合は, // ドラッグ対象MCのインスタンス名登録用オブジェクトを作成 var name_obj = new Object(); // インスタンス名を登録 name_obj.ringo_mc = true; name_obj.mikan_mc = true; name_obj.ichigo_mc = true; のように全てを手動登録する必要があります。
お礼
お礼が遅くなってしまいました。 丁寧に回答いただきほんとうにありがとございました! 大きな勘違いをしていたようで;; 参考になりました。ありがとうございます^^