- 締切済み
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○○」となるので、 これらをどうやって制御するのか分かりません。 最終的には「三角」「四角」「菱形」「台形」「六角形」をそれぞれステージ上に複数配置して、並べて遊べるようにしたいと思っています。 どなたかお力添えいただけないでしょうか。
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- BlurFiltan
- ベストアンサー率91% (1611/1754)
結局どうしたいのかがわかりにくいのですが, とにかく > AddChildで配置するたびにインスタンス名が「instance○○」となるので、 > これらをどうやって制御するのか分かりません。 というような 「"インスタンス名" を使う」という発想(考え方)自体を捨てるのが とりあえずの出発点だと思いますよ。 「F-site [AS3] MovieClipインスタンスとインスタンス名」 http://f-site.org/articles/2008/04/19014939.html ↑じっくりと読んで理解してみてください。 . ===================== 結局ご質問では 何をどうしたいのかが理解しにくいのですが そもそも インスタンスをインスタンス名で管理しても インスタンスを参照する変数で管理しても そんなことは関係なくドラッグ設定くらいできるでしょう? ↓↓↓ //--------------------------------- //クリックイベント 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; //↓【付加】sankaku上でマウスダウン時に関数 mouseDownFunc を実行 sankaku.addEventListener(MouseEvent.MOUSE_DOWN,mouseDownFunc); } //↓【付加】関数 mouseDownFunc の定義 function mouseDownFunc(e:MouseEvent):void{ //マウスダウンしたターゲットをドラッグ開始 e.currentTarget.startDrag(); //ステージ上でマウスアップ時に mouseUpFunk を実行 stage.addEventListener(MouseEvent.MOUSE_UP,mouseUpFunk); } //↓【付加】関数 mouseUpFunk の定義 function mouseUpFunk(e:MouseEvent):void{ //ドラッグ停止 stopDrag(); //ステージ上でマウスアップ時に mouseUpFunk を実行するのを解除 stage.removeEventListener(MouseEvent.MOUSE_UP,mouseUpFunk); } //--------------------------------- ↑これだけのことでしたら インスタンス名や参照を保存しておく変数など不要です。 しかし例えば, ステージ上に 「三角」「四角」「菱形」「台形」「六角形」 をたくさん出された後に 「三角」だけを消したいとか そういうときにはそれを管理する用の何かが要りますよね? そのようなときには 作成したインスタンスの参照を格納して保存する変数や配列を用意すれば良いのです。 インスタンスの参照を配列に格納する場合の変更例↓。 //--------------------------------- //↓【付加】三角の参照を格納する配列を用意 var sankaku_arr:Array = new Array(); //クリックイベント sankakuBlockBtn.addEventListener(MouseEvent.CLICK, sankakuHandler); function sankakuHandler(event:MouseEvent):void { //↓【以下変更】三角のインスタンスを作成し配列に格納 sankaku_arr.push(new sankakuClass()); var n:int = sankaku_arr.length-1; this.addChild(sankaku_arr[n]); sankaku_arr[n].x = 400; sankaku_arr[n].y = 400; //三角上でマウスダウン時に関数 mouseDownFunc を実行 sankaku_arr[n].addEventListener(MouseEvent.MOUSE_DOWN,mouseDownFunc); } //~以下は上のスクリプトと同じ~ //--------------------------------- . ===================== 仮に, 「どうしてもインスタンス名で管理したいんだ!」 と言うのでしたら, 自分で好きなようにインスタンス名を付ければ良いだけのことです。 //--------------------------------- //クリックイベント sankakuBlockBtn.addEventListener(MouseEvent.CLICK, sankakuHandler); function sankakuHandler(event:MouseEvent):void { //リンケージでクラス名を「sankakuClass」と設定したものをAddChildでステージに配置 var sankaku:sankakuClass = new sankakuClass(); //↓【付加】sankaku に自分の好きなインスタンス名を付ける sankaku.name = "sankaku" + 0; //~以下は最初のスクリプトと同じ~ //--------------------------------- 例えば「"sankaku" + 0」の 0 の部分を カウントアップで変動させる変数にでもしておけば 連番付きインスタンス名などが付けられますよね? しかし上記のように 「好きなインスタンス名を付けたとしても それによって得することはあまりありませんよ。」 ということが最初に書いたページにも書いてあるわけです。 (極たまにインスタンス名が要るという場合も出て来ますが 今回のご質問のようなケースではインスタンス名などまず不要でしょう。)