トップへ戻るニュースフォーラムFLASH-ML 過去ログBak@Flaダウンロードよくある質問と答
ログイン
ユーザ名:

パスワード:


パスワード紛失

新規登録
メインメニュー
メイン
   とにかくFLASH【FLASHに関して全般】
     addChildとremoveChild
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
cb-ss
Åê¹ÆNo.48873
投稿日時: 2012-3-2 23:36
半人前
居住地: kobe
投稿: 32
使用環境:
Windows7
Flash CS5.5 Professional
AS3
addChildとremoveChild
こんばんは。
この度はaddChildとremoveChildについて質問させていただきたく思います。

以下にサンプルを作成しましたので
まずご覧いただければと思います。
http://www.geocities.co.jp/aqua_cube_mix/data/add_remove.html

※まず、このサンプルは5フレームで構成されており、
1フレーム目に以下のスクリプトを記述しています。

btn1.addEventListener(MouseEvent.CLICK,action1);
function action1(eventObject:MouseEvent):void{
	removeChild(aka);
}

btn10.addEventListener(MouseEvent.CLICK,action10);
function action10(eventObject:MouseEvent):void{
	addChild(aka);
}

btn2.addEventListener(MouseEvent.CLICK,action2);
function action2(eventObject:MouseEvent):void{
	removeChild(ao);
}

btn20.addEventListener(MouseEvent.CLICK,action20);
function action20(eventObject:MouseEvent):void{
	addChild(ao);
}

idou_btn.addEventListener(MouseEvent.CLICK,idou_action);
function idou_action(eventObject:MouseEvent):void{
	if(currentFrame == 5){
		this.gotoAndStop(3);
	}else{
		nextFrame();
	}
}


▼確認して頂きたい事(動作)
まず、「赤」と「青」のそれぞれのムービークリップを
「1」と「2」のボタンでremoveChild(削除)します。
(「10」と「20」でaddChild(表示)もできますが。)

そして「赤」と「青」どちらも消えている状態で
「idou」ボタンで、フレームを1つずつ進んで行き
5フレームにいる状態で「idou」ボタンを押すと
3フレーム目に戻る指定なのですが、

この時、先ほどremoveChildした「赤」と「青」のMCが
addChildした訳でも無いのに自動的に復活?(表示)されます。
(自動的に復活した「赤」と「青」のMCも
「1」「2」ボタンでそれぞれ再度removeChildは出来ますが)

また、最初から「赤」「青」ともに表示されたまま、
(一度もremoveChildせずに)5フレームから「idou」ボタンで
3フレームに戻った時は「1」「2」ボタンを押すとremoveChildされますが、
「赤」「青」が表示されているか消えている状態か関係なく
一度でも「10」「20」を押してaddChildしてから、
5フレ→3フレ移動すると、その後は「1」「2」ボタンで
removeChildする事ができなくなります。(汗)


フレーム移動でも、前に進む時は特に何も起こらないのに、(想定通り)
前に戻る時はなぜ「赤」「青」が自然に復活する(想定外)
のでしょうか?

removeChildしたムービークリップはフレーム移動しても(前に戻っても)
ずっと消えたままでいて欲しいのです。
「10」「20」を押した時だけaddChildさせたいのですが・・・
また「1」「2」を押した時に確実にremoveChildさせたいのです。

尚、このflaソースファイルも下記にアップしておりますので
ご確認いただければ幸いです。

http://www.geocities.co.jp/aqua_cube_mix/data/add_remove.zip
※右クリックで保存してください(flash CS4形式)


※ちなみに「赤」「青」を一度removeChildし、消えた状態で
さらに「1」「2」ボタンでremoveChildしようとするとエラーが出ますが、これは納得です。
(消そうとする対象のMCがステージに存在しないから。と解釈しています)

逆に「赤」「青」が表示された状態で「10」「20」でaddChildしても特にエラーはでませんが、
これは特に問題ないのでしょうか?
(すでに表示されている「赤」「青」の上にさらに同じ「赤」「青」が追加されていっている事になるのでしょうか?)


ご教授いただければ幸いです。
moyashinek
Åê¹ÆNo.48879
投稿日時: 2012-3-4 2:24
新米
居住地:
投稿: 1
使用環境:
Re: addChildとremoveChild
わざわざリンクを貼ってくださっているのですが、自分の環境ではzipが開けないようです。

なので憶測で書かせていただきますが、おそらく「aka」と「ao」のインスタンスをタイムラインに配置しているのではないでしょうか?
FlashのタイムラインはgotoAndStop()やgotoAndPlay()での移動や、タイムライン上のキーフレームに差し掛かる度に新しくインスタンスを生成してしまいます。そのため、以前そのフレームに差し掛かったときのインスタンスと、gotoAndStop()などで移動した場合では別のインスタンスとして扱われてしまいます。

なので、以下のコードのように「aka」と「ao」を変数で保持する方法はいかがでしょうか。


//AkaとAoはライブラリからそれぞれリンケージで書き出したもの
var _aka:MovieClip = new Aka();
var _ao:MovieClip = new Ao();
_aka.x = _ao.x = 50;
_aka.y = 50;
_ao.y = 100; //座標はてきとーな数字を書いてます
addChild(_aka);
addChild(_ao);

/* === 以下、投稿者様のコードと同様にButtonとかのコード記述 === */



タイムラインに配置せず、変数に格納することでフレームの移動によるインスタンスの自動書き換えを無視出来ます。

>逆に「赤」「青」が表示された状態で「10」「20」でaddChildしても特にエラーはでませんが、
これは特に問題ないのでしょうか?
(すでに表示されている「赤」「青」の上にさらに同じ「赤」「青」が追加されていっている事になるのでしょうか?)

確認してないのですが、確かそういう動きだったと思います。

ex)
addChild(aka);
addChild(aka);
addChild(aka); //ここまででakaが3つ表示リストに加わる

なので、akaを表示リストから消すには

removeChild(aka);
removeChild(aka);
removeChild(aka); //とremoveChild()も3回呼び出す必要があったはず....


cb-ss
Åê¹ÆNo.48882
投稿日時: 2012-3-5 9:06
半人前
居住地: kobe
投稿: 32
使用環境:
Windows7
Flash CS5.5 Professional
AS3
Re: addChildとremoveChild
>moyashinekさん

ご回答ありがとうございます!

おっしゃる通り「赤」「青」のムービークリップは
ステージ上に配置していました。

回答いただいた内容を元にさっそく検証したところ
希望通りの動作が確認できました!!

また、


>逆に「赤」「青」が表示された状態で「10」「20」でaddChildしても特にエラーはでませんが、
これは特に問題ないのでしょうか?
(すでに表示されている「赤」「青」の上にさらに同じ「赤」「青」が追加されていっている事になるのでしょうか?)

これに関しては

addChild(aka);
addChild(aka);
addChild(aka); //ここまででakaが3つ表示リストに加わる

と3度addChildしても

removeChild(aka);

と、一回のremoveChildだけで画面上からは一応消えました。
(水面下で管理されている表示リスト上では、2つが残ったままなんでしょうかね・・・?)


重複してaddChildするような事は基本的にないので
あまり気にするような事ではありませんが。
(念の為確認しておきたかっただけです。)

回答いただき、大変助かりました。
ありがとうございます。
vader
Åê¹ÆNo.48883
投稿日時: 2012-3-5 15:01
常連
居住地: 東京
投稿: 76
使用環境:
MacOS10.8,FlashCS6
Re: addChildとremoveChild
cb-ssさん、こんにちわ。

重複したaddChildの件で補足します。
基本的に一つのインスタンスは、一つのDisplayObjectContainerにしかaddChildすることができません。

すでに表示リストに加わっているインスタンスを再びaddChildした場合は、一旦表示リストからはずされ、再び表示リストの最前面に加わります。

下記の例では、メインタイムラインにa_mcとb_mcをaddChildし、c_mcをa_mcにaddChildしています。再び、a_mcにc_mcをaddChildしてもa_mc.numChildrenは変化しません。

次にc_mcをremoveChildせずにb_mcにaddChildした場合、a_mc.numChildrenが0になることがわかります。


var a_mc:MovieClip = new MovieClip();
addChild(a_mc);
var b_mc:MovieClip = new MovieClip();
addChild(b_mc);
var c_mc:MovieClip = new MovieClip();
a_mc.addChild(c_mc);
trace(a_mc.numChildren);// 1
a_mc.addChild(c_mc);
trace(a_mc.numChildren);// 1
b_mc.addChild(c_mc);
trace(a_mc.numChildren);// 0
trace(b_mc.numChildren);// 1
trace(a_mc.contains(c_mc));// false
trace(b_mc.contains(c_mc));// true


以上、お役に立ちましたら幸いです。
cb-ss
Åê¹ÆNo.48886
投稿日時: 2012-3-7 9:16
半人前
居住地: kobe
投稿: 32
使用環境:
Windows7
Flash CS5.5 Professional
AS3
Re: addChildとremoveChild
>vaderさん

ご丁寧に補足まで書いていただきありがとうございます。

今回壁にぶつかった点はすでに解決いたしましたが、
こちらも合わせて、参考にさせていただきます。
ありがとうございました。
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ

投稿するにはまず登録を
 
Copyright (C) 2003 FLASH-japan. All rights reserved.
Powered by Xoops