• 締切済み

addChildとremoveChildの処理についてご教授ください

いつもお世話になります。 ActionScript3でサイト制作を行なっています。 初歩的な質問で大変恐縮ですが、addChildとremoveChildの処理に関するご質問です。 予め「a_mc」、「b_mc」、「bg_mc」というムービークリップを作成し、それぞれをリンケージしておきます。 1.ENTER_FRAME内の条件Aの中で「bg_mc」上に「a_mc」をaddChildします。 2.条件Bにあるhoge関数の中で「bg_mc」上に「b_mc」をaddChildします。 3.「a_mc」は不要なのでremoveChildしたいのですが、下記のエラーが出てしまいます。 【ArgumentError: Error #2025: 指定した DisplayObject は呼び出し元の子でなければなりません。】 上記のエラーの原因がよく理解できなかたので、色々試してみましたが、 例えば、条件Aの中でステージ上にaddChildしたオブジェクト「this.addChild(c)」は、 条件Bのhogeの中でremoveChildすることができました。 上記の3の処理ができない原因は何でしょうか? また、上記の処理を実現するにはどのような処理方法が適切でしょうか? 是非ご教授ください。 宜しくお願い申し上げます。 // 背景MC var bg:MovieClip = new bg_mc(); // コンテンツMC var a:MovieClip; var b:MovieClip; this.addEventListener(Event.ENTER_FRAME, visibleCheck); function visibleCheck(eventObject:Event):void {  if(条件A) {   a = new a_mc();   bg.addChild(a);  } else if (条件B) {   hoge();   function hoge():void {    b = new b_mc();    bg.addChild(b);    bg.removeChild(a);   }  } }

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

みんなの回答

回答No.1

ケース1: 条件Aで一度も実行されないのに条件Bが実行されている aには何も入っていないのでエラーになる ケース2: 条件Bで複数回実行されている aはすでに一回目の条件Bでの実行で removeChildされているのでエラーになる 対処 bg.removeChild(a) ↓ try{bg.removeChild(a)}catch(e){} ケース3: 条件Aで複数回実行されたのち条件Bでも複数回実行されている 最後にaddChildしたa_mc以外は変数aでの参照が切れているので 変数aの参照ではremoveChildできない 対処 a_mcのインスタンスへの参照は配列にしておくなりしておき 複数のa_mcのインスタンスを全部参照できるようにしておく // 背景MC var bg:MovieClip = new bg_mc(); // コンテンツMC var a_arr:Array; var b:MovieClip; this.addEventListener(Event.ENTER_FRAME, visibleCheck); function visibleCheck(eventObject:Event):void {  if(条件A) {   a_arr.unshift(new a_mc());   bg.addChild(a_arr[0]);  } else if (条件B) {   hoge();   function hoge():void {    b = new b_mc();    bg.addChild(b);    while(a_arr.length>0)bg.removeChild(a_arr.pop());   }  } } こんなカンジでしょうか

John12345
質問者

お礼

H240S18B73様 ご回答いただきましてありがとう御座います。 内容を調べた所、別の原因だったようです。 取り急ぎポイント付与させていただきます。

関連するQ&A

  • 文字列の置き換え処理について

    いつもお世話になります。 ActionScript3でサイト制作を行なっています。 初歩的な質問で大変恐縮ですが、文字の置き換え処理に関するご質問です。 「a_mc」というムービークリップがあり、関数Aの中で「a_mc」をthis.addChildします。 「b_mc」というムービークリップがあり、関数Aの中で「b_mc」をthis.addChildします。 以下「c_mc」、「d_mc」というムービークリップが続きます。 上記のムービークリップで不要になったものをremoveChildする時に、共通の関数で処理したいと考え、 this.removeChild(*_mc);という感じに*をa~dの文字列に置き換えて処理できるようにしたいと思い、 下記の処理を作成しましたが、「ReferenceError: Error #1065: 変数 b_mc は定義されていません。」 というエラーが表示されてしまいます。 上記の処理を実現するにはどのような処理方法が適切でしょうか? 是非ご教授ください。 宜しくお願い申し上げます。 // コンテンツMC var a_mc:MovieClip = new a_mcs(); var b_mc:MovieClip = new b_mcs(); var c_mc:MovieClip = new c_mcs(); var d_mc:MovieClip = new d_mcs(); this.addChild(a_mc); this.addChild(b_mc); this.addChild(c_mc); this.addChild(d_mc); // コンテンツ消去処理 // 例)ムービークリップb_mcをremoveChildする場合 removeFunc("b"); function removeFunc(str:String):void { var tempStr:String = str + "_mc"; var categoryNameClass:Class = Class(getDefinitionByName(tempStr)); var categoryContents:MovieClip = new categoryNameClass; this.removeChild(categoryContents); }

    • ベストアンサー
    • Flash
  • ActionScript3のMovieClipについて

    メインのタイムライン上に動的に配置したMovieClip(a_mcとb_mcの2つ)がある場合、 a_mc内に配置したボタンからメインのタイムラインのラベル移動(gotoAndPlay)をさせたいのですが、このような操作は実現可能なのでしょうか。 また、a_mcからb_mcの表示位置の変更(b_mc.xやb_mc.alphaなど)を変更することはできるのでしょうか。 ちなみにメインのタイムライン上で var a_mc:a_movieclip = new a_movieclip(); var b_mc:b_movieclip = new b_movieclip(); addChild(a_mc); addChild(b_mc); としてMovieClipを作成しております。 開発環境は VISTA FlashCS3 ActionScript3 です。 いろいろと調べてみたのですが、 http://www.chimanaco.net/blog/archives/20081105113240.php が使えそうなのでしょうか… 大変申し訳ありませんが、ご回答をお願いいたします。

    • ベストアンサー
    • Flash
  • addChildの使い方

    ロールオーバーで下の画像を表示させる:を参考にしています。 http://okwave.jp/qa/q7020788.html ここはアクションスクリプト2.0でしたが、私はFLASH CS3 アクションスクリプト3.0で 作っています。 その回答をもとに100X100のロールオーバー用の画像を16個表示させるために 書きました。ステージは400x400です。 for (var i:Number = 0; i<=15; i++) { if (i != 0) { var my_mc:MC = new MC(); my_mc.x = i%4*100; my_mc.y = Math.floor(i/4)*100; addChild(my_mc); } } 16個で埋め尽くすことはできましたが、my_mcに番号をつけるなどして配列を使って やらなければならないと考えますが方法がわかりません。今は16番目(iが15)しか ロールオーバーしません。 全体のアクションスクリプトを書きます。 import fl.transitions.*; import fl.transitions.easing.*; for (var i:Number = 0; i<=15; i++) { if (i != 0) { var my_mc:MC = new MC(); my_mc.x = i%4*100; my_mc.y = Math.floor(i/4)*100; addChild(my_mc); } } my_mc.addEventListener(MouseEvent.ROLL_OVER,onrollOver); function onrollOver(eventObj:Event):void { //ロールオーバーイベントを受けたインスタンスを取得 var target_mc:MovieClip = MovieClip(eventObj.currentTarget); //そのインスタンスをフェードアウト TransitionManager.start(target_mc, {type:Fade, direction:Transition.OUT, duration:2, easing:None.easeNone}); //そのインスタンスのイベントリスナーを削除 target_mc.removeEventListener(MouseEvent.ROLL_OVER,onrollOver); }

    • ベストアンサー
    • Flash
  • as3 addchildで生成したMCにリンクを張る

    下記のようなことがしたいのですが、 エラーになります。 //空のムービークリップを作成 var mc:MovieClip = new MovieClip(); mc.name = "test"; ~中略(画像を読み込んでます)~ stage.addChild(mc); stage.mc.addEventListener(MouseEvent.CLICK, function(event) { var theURL:URLRequest = new URLRequest("http://yahoo.co.jp"); navigateToURL(theURL); }); 生成したMCにリンクを張る場合は どのようにしたらよいのでしょうか。 ご教授お願いいたします。

    • ベストアンサー
    • Flash
  • (AS3)「var mc:MovieClip = new MC?();」 の?の部分を変数にできないか

    タイトルの通りです。 今ライブラリには100個のムービークリップがあって、それぞれMC1~MC100までのリンケージ名(クラス名)でActionScriptに書き出しているものとします。 これらを動的に「var mc:MovieClip = new MC?();」というふうにしたいのですが、うまくいきません。 一応下のように自分なりに考えてみたのですがやっぱりダメでした。 var i:int = 3; var str:String = "MC"+i; var mc:MovieClip = new str(); stage.addChild(mc);

    • ベストアンサー
    • Flash
  • 外部swf内関数の使い方を教えてください

    actionscript 3でムービークリップ内に読み込んだ外部swf内の関数の使い方を教えてください。 以下仮ソースです var mc:MovieClip = new MovieClip(); var imgLoader:Loader = new Loader(); var path:URLRequest = new URLRequest("materials/key_550.swf"); var childSwf:MovieClip; imgLoader.load(path); imgLoader.contentLoaderInfo.addEventListener(Event.COMPLETE,compLoader); function compLoader(evt:Event):void{ mc.addChild(imgLoader); addChild(mc); childSwf = mc.imgLoader.content as MovieClip //ここをimgLoader.content as MovieClipとするといけるのですが、mcの子のloaderと指定したいのです。 startGOGO(); } function startGOGO():void{ childSwf.keyContMove(); //子のswf内の関数です。 } よろしくお願い致します。

  • AS3.0でのattachMovieが分かりません

    AS2.0では リンケージで"mc"という名前で登録。 for (var i:Number=0; i<10; i++) {   var _mc:MovieClip = attachMovie("mc_"+i, "mc_"+i, getNextHighestDepth());   _mc._x = 100*i; } というような感じで10個のmcを配置できますよね。 これをAS3.0でやりたいのですが、 リンケージで"mc"という名前で登録。 他のサイトを参考に、 for (var i:int=0; i<10; i++) {   addChild(new (getDefinitionByName("mc"+i))); } とするが、"変数 mc0 は定義されていません"とコンパイルエラー。。 ひとつ配置するには addChild(new mc) でいけますが forを使って上記AS2.0版と同様の事をやるにはどう定義すればよいのでしょうか。。

    • ベストアンサー
    • Flash
  • as3でのmc再生について

    as3でご質問です。 現在as3で、ほとんどをmain.asというasファイルに書いて配置など行っております。 モーションなどがあるmcに関しては、ムビークリップを作って、ライブラリに読み込んであるのをリンケージして呼び出しています。 そこで質問です。 var bn01:MovieClip = new fr_bn01(); var bn02:MovieClip = new fr_bn02(); var bn03:MovieClip = new fr_bn03(); addChild(bn01); addChild(bn02); addChild(bn03); //fr_bn01、fr_bn02はflash上で作成した何フレームかあるmcです。 例えば、bn01の最後のフレームまでいったら、bn02が出現して再生、bn02が最後のフレームまでいったらbn03が出現、再生。 とする場合、どのような書き方をすればよろしいでしょうか。 お手数をおかけしますが、ご教授いただけたらと思います。 よろしくお願いします。 環境:CS3、as3.0

    • ベストアンサー
    • Flash
  • AS2.0からAS3.0にうまく変換できません。

    AS2.0からAS3.0にうまく変換できません。 はじめまして、ActionScriptを勉強し始めたばかりの初心者です。 http://blog.bonkura.jp/2008/07/flash-4.html のページのスクリプトをas3.0に直そうと思って勉強しながらやってみたんですが、 どうもうまくいきません。 書いてみたコードは以下です。 だれか添削してもらえると助かります。宜しくお願いします! stage.scaleMode = StageScaleMode.NO_SCALE; stage.align = StageAlign.LEFT; var bg:MovieClip = new MovieClip(); this.setChildIndex(bg, 1); var bgPic:MovieClip = new MovieClip(); this.setChildIndex(bgPic, 0); bgPattern(); function bgPattern():void{ var myMcl:Loader = new Loader(); var oListener:Object = new Object(); var UrL:URLRequest = new URLRequest(); UrL.url = "http://blog.bonkura.jp/2008/07/08/swf/bg.jpg"; myMcl.addChild(oListener); myMcl.load(UrL, bgPic); oListener.addEventListener( Event.COMPLETE, StageSize); for(var i:Number=0; i<stage.width/100; i++){ for(var j:Number=0; j<stage.height/100; j++){ var bgP:String = "bg"+i+j; bg.addChild(new (getDefinitionByName(bgP))); this.setChildIndex(bgP, i+j*100); bg[bgP].x = i * 100; bg[bgP].y = j * 100; } } } var alphaFlag:Boolean = new Boolean(); alphaFlag = true; bg.addEventListener(Event.ENTER_FRAME, onENTERFrame); bg.addEventListener(Event.RESIZE, bg.resizeHandler); stage.addChild(bg); stage.addChild(bgPic); function StageSize():void{ bgPic.x = (stage.width/2) - (bgPic.width/2); bgPic.y = (stage.height/2) - (bgPic.height/2); } // イベントリスナー function onENTERFrame(event:Event) { if(alphaFlag){ this.alpha -= 5; if(this.alpha <= 0){ alphaFlag = !alphaFlag; } } else{ this.alpha += 5; if(this.alpha >= 100){ alphaFlag = !alphaFlag; } } } function resizeHandler(event:Event = null):void{ bgPattern(); };

    • ベストアンサー
    • Flash
  • 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

専門家に質問してみよう