removeChild()についての質問

このQ&Aのポイント
  • AS3.0の初心者がremoveChild()について質問しています。
  • StopボタンでremoveChild()を使用するとエラーが発生するため、正しい記述方法を教えて欲しいとしています。
  • StratボタンとStopボタンでの表示と非表示の切り替えについての質問です。
回答を見る
  • ベストアンサー

removeChild()についてご教授願います。

AS3.0の初心者です。 Stratボタン、Stopボタンで以下のスクリプトで表示と非表示を繰返ししたいのですが、 Stopボタンで、単にremoveChild();にしますと、 「#2025: 指定した DisplayObject は呼び出し元の子でなければなりません。」 とエラーとなります。 色々と調べてみたのですが、よく判判りません。 Stopボタンの記述をどの様にすればよいのでしょうか? 初歩的質問で大変恐縮ですが、どうかご教授お願い致します。 [メインスクリプト] var stageH = stage.stageHeight; var stageW = stage.stageWidth; //Stratボタン start.addEventListener(MouseEvent.MOUSE_DOWN,gene); function gene(e:Event):void { for (var i = 0; i < 20; i++) { var mc:Candy = new Candy(); mc.x = Math.random()*stageW + 10; mc.y = Math.random()*stageH + 10; addChild(mc); } } //Stopボタン stop.addEventListener(MouseEvent.MOUSE_DOWN,stp); function stp(e:Event):void { removeChild(mc); この部分がよく判らないのですが、 どの様に記述したら良いのでしょうか? } --------------------------------------- [mc のスクリプト] var mcH:int = this.height; var mcW:int = this.width; var stageH = stage.stageHeight; var stageW = stage.stageWidth; var speedY:uint = Math.random() * 5 + 5; var speedX:uint = Math.random() * 2; addEventListener(Event.ENTER_FRAME,loop); function loop(Event):void { y += speedY; x += speedX; if ( y > stageH ) { y = - mcH; } if ( x > stageW ) { x = - mcW; } } -----------------------------------------

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

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

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

問題点は, var mc:Candy = new Candy(); のようにして たくさんの違う Candy インスタンスを,その場しのぎの変数 mc に代入しているところです。 個々の Candy(MC) インスタンスには その場しのぎではなくちゃんと個別の名前を付ける必要があります。 (個々のCandyインスタンスを参照する個別の変数が必要です。) そうしないと個々のインスタンスを名指しで呼ぶことができません。 あと,ボタンの名前が少しよろしくないので Stratボタンには「start_btn」というインスタンス名を付け Stopボタンには「stop_btn」というインスタンス名を付けるものとします。 以下はその場合の変更例(2例)です。 【例1】 Stratボタン の連続クリックで Candy インスタンスを何度も増殖させる場合 //---フレームのスクリプト例----------------- var stageH:int = stage.stageHeight; var stageW:int = stage.stageWidth; //カウンタ用変数cnt var cnt:int = 0; //Stratボタン start_btn.addEventListener(MouseEvent.MOUSE_DOWN,gene); function gene(e:Event):void { for (var i:int = 0; i < 20; i++) { this["mc" + cnt] = new Candy(); this["mc" + cnt].x = Math.random() * stageW + 10; this["mc" + cnt].y = Math.random() * stageH + 10; addChild(this["mc" + cnt]); //カウンタに1を加算 cnt++; } } //Stopボタン stop_btn.addEventListener(MouseEvent.MOUSE_DOWN,stp); function stp(e:Event):void { for (var i:int = 0; i < cnt; i++) { //インスタンス内のイベントリスナーを削除 this["mc" + i].removeEventListener(Event.ENTER_FRAME,this["mc" + i].loop); //インスタンスを表示リストから削除 removeChild(this["mc" + i]); //インスタンスへの参照を切る this["mc" + i] = null; } cnt = 0; } //------------------------------------------ 【例2】 Stratボタン を連続クリックをさせない場合 //---フレームのスクリプト例----------------- var stageH:int = stage.stageHeight; var stageW:int = stage.stageWidth; //Stopボタンのマウス反応を無効にしておく stop_btn.mouseEnabled = false; //Stratボタン start_btn.addEventListener(MouseEvent.MOUSE_DOWN,gene); function gene(e:Event):void { for (var i:int = 0; i < 20; i++) { this["mc" + i] = new Candy(); this["mc" + i].x = Math.random() * stageW + 10; this["mc" + i].y = Math.random() * stageH + 10; addChild(this["mc" + i]); } //Stratボタンのマウス反応を無効にする start_btn.mouseEnabled = false; //Stopボタンのマウス反応を無効にする stop_btn.mouseEnabled = true; } //Stopボタン stop_btn.addEventListener(MouseEvent.MOUSE_DOWN,stp); function stp(e:Event):void { for (var i:int = 0; i < 20; i++) { //インスタンス内のイベントリスナーを削除 this["mc" + i].removeEventListener(Event.ENTER_FRAME,this["mc" + i].loop); //インスタンスを表示リストから削除 removeChild(this["mc" + i]); //インスタンスへの参照を切る this["mc" + i] = null; } //Stratボタンのマウス反応を有効にする start_btn.mouseEnabled = true; //Stopボタンのマウス反応を無効にする stop_btn.mouseEnabled = false; } //------------------------------------------ this["mc" + i] などで出てくる [] を 「配列アクセス演算子」と言いますが, これを使わずに個々のインスタンスを配列の要素に入れても良いです。 そうすれば this などのタイムラインを参照するパスは不要になります。 //---例---------------------------------- var stageH:int = stage.stageHeight; var stageW:int = stage.stageWidth; //インスタンスの参照を格納する配列を作成 var mc_arr:Array = new Array();  ~ 中略 ~ function gene(e:Event):void { for (var i:int = 0; i < 20; i++) { //配列の各要素に作成したインスタンスを格納 mc_arr[i] = new Candy();  ~ 後略 ~ //--------------------------------------- その他諸々のことに関して 「[AS3] DisplayObjectインスタンスの削除とガベージコレクション 」 http://f-site.org/articles/2010/05/09072731.html

miki_Aya
質問者

お礼

BlurFiltan様 本当にありがとうございます。 こんな初心者に図解までお付け頂き、 丁寧なご教授に感謝、感激しております。 一度はあきらめかけていたのですが、質問して良かったです。 BlurFiltan様な方がいらっしゃると、これからのFlashが楽しくなりました。 こんな初心者ですが、今後ともよろしくお願い致します。 本当にありがとうございます。 感激です。

関連するQ&A

  • actionscriptに詳しい方助けてorz

    actionscript3.0を勉強中の初心者です。 現在、フルフラッシュサイトを制作中なのですが、 基本はactionscriptを使用しないで、 作っているのですが、 一部、雪を降らせる演出をactionscriptで実装しています。 そのスクリプトは組めたのですが、 実際にその演出をしたい階層がうまく変更できません。 現状は最前面になっているのですが、 それを最背面の一つ手前にしたいです。 具体的なビジョンとしては 最背面の背景→その上にある画像(部分的に切り抜かれて背景が見えます) この二つの間に雪を降らせたいのですが、 うまくいきません。 何か方法をご存知の方いたら教えていただけると助かります。 スクリプトは下記になります。 addEventListener(Event.ENTER_FRAME , onNewSnow) ; function onNewSnow(eventObj : Event) : void { if (Math.random() <0.3) { var snow_mc:snows = new snows(); snow_mc.x=stage.stageWidth*Math.random(); snow_mc.y=-20; snow_mc.scaleX=snow_mc.scaleY=Math.random()+0.5; addChild(snow_mc); snow_mc.addEventListener(Event.ENTER_FRAME, onSnowStep); } } function onSnowStep(eventObj:Event):void { var target_mc:MovieClip=eventObj.target as MovieClip; target_mc.rotation+=Math.ceil(20/target_mc.scaleX); target_mc.x+=4*Math.random()-2; target_mc.y+=5; if (target_mc.y >(stage.stageHeight+target_mc.height)) { target_mc.removeEventListener(Event.ENTER_FRAME, onSnowStep); removeChild(target_mc); } }

    • ベストアンサー
    • Flash
  • フルスクリーン、画面右で切れた分だけ、左から表示

    制作環境AS3.0、CS4です。 フルスクリーンでMovieClipを右移動させて、 画面右で切れた分(部分)を左から表示させたいです。 (ドキュメントサイズとMovieClipは同サイズで 途切れることなくひと続きのようにループしたいです) フルスクリーン(画面可変)のため数値で指定できないため 応用がきかずに困ってます・・・ 以下、現状ソースです。 var speedX:Number=20; back_mc.addEventListener(Event.ENTER_FRAME, onEnterframe); function onEnterframe(eventObj:Event):void { var mc:MovieClip=eventObj.target as MovieClip; //ステージの右に出た分だけ・・・ if (mc.x+stage.stageWidth>stage.stageWidth) { //ステージの左に表示 mc.x-=stage.stageWidth-mc.x; } else { mc.x+=speedX; } } そもそも1つのMovieClipでつなぎあわせるのは、if文では無理かもしれませんが・・・ 詳しい方、ご教授お願いしたいです。

    • ベストアンサー
    • Flash
  • ActionScript3.0について…

    ある課題で下記の条件を満たしたものを制作するというものがありまして、 制作してみたんですが、回答例と異なっていました。 私が制作したものでは、なにか間違っているのか分かりませんので質問させていただきました。よろしくお願いいたします。 ☆☆☆ 条件 ☆☆☆ ★ _mcの移動幅を5~10もしくは-10~-5の範囲になるようにします。 ★ 縦方向、横方向ともにステージの端まで移動したら反転するようにします。 ※ステージ幅は400px、高さは300pxとします。 ※条件ではありませんが、この問題を解くヒントとして、 「移動幅は2分の1の確率で-1を掛ける」と 「2分の1を表す条件式の例としては[ Math.random < 0.5 ]が考えられます。」とあります。 ☆☆☆ 回答例 ☆☆☆ var stepX:int = Math.floor(Math.random() * 6) + 5; var stepY:int = Math.floor(Math.random() * 6) + 5; if (Math.random() < 0.5){ stepX *= -1; } if (Math.random() < 0.5){ stepY *= -1; } _mc.addEventListener(Event.ENTER_FRAME, xEnterFrame); function xEnterFrame(evt) { _mc.x += stepX; _mc.y += stepY; if (_mc.x >= 400 || _mc.x <= 0){ stepX *= -1; } if (_mc.y >= 300 || _mc.y <= 0){ stepY *= -1; } } ☆☆☆ 私が書いたもの ☆☆☆ var stepX:int = Math.floor(Math.random() * 6) + 5; var stepY:int = Math.floor(Math.random() * 6) + 5; _mc.addEventListener(Event.ENTER_FRAME, xEnterFrame); function xEnterFrame(evt) { _mc.x += stepX; _mc.y += stepY; if(_mc.x > 400 || _mc.x < 0){ stepX *= -1; } if(_mc.y > 300 || _mc.y < 0){ stepY *= -1; } } あくまでもヒントでしたので、私が書く際にはヒントを見ずに書きました。

    • ベストアンサー
    • Flash
  • FLASH:: ブラウザ領域にあわせて背景をリサイズ、その後固定

    FLASH:: ブラウザ領域にあわせて背景をリサイズ、その後固定 FLASH:: ブラウザ領域にあわせて背景をリサイズ、その後固定 WEBほぼ初心者ですが、ネットで検索しながら、フルフラッシュの可変レイアウトサイト作成に挑戦中です。 ステージは1920x1200、scaleModeはNO_SCALE, TOP_LEFTアラインです。 やりたいことは、最初にサイトに入った時のstageWidth,stageHeightにあわせて背景BG_mc(1920x1200です)を拡大・縮小し、以後もしウインドウサイズが変更になっても、そのサイズを維持させることです。 現状どうにかたどりついたスクリプトでは、近いことはできているのですが、問題が2つあります。 1: 初回アクセス時にBG_mcのリサイズが適用されず、元のサイズででてしまう。   いったんブラウザをリサイズすると、以後はリサイズが適用され続けます。 2: ブラウザサイズが変更されると、リサイズが動的に適用されつづけてしまう。 最初に拾ったサイズでBG_mcを固定して、以後ブラウザのリサイズは無視したいのですが・・。 下記がそのスクリプトです。 使用ソフトはFLASH CS4, AS3,現状ではGoogle Chromeのみでパブリッシュしてテストしています。 stage.addEventListener(Event.RESIZE, resizeListener); stage.scaleMode = StageScaleMode.NO_SCALE; stage.align = StageAlign.TOP_LEFT; //var DispX:int = Capabilities.screenResolutionX; //var DispY:int = Capabilities.screenResolutionY; function resizeListener (event:Event):void { trace("stageWidth: " + stage.stageWidth + " stageHeight: " + stage.stageHeight); BG_mc.width = stage.stageWidth; BG_mc.height = stage.stageHeight; //if (stage.stageWidth > stage.stageHeight) { //BG_mc.width = stage.stageWidth; //BG_mc.height = stage.stageWidth*0.625; //} else { //BG_mc.width = stage.stageWidth; //BG_mc.height = stage.stageWidth; //} } どなたかわかる方、いらっしゃらないでしょうか? そもそもやろうとしていることは、Flashのみで可能なのでしょうか? レイアウトはHTMLを活用したほうがよいのでしょうか? よろしくお願いします。

  • AS3でステージのサイズ変えた時にムービークリップが減速して中央に移動

    AS3でステージのサイズ変えた時にムービークリップが減速して中央に移動するFlashの作り方で悩んでいます。 参考にしてるものはこれなんですが↓ http://hfm-kenchan.com/Lesson/sample/centermovie11/top.htm これをActionScript3で作ろうと今現在このようにコーディングをしています。 ※my_mc:ステージ中央にあるムービークリップ stage.align=StageAlign.TOP_LEFT; stage.scaleMode=StageScaleMode.NO_SCALE; stage.addEventListener(Event.RESIZE, resize_control); function resize_control(eventObject:Event):void { my_mc.x = (stage.stageWidth - my_mc.width)/2; my_mc.y = (stage.stageHeight - my_mc.height)/2; const spd:Number=1/5; my_mc.addEventListener(Event.ENTER_FRAME, center_movie); function center_movie(event:Event):void { my_mc.x += ((stage.stageWidth - my_mc.width)/2 - my_mc.x)*spd; my_mc.y += ((stage.stageHeight - my_mc.height)/2 - my_mc.y)*spd; } } 現在はリサイズするとmy_mcはステージ中央にいるのですが参考にしてるものみたいに減速して中央に移動するというものが作れません。 どうしたらいいのかどなたかアドバイスしていただけませんか? よろしくお願いします。

    • ベストアンサー
    • Flash
  • actionScript3.0にてTouchEventを使わなくてはな

    actionScript3.0にてTouchEventを使わなくてはならない状況になりました。 開発しなくてはならないものが、デジタルサイネージのタッチパネルで地図を表示するシステムです。 自分なりにいろいろ調べて、スクリプトを組んだのですが、プレビューで動かしてみようとすると 1046:型が見つからないか、コンパイル時定数ではありませんTouchEvent。とエラーが表示されてしまいます。 システムを構築している環境は、FlashCS4,WindowsXPで、 タッチパネルで使っているPCのOSはWindows7です。 長文になってしまいますが、スクリプトは下記のとおりです。 Multitouch.inputMode = MultitouchInputMode.TOUCH_POINT; /********************** 変数一覧 ***********************/ var speedX:int = 0; var speedY:int = 0; //var friction:Number = 0.2; map.x = -240; map.y = -180; /******************************************************/ topBtn.addEventListener(TouchEvent.TOUCH_OVER ,topTouchOver); bottomBtn.addEventListener(TouchEvent.TOUCH_OVER,bottomTouchOver); leftBtn.addEventListener(TouchEvent.TOUCH_OVER,leftTouchOver); rightBtn.addEventListener(TouchEvent.TOUCH_OVER,rightTouchOver); topBtn.addEventListener(TouchEvent.TOUCH_OUT,touchOut); bottomBtn.addEventListener(TouchEvent.TOUCH_OUT,touchOut); leftBtn.addEventListener(TouchEvent.TOUCH_OUT,touchOut); rightBtn.addEventListener(TouchEvent.TOUCH_OUT,touchOut); function topTouchOver(TouchEvent):void{ speedY = 20; } function bottomTouchOver(TouchEvent):void{ speedY = -20; } function leftTouchOver(TouchEvent):void{ speedX = 20; } function rightTouchOver(TouchEvent):void{ speedX = -20; } function touchOut(TouchEvent):void { speedY = speedX = 0; removeEventListener(Event.ENTER_FRAME,motion); } addEventListener(Event.ENTER_FRAME,motion); function motion(event:Event):void { map.x += speedX; map.y += speedY; if(map.x>=0) { map.x = 0; } else if(map.x <= -map.width + stage.stageWidth) { map.x = -map.width + stage.stageWidth; } if(map.y>=0) { map.y = 0; } else if(map.y <= -map.height + stage.stageHeight) { map.y = -map.height + stage.stageHeight; } } よろしくお願い致します。

    • ベストアンサー
    • Flash
  • 円をランダムで描画していき、最初の円から徐々に透明になる

    現在AS3.0にてランダムで永遠と円を描きながらも、描画した円から順番に透明になっていくスクリプトを書いているのですが、以下のスクリプトですと全体が透明になっていき、最終的に何も残らなくなってしまいます。 常に透明度1の円を描画しつつも、先に描画した円から徐々に透明になっていくスクリプトにするにはどうすればよいのでしょうか?ご教授お願いできればと思います。 addEventListener(Event.ENTER_FRAME, rain); import flash.display.Sprite; import flash.display.MovieClip; var mySprite:Sprite = new Sprite(); var myClip:Sprite = new Sprite(); addChild(myClip); function rain(event:Event):void { with(mySprite.graphics) { var circle:int = Math.floor(Math.random()*100); var stageX:int = Math.floor(Math.random()*stage.stageWidth); var stageY:int = Math.floor(Math.random()*stage.stageHeight); beginFill(0x000000); drawCircle(stageX, stageY , circle); endFill; myClip.addChild(mySprite); var diff:Number = 0.01; myClip.alpha -= diff; } }

    • ベストアンサー
    • Flash
  • AS3.0で地面にバウンドするように落下させたい

    浩太と申します。 FLASHQ&Aで紹介されたNo.904↓ http://hfm-kenchan.com/Lesson/contents/index.htm ※No.904を、クリックして頂ければと思います。 を、AS3.0で対応したいのですが、どうしてもうまくいきません。 ↓ように、記述してみましたが、stopせずに、永遠とバウンドしたままとなってしまいます。 どうかご教授下さい。 addEventListener(Event.ENTER_FRAME, onEnterframe); stop(); function onEnterframe(event:Event):void { //初期Y座標配置幅 var yPos = 300; //初期速度 var spd = 5; //重力 var g = 2.5; //跳ね返り係数 var k = 0.9; //空気抵抗 var t = 0.99; //地面のY座標値 var base = 250; var dy = Math.floor(Math.random()*190); ball.y = dy; base = base-stage.stageHeight/2; spd = spd*t+g; dy += spd; if (dy >= base) { dy = base; spd = -spd*k;  } }

    • ベストアンサー
    • Flash
  • actionscript 3.0 初心者です

    以下の3つの質問にご回答いただければ幸いです。 以下の参考にさせていただいている、スクリプトにて 1、random関数の()の後に来る数字はどのような範囲を意味しているのでしょうか? 2、sList[i].vx = Math.random() -0.5;という記述について、これはあるオブジェクトの 落下(進行)の速度を示しているらしいのですが、その手前の記述で、 private var vx:Number = 0;という記述があります。自分で定義したものをプロパティーとして使い事はできるのでしょうか?(もしくわこのvxはarrayのプロパティとして使われていると考えてよろしいのしょうか?) 3、なぜ速度をわざわざ配列で記入する必要があるのでしょうか? 多岐にわたっておりますが、是非よろしくお願い致します。 package{ import flash.display.Sprite; import flash.display.MovieClip; import flash.geom.Matrix; import flash.events.Event; import flash.filters.BlurFilter; public class Main extends Sprite { private var snow:Ball;     private var num:int = 200; private var sList:Array = []; private var vx:Number = 0; public function Main(){ for(var i:int = 0; i < num; i++){ var snow:Ball = new Ball(2,0xaaffff) //初期位値 snow.x = Math.random() * stage.stageWidth; snow.y = Math.random() * stage.stageHeight; //大きさを生成順に小さく snow.scaleX = snow.scaleY = 1 / (0.02 * i + 1); //配置して配列に入れる addChild(snow); sList.push(snow); //それぞれのx方向の速度設定 sList[i].vx = Math.random() -0.5; } addEventListener(Event.ENTER_FRAME,go1); } private function go1(evt:Event):void{ for(var i = 0; i < num; i++){ //x方向とy方向の動き設定(奥のものほど遅くなる) sList[i].x += sList[i].vx / (0.02 * i + 1); sList[i].y += 4 / (0.02 * i + 1); //ステージ外(下)に出たら移動 if(sList[i].y > 400){ sList[i].x = Math.random() * stage.stageWidth; sList[i].y = 0; } } } } }

    • ベストアンサー
    • Flash
  • ボタンをロールオーバーした時にMCを複製したい

    はじめまして、よろしくお願いします。 表題の通りですが、 ボタンをロールオーバーした時にMCを複製したいのですが、やり方がわかりません。 body(←ボタン名)を押した時に snow(←複製されるMC名)を噴射するような形にしたいです。 フレーム1に書かれたスクリプト------------------- for (count = 1;count<30;count ++) { snow.duplicateMovieClip("snow" + count , count ); } ----------------------------------------------- 複製されるMC(snow)---------------------------------- onClipEvent(load){ xposition = _root.body._x+75; yposition = _root.body._y+75; scale = Math.random()*30+10; speedx = 12-(scale+Math.random()*30+1)/5; speedy = 12-scale/5; this._x = xposition; this._y = yposition; this._xscale = scale; this._yscale = scale; } onClipEvent (enterFrame){ if(this._y>400){ this._y=yposition; this._x=_root.body._x+75; this._alpha = 100; } this._x+=speedx; this._y+=speedy; this._alpha = this._alpha-5; } ----------------------------------------------- 早急に解決しなくてはならなく、困っています。 よろしくお願いします。

    • ベストアンサー
    • Flash

専門家に質問してみよう