• 締切済み

【as3】クリックでインスタンスを増やしたい

Actionscript初心者です。 勉強のため、以下のURLにあるActionscript2.0のFlashをActionscript3.0に書き換えたいと思っています。 http://allabout.co.jp/gm/gc/66814/ 左側にリースのパーツ、右に素のままのリースが配置されています。パーツはそれぞれ、リボン付きベル(インスタンス名「bellBig」)、松ぼっくり (インスタンス名「matu」)、小さいベル(インスタンス名「bellSmall」)と指定してあります。この3つのアイテムをドラッグドロップすることでリースを飾り付けていきます。 インスタンスをドラッグ&ドロップする所まではできたのですが、 松ぼっくりと小さいベルをドラッグした際にインスタンスを複製するところでつまずいています。 あまりにも初歩的な質問で恐縮ですが、ご教授お願いいたします。 /*////////////////////大きいベル/////////////////////*/ // ドラッグ開始 bellBig.addEventListener(MouseEvent.MOUSE_DOWN,mouseDown1); function mouseDown1(event:MouseEvent):void{ bellBig.startDrag(); } // ドラッグ終了 bellBig.addEventListener(MouseEvent.MOUSE_UP,mouseUp1); function mouseUp1(event:MouseEvent):void{ bellBig.stopDrag(); } /*////////////////////まつぼっくり/////////////////////*/ // ドラッグ開始 matu.addEventListener(MouseEvent.MOUSE_DOWN,mouseDown); function mouseDown(event:MouseEvent):void{ matu.startDrag(); } //ドラッグ終了 matu.addEventListener(MouseEvent.MOUSE_UP,mouseUp); function mouseUp(event:MouseEvent):void{ matu.stopDrag(); } /*////////////////////小さいベル/////////////////////*/ // ドラッグ開始 bellSmall.addEventListener(MouseEvent.MOUSE_DOWN,mouseDown2); function mouseDown2(event:MouseEvent):void{ bellSmall.startDrag(); } // ドラッグ終了 bellSmall.addEventListener(MouseEvent.MOUSE_UP,mouseUp2); function mouseUp2(event:MouseEvent):void{ bellSmall.stopDrag(); }

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

みんなの回答

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

なるべく元のサンプルと同じことを なるべく元と同じような方法で なるべく簡単にするなら次のような感じになると思います。 以下の説明ではマツボックリを代表にします。 まず元のサンプル(act46.fla)で パブリッシュ設定 の スクリプト 設定を ActionScript 3.0 にして, root(メインのタイムライン) の フレーム1 に書かれているスクリプト count = 1; これを次のように変更します。 var count:uint = 1; 次に 「ライブラリ」で マツボックリのムービークリップシンボル「matu」 を選択して 右クリックなどから「プロパティ」で「シンボルプロパティ」パネルを表示させ, リンケージ の欄で  □ ActionScript 用に書き出し にチェックを入れ,  クラス(C):[       ] の欄でクラス名を付けます。 ここでは例えば 「Matu」 というクラス名を付けることにします(【下図】↓)。 そして ライブラリ内のシンボルの「matu」でも良いですし ステージ上のインスタンス「matu」でも良いので, そのムービークリップ内のタイムラインの編集に入ります。 ムービークリップ内のタイムラインは1レイヤーだけなので スクリプトを書くレイヤーでも追加して2レイヤーにし その新レイヤーの フレーム1 に次のようなスクリプトを書きます。 ----------------------------- // ドラッグ開始 this.addEventListener(MouseEvent.MOUSE_DOWN,mouseDown); function mouseDown(event:MouseEvent):void { root["matu" + root.count] = new Matu(); root["matu" + root.count].x = this.x; root["matu" + root.count].y = this.y; root.addChild(root["matu" + root.count]); this.startDrag(); } //ドラッグ終了 this.addEventListener(MouseEvent.MOUSE_UP,mouseUp); function mouseUp(event:MouseEvent):void { this.stopDrag(); root.count++; } ----------------------------- 以上でマツボックリに関しての作業は終わりです。 考え方や使い方によってはスクリプトの書く場所やその内容なども変わると思いまが そういった無数の場合は書けませんし ある程度の場合は書けたとしても問題がややこしくなるので 「なるべく元と同じ」 を尊重したものを回答しました。

ukkyi33
質問者

補足

たいへん親切で丁寧な説明ありがとうございます。 教えていただいたものを参考に、自分なりにスクリプトを書いてみました。 addChildでインスタンスを増やすところまではできたのですが、 今度は増えたインスタンスをドラッグ&ドロップできるようにできませんでした。 var count:uint = 1; count++ の使い方がわかっていないようです。 度々で申し訳ございませんが、もう一度ご教授お願いいたします。 ----------------------------------- //インスタンスの作成 var newMatu:MovieClip = new Matu(); var count:uint = 1; //プロパティの設定 newMatu.x = 50; newMatu.y = 180; //イベント処理 matu.addEventListener(MouseEvent.MOUSE_DOWN,mouseDown); function mouseDown(evt:MouseEvent):void{ matu.startDrag(); addChild(newMatu); } matu.addEventListener(MouseEvent.MOUSE_UP,mouseUp); function mouseUp(evtt:MouseEvent):void{ matu.stopDrag(); root.count++; } -----------------------------------

関連するQ&A

  • 複数生成したムービーの中のムービーはドラッグ移動できないようにしたい。

    複数生成したムービーの中のムービーはドラッグ移動できないようにしたい。 環境はActionScript3.0です。 chipというシンボルからdotMC+連番というインスタンスを複数生成しながら ドラッグできるようにして、その中にeditMC+連番というインスタンスを 生成しました。 ところがdotMC+連番はドラッグできるのですが、editMC+連番もドラッグすると それ単体で移動してしまいます。 おそらくevent.targetにしているのでeditMC+連番単体でも 動いてしまうのでしょうが、それを動かないようにできないでしょうか。 宜しくお願いします。 for(var j=0; j<10; j++) { var dotMC:chip = new chip(); dotMC.name="dotMC"+j; addChild(dotMC); dotMC.addEventListener(MouseEvent.MOUSE_DOWN, chipMCmove); dotMC.addEventListener(MouseEvent.MOUSE_UP, chipMCStop); var editMC:edit = new edit(); editMC.name="editMC"+j; chipMC.addChild(editMC); } //▼▼▼▼▼▼▼ドラッグ可能にする function chipMCmove(event:MouseEvent):void { event.target.startDrag(); } function chipMCStop(event:MouseEvent):void { event.target.stopDrag(); }

    • ベストアンサー
    • Flash
  • ActionScript 3.0 D&Dの実装

    ステージ上に、インスタンス20個配置し (addChildは使わずに、普通に最初から置きます。  インスタンス名は mc1 ~ mc20)  それぞれをドラッグアンドドロップで自由に動かしたいです。 以下のようにプログラムを書いたのですが いざドラッグしようとすると 「TypeError: Error #1006: value は関数ではありません at MethodInfo-1()」 っとエラーが出てしまいました。 っと出てしまいました。 一体何が原因でしょうか? また、解決方法がありましたら是非ともよろしくお願いします。 addEventListener(MouseEvent.MOUSE_OVER,getname); function getname(e:MouseEvent) {    var str= e.target.name; trace(str); //マウスカーソルを乗せたムービークリップのインスタンス名が出ます。 addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown); function onMouseDown(e:MouseEvent) { str.startDrag(); } addEventListener(MouseEvent.MOUSE_UP, onMouseUp); function onMouseUp(e:MouseEvent) { str.stopDrag(); } }

    • ベストアンサー
    • Flash
  • AS3.0でマウスボタンの状態を調べたいのですが、良い方法はないでしょうか

    AS3.0になって、releaseOutsideに相当するものがなく、マウスボタンが領域外で離されたことを取得できず困っています。 いろいろ調べてみたんですが、良い方法が見つかりません。 作っているのはドラッグ&ドロップのスクリプトです。 startDrag()した後、領域外で離されたときにもstopDrag()できるように、stageに対してMOUSE_UPをリスナー登録しています。 my_mc.stage.addEventListener(MouseEvent.MOUSE_UP,onMouseUp); function onMouseUp(event:MouseEvent):void { my_mc.stopDrag(); my_mc.stage.removeEventListener(MouseEvent.MOUSE_UP,onMouseUp); } 通常はこれでうまくいくんだと思いますが、今作っているものには、ステージに選択可能テキストフィールドがあります。 ドラッグ中にそのテキストフィールドの上でマウスボタンを離すと、stageにMOUSE_UPイベントが発生しないようで、stopDrag()が働かず、マウスボタンを離していても、my_mcがくっついてきてしまいます。 ソーテック社の「Flash ActionScript3.0入門ノート」を購入してAS3.0の勉強をしているのですが、そのドラッグ&ドロップのパッケージ(SimpleDrag2.as)でも、選択可能テキストフィールドを置くと、同じ不具合が出てしまいます。 AS2.0では、releaseOutsideを使っていてうまくいきました。 マウスボタンの状態を取得する方法があれば、ENTER_FRAMEで状態を見張って、stopDrag()することもできると思うのですが、状態を取得する方法が見つかりません。 AS3.0で確実にstopDrag()できる方法をご存知でしたら、教えてください。 よろしくお願いいたします。

  • 連番のインスタンス名をつけたMCの処理 (配列アクセス演算子)

    Adobe Flash CS3、AS3.0の環境で作成しております。 インスタンス名に、btn1~btn10までの連番で名前をつけたMCを、ドラッグ&ドロップできるようにしたいのですが、簡潔に設定を行いたいと思い、配列アクセス演算子を使用すればよいのでは、と思い、下記のように記述したのですが、ドラッグしようとした時点で、「TypeError: Error #1010: 条件は未定義であり、プロパティがありません。」のエラーが出ます。 //--------------------------------------------- for (var i=1; i<=10; i++) { this["btn"+i].buttonMode = true; this["btn"+i].addEventListener(MouseEvent.MOUSE_DOWN, down); this["btn"+i].addEventListener(MouseEvent.MOUSE_UP, up); } function down(eventObject:MouseEvent):void { this["btn"+i].startDrag(); } function up(evnetObject:MouseEvent):void { this["btn"+i].stopDrag(); } //--------------------------------------------- 問題切り分けのために、マウス操作があったときの動作を、単なるtrace等にしてみると問題なく動作するので、function~部分の  this["btn"+i] の記述が問題だというのはわかるのですが、ここの正しい記述方法がわからず、行き詰まっております。ご教示いただけませんでしょうか。

    • ベストアンサー
    • Flash
  • Flash 外部から読み込んだ画像ファイル(png)の扱いについて

    閲覧ありがとうございます。 当方プログラム初心者です。 swfファイルと同じフォルダに置いた画像ファイル(test.png)を読み込んだ後、それをドラッグ&ドロップしたり、何個も生成するということをしたいと考えています。 読み込んで1度だけ表示することはできました。 しかし、ドラッグ&ドロップしようとすると、LoaderクラスにはstartDrop()メソッド、stopDropメソッドは無いという旨のエラーが 出ます。 画像ファイルを外部から読み込んだ後に、それを自由に操るには何かに変換しなければいけないのでしょうか? 読み込んだものをクラスにするということはできますか? //以下ソースです。 var pictLdr1:Loader = new Loader(); var pictURL1:String = "test.png"; var pictURLReq1:URLRequest = new URLRequest(pictURL1); pictLdr1.load(pictURLReq1); haikei.addChild(pictLdr1); pictLdr1.x = 10;   pictLdr1.y = 10; pictLdr1.addEventListener(MouseEvent.MOUSE_DOWN, pickup); pictLdr1.addEventListener(MouseEvent.MOUSE_UP, place); function pickup( event:MouseEvent ):void {    event.target.startDrag() } function place( event:MouseEvent ):void {     event.target.stopDrag( ); }

    • ベストアンサー
    • Flash
  • Flash(ActionScript3.0)

    Flash(ActionScript3.0)でゲーム制作を行っています。 ActionScriptもFlashも最近初めて触れた初心者で、分からないことがたくさん湧いてきて困っています。 よろしければご回答お願い致します。 インスタンスをドラッグすることができる、という要素と、 インスタンスをクリックすると45度回転する、という要素を同時に入れたいのですが、 同時にプログラムを組むとドラッグだけをすることができず、 どうしてもドラッグ後に45度回転してしまいます。 (プログラムのソースはネットから拾ってきたものです)。 どうすればドラッグと回転を分けることができるのでしょうか。 プログラム自体は以下のように組みました。 ご回答いただければ嬉しいです。 よろしくお願い致します。 //インスタンスの回転プログラム mc1.addEventListener(MouseEvent.CLICK, kaiten); function kaiten(event:MouseEvent) { mc1.rotation += 45; } //インスタンスのドラッグプログラム //インスタンスの0点からのマウス座標用変数 var mc1X:int; var mc1Y:int; //マウスがインスタンスを押したらsec1開始 mc1.addEventListener(MouseEvent.MOUSE_DOWN,sec1); //sec1 マウスダウン座標確認、sec2開始 function sec1(event:MouseEvent):void { mc1X = event.localX; mc1Y = event.localY; addEventListener(MouseEvent.MOUSE_MOVE,sec2); } //sec2 インスタンス移動 function sec2(event):void { mc1.x = mouseX-mc1X; mc1.y = mouseY-mc1Y; //低FPSマウス移動スムーズ対応 event.updateAfterEvent(); } //マウスが離れたらsec3開始 stage.addEventListener(MouseEvent.MOUSE_UP,sec3); mc1.addEventListener(MouseEvent.MOUSE_OUT,sec3); //sec3 sec2停止 function sec3(event):void { removeEventListener(MouseEvent.MOUSE_MOVE,sec2); }

  • as3、クリックでアクティブにしたものに命令したい

    画像下の理想のようにしたいのですが、どうすればいいでしょうか。 ステージ上には四角、星、丸のインスタンスが配置してあります。それらを一つクリックしてアクティブにしたものだけに命令を与える方法が知りたいです。 例えば、 丸をクリックしたあと、緑色の左移動ボタンで丸だけが10ピクセル左移動。 星をクリックしたあと、緑色の左移動ボタンで星だけが10ピクセル左移動。 と一つのボタンにまとめたいのです。 現状の左右反転のスクリプトです。 (この中では一番スクリプトが短いので左右反転を例に選びました) ・命令される方 maru 赤い丸のインスタンス名 shikaku 青い四角のインスタンス名 hoshi 黄色の星のインスタンス名 ・命令する方 sayuumaru_btn 丸を左右反転ボタン sayuushikaku_btn 四角をを左右反転ボタン sayuuhoshi_btn 星を左右反転ボタン sayuumaru_btn.addEventListener(MouseEvent.CLICK, sayuumaru); sayuushikaku.addEventListener(MouseEvent.CLICK, sayuushikaku); sayuuhoshi_btn.addEventListener(MouseEvent.CLICK, sayuuhoshi); function sayuumaru(event:MouseEvent):void{ maru.scaleX *= -1.0; } function sayuushikaku(event:MouseEvent):void{ shikaku.scaleX *= -1.0; } function sayuuhoshi(event:MouseEvent):void{ hoshi.scaleX *= -1.0; } どうすれば、理想画像のように、クリックしてアクティブになっているインスタンスのみに命令を与えられるのでしょうか。 flash、cs5、as3、外部as不使用です。 よろしくお願いします。

    • ベストアンサー
    • Flash
  • as3でボタンにリンクをはる方法!

    質問ばかりで申し訳ないですが、お世話になります。 flashCS4&Actionscript3を使っているものです。 「ボタンにリンクをはる方法を探しています。 (どうしても 1093のシンタックスエラーになってしまい、困っています。)」 現在作成しているものは、以下のような構造です。 ************************************************************* ステージ ↓ムービークリップ【インスタンス名(menu_mc)】 ________________________________________ ・ボタン【インスタンス名(btn1_btn)】 ・ボタン【インスタンス名(btn2_btn)】 ・ボタン【インスタンス名(btn3_btn)】 ________________________________________ *************************************************** menu_mcの中で、以下のように記述しました。 btn1_btn.addEventListener(MouseEvent.CLICK,gotowebpage1); function gotowebpage1(event : MouseEvent) :void { navigateToURL(new URLRequest("​http://www.yahoo.co.jp"));​ } btn2_btn.addEventListener(MouseEvent.CLICK,gotowebpage2); function gotowebpage2(event : MouseEvent) :void { navigateToURL(new URLRequest("​http://www.yahoo.co.jp"));​ } btn3_btn.addEventListener(MouseEvent.CLICK,gotowebpage3); function gotowebpage3(event : MouseEvent) :void { navigateToURL(new URLRequest("http://www.yahoo.co.jp")); } すると、1093のシンタックスエラーになってしまいます。 うまく動作させる為には、他にどんな作業を行ったらいいのでしょうか、 よろしくお願いします!!!

    • ベストアンサー
    • Flash
  • AddChildで配置したインスタンスを動かす

    三角や四角などのブロックを並べて遊ぶアプリを作ろうとしています。 ActionScript3.0のAddChildでライブラリからインスタンスを配置させ それをドラッグできるようにしたいのです。 三角のインスタンスを出現させるために「sankakuBlockBtn」というインスタンス名の ボタンを配置し、それをクリックするとライブラリからインスタンスが配置されるという仕組みを考えています。 //クリックイベント sankakuBlockBtn.addEventListener(MouseEvent.CLICK, sankakuHandler); function sankakuHandler(event:MouseEvent):void { //リンケージでクラス名を「sankakuClass」と設定したものをAddChildでステージに配置 var sankaku:sankakuClass = new sankakuClass this.addChild(sankaku); sankaku.x =400; sankaku.y =400; trace(sankaku.name); } 配置することをまではできるのですが、 これをstartDrag()で動かそうとするのですが、 AddChildで配置するたびにインスタンス名が「instance○○」となるので、 これらをどうやって制御するのか分かりません。 最終的には「三角」「四角」「菱形」「台形」「六角形」をそれぞれステージ上に複数配置して、並べて遊べるようにしたいと思っています。 どなたかお力添えいただけないでしょうか。

  • FLEX 外部asの関数を実行する方法。

    nl.platipus.RenaultJointDevelopment.controls.GearBox.asというasの中に下記の関数があります。 private function makeLeverInteractive(param1:String) : void { switch(param1) { case "clickable": { lever.buttonMode = true; lever.useHandCursor = true; if (!lever.hasEventListener(MouseEvent.CLICK)) { lever.addEventListener(MouseEvent.CLICK, handleLeverClick, false, 0, true); } if (lever.hasEventListener(MouseEvent.MOUSE_DOWN)) { lever.removeEventListener(MouseEvent.MOUSE_DOWN, handleLeverMouseDown); } if (lever.hasEventListener(MouseEvent.MOUSE_UP)) { lever.removeEventListener(MouseEvent.MOUSE_UP, handleLeverMouseUp); stage.removeEventListener(MouseEvent.MOUSE_UP, handleLeverMouseUp); } break; } case "draggable": { lever.buttonMode = true; lever.useHandCursor = true; if (lever.hasEventListener(MouseEvent.CLICK)) { lever.removeEventListener(MouseEvent.CLICK, handleLeverClick); } if (!lever.hasEventListener(MouseEvent.MOUSE_DOWN)) { lever.addEventListener(MouseEvent.MOUSE_DOWN, handleLeverMouseDown, false, 0, true); } if (!lever.hasEventListener(MouseEvent.MOUSE_UP)) { lever.addEventListener(MouseEvent.MOUSE_UP, handleLeverMouseUp, false, 0, true); stage.addEventListener(MouseEvent.MOUSE_UP, handleLeverMouseUp, false, 0, true); } break; } default: { lever.buttonMode = false; lever.useHandCursor = false; lever.emphasize = false; if (lever.hasEventListener(MouseEvent.CLICK)) { lever.removeEventListener(MouseEvent.CLICK, handleLeverClick); } if (lever.hasEventListener(MouseEvent.MOUSE_DOWN)) { lever.removeEventListener(MouseEvent.MOUSE_DOWN, handleLeverMouseDown); } if (lever.hasEventListener(MouseEvent.MOUSE_UP)) { lever.removeEventListener(MouseEvent.MOUSE_UP, handleLeverMouseUp); stage.removeEventListener(MouseEvent.MOUSE_UP, handleLeverMouseUp); } break; break; } } return; }// end function このmakeLeverInteractiveという関数をnl.platipus.BasicATM.InhibitorSwitchAnimation.InhibitorSwitchAnimation.asの中で、 クリックすると実行するように書きたいのですが、できますでしょうか? もし、できるのであればその方法も教えていただけると助かります。

専門家に質問してみよう