- ベストアンサー
AS3でattachMovie()とは?質問内容を要約すると
- AS3でattachMovie()とはどのような機能なのかわからない質問です。attachMovie()はAS2.0で使用されていた機能であり、MC(ムービークリップ)をコードで生成して表示するためのものです。
- 質問者はブロック崩しのプログラム練習をしており、ブロックをステージに配置する際にライブラリでリンケージして書き出し、attachMovie()を使ってMCを生成したのかもしれません。
- その後の問題は、ボールがブロックに当たったときにブロックを消すためのコードを記述する際に、生成したすべてのブロックに適応させる方法がわからないというものです。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
まず最初の, ブロックのMCをステージ上に並べるスクリプトの方も あまりよろしくないですね。 ActionScript 3.0 では, インスタンスのインスタンス名はどうでも良くて, インスタンスはそれを参照する変数で管理するのが普通です。 なぜそうなのか, 次のページを良く読んで内容を理解してみてください↓。 「F-site [AS3] MovieClipインスタンスとインスタンス名」 http://f-site.org/articles/2008/04/19014939.html それと, eval は ActionScript 2.0 時代にはすでに普通は使われていませんでしたよ。。。 使っていたのは Flash 5 時代くらいだけで, MXの頃からAdobe(当時Macromedia)も eval の使用はあまり推奨していなかったこともあり, 使えたとしても使わないのが普通でした(使えない場合もあるので使わない)。 eval の代わりに「配列アクセス演算子」を使うのが普通でした。 「FN0507001 - ドット演算子と配列アクセス演算子 - Flash 」 http://www.fumiononaka.com/TechNotes/Flash/FN0507001.html 以上の2点のことより, ブロックのMCをステージ上に並べるスクリプトは 次のようにするのが良い(手間が少ない)と思います。 (メインのタイムラインのフレームに書く場合) ------------------------------ for (var i:int = 0; i<32; i++) { this["block" + i] = new block_class(); this["block" + i].x = i % 4 * 40 + 40; this["block" + i].y = Math.floor(i / 4) * 15 + 25; this.addChild(this["block"+i]); } ------------------------------ これで 上記スクリプトをメインのフレームに書いた場合 this(この場合root) には 変数「block0」~「block32」が作成されるのと同時に それら各変数には呼び出された各ブロックMCへの参照が代入されます。 ちなみに addChild するのは(インスタンス本体を配置するのは), stage ではなく,上記のように this(root) の方が都合が良いように思います。 ActionScript 3.0 では this(root) は stage の 子 です。 上記スクリプトをメインのフレームに書いた場合, そのスクリプトの居場所も this(root) になります。 スクリプトの居場所 this(root) よりも上位階層にインスタンスを配置するのは, それなりの理由と,それなりの意識(そのことを忘れずに意識をしておくこと)が必要だと思います。 次に,当たり判定→MC削除 の部分です。 上のスクリプトでブロックのMCを呼び出した場合, ご質問のスクリプトのように 「ボールがブロックに当たったら消える(=非表示にする)」 ということをする場合は, 次のようにすれば消えます。 ------------------------------ for (var i = 0; i<32; i++) { if (ball_mc.hitTestObject(this["block" + i])) { this["block" + i].visible = false; } } ------------------------------ そうではなくて 「ボールがブロックに当たったら消える(=ステージ上から削除する)」 という場合は次のようになります。 ------------------------------ for (var i = 0; i<32; i++) { if (this["block" + i] != null) { if (ball_mc.hitTestObject(this["block" + i])) { this.removeChild(this["block" + i]); this["block" + i] = null; } } } ------------------------------ ちなみに... ついでなので,この回答に際して動作検証するために私が作ったサンプルのスクリプト全文を書いておきます。 一応,FLAのメインのタイムラインのフレーム1に書いたスクリプト例です。 ステージ上の右下の方には 直径 20px ほどの円い塗り入りのムービークリップ「ball_mc」を置いています。 「ball_mc」を自力ドラッグしてブロックを消してみるという,単なる検証用だけのためのスクリプトです。 ------------------------------ for (var i:int = 0; i<32; i++) { this["block" + i] = new block_class(); this["block" + i].x = i % 4 * 40 + 40; this["block" + i].y = Math.floor(i / 4) * 15 + 25; this.addChild(this["block"+i]); } //「ball_mc」をマウスで押したとき 関数onBallPressを実行 ball_mc.addEventListener(MouseEvent.MOUSE_DOWN,onBallPress); //関数onBallPressの定義 function onBallPress(e:MouseEvent):void { //「ball_mc」のドラッグを開始 e.currentTarget.startDrag(); } //マウスをアップしたとき 関数onBallReleaseを実行 stage.addEventListener(MouseEvent.MOUSE_UP,onBallRelease); //関数onBallReleaseの定義 function onBallRelease(e:MouseEvent):void { //「ball_mc」のドラッグを停止 ball_mc.stopDrag(); } //マウスが動くごとに 関数removeBallを実行 this.addEventListener(MouseEvent.MOUSE_MOVE,removeBall); //関数removeBallの定義 function removeBall(e:MouseEvent):void { for (var i = 0; i<32; i++) { if (this["block" + i] != null) { if (ball_mc.hitTestObject(this["block" + i])) { this.removeChild(this["block" + i]); this["block" + i] = null; } } } } ------------------------------
お礼
詳しく答えていただきありがとうございます! >eval は ActionScript 2.0 時代にはすでに普通は使われていませんでしたよ。。。 そうだったんですね・・・調べているときに良く出てきたので、普通に使われていたのかと思いました。 インスタンス名にこだわって、それで動かそうとしていたのがいけなかったのですね。 今回だと、複製しながら上手い具合に一つの変数にまとめることが重要だったのですね。 すごく勉強になりました! まだ始めたばかりでわからないことだらけなので、また質問するかもしれませんがそのときはよろしくお願いします。 ありがとうございました。