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

パスワード:


パスワード紛失

新規登録
メインメニュー
メイン
   迷える子羊の部屋【初心者専用】
     removeChildしたmcにhitTestObjectが反応する
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
koppe
Åê¹ÆNo.43089
投稿日時: 2009-8-7 4:57
半人前
居住地:
投稿: 57
使用環境:
WinXPsp3,Flashcs4
removeChildしたmcにhitTestObjectが反応する
お世話になっています。
ふたつのmc
a_mc,b_mcがあり、
b_mcをマウスで押すとマウス座標に追従させてます。
そしてa_mcと重なったときにマウスを押すと、a_mcをremoveChildする処理を作成しています。
実行したらa_mcが消えた後に再びb_mcを移動させ、
a_mcの消えた場所でマウスを押すと、エラーがでてしまいます。

ArgumentError: Error #2025: 指定した DisplayObject は呼び出し元の子でなければなりません。

これはa_mcに反応しているけどa_mcをremoveChildできないといってるのでしょうか?
どうすれば怒られないのでしょうか?
よろしくお願いします。

var a_mc:MovieClip=new a_mc_();
var b_mc:MovieClip=new b_mc_();

addChild(a_mc);
a_mc.x=30;
a_mc.y=30;

addChild(b_mc);
b_mc.x=80;
b_mc.y=80;

b_mc.addEventListener(MouseEvent.MOUSE_DOWN,xstartmove);
function xstartmove(evt:MouseEvent):void {
	b_mc.removeEventListener(MouseEvent.MOUSE_DOWN,xstartmove);

	setChildIndex(b_mc,numChildren-1);//優先を上にする
	b_mc.x=mouseX;
	b_mc.y=mouseY;

	stage.addEventListener(MouseEvent.MOUSE_MOVE,xmoveing);
	function xmoveing(evt:MouseEvent):void {
		b_mc.x=mouseX;
		b_mc.y=mouseY;
		evt.updateAfterEvent();//滑らか移動
	}

	b_mc.addEventListener(MouseEvent.MOUSE_DOWN,xstopmove);
	function xstopmove(evt:Event):void {
		b_mc.removeEventListener(MouseEvent.MOUSE_DOWN,xstopmove);

		if (b_mc.hitTestObject(a_mc)) {
			trace("当たった");
			removeChild(a_mc);
		}

		stage.removeEventListener(MouseEvent.MOUSE_MOVE,xmoveing);
		b_mc.addEventListener(MouseEvent.MOUSE_DOWN,xstartmove);//再び移動できるようにする
	}
}
野中文雄
Åê¹ÆNo.43090
投稿日時: 2009-8-7 6:07
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: removeChildしたmcにhitTestObjectが反応する
まず、ご質問に回答が得られたら、フィードバックをしましょう。→【フィードバックをしない

つぎに本題です。すでに「勘当」して子どもでも何でもないものは「removeChildできないといってる」のです。
引用:
koppeさんは書きました:
実行したらa_mcが消えた後に再びb_mcを移動させ、
a_mcの消えた場所でマウスを押すと、エラーがでてしまいます。
引用:
ArgumentError: Error #2025: 指定した DisplayObject は呼び出し元の子でなければなりません

これはa_mcに反応しているけどa_mcをremoveChildできないといってるのでしょうか?
...[中略]...
var a_mc:MovieClip=new a_mc_();
var b_mc:MovieClip=new b_mc_();

// addChild(a_mc);
a_mc.x = 30;
a_mc.y = 30;

// addChild(b_mc);
// b_mc.x = 80;
b_mc.x = 30;
// b_mc.y = 80;
b_mc.y = 30;

trace(b_mc.hitTestObject(a_mc));


----------------
 

koppe
Åê¹ÆNo.43091
投稿日時: 2009-8-7 8:22
半人前
居住地:
投稿: 57
使用環境:
WinXPsp3,Flashcs4
Re: removeChildしたmcにhitTestObjectが反応する
removeChild(a_mc);

で一度「勘当」しているので「removeChildできないといってる」のは理解できるのですが、私の疑問はそもそもなぜremoveChildしたはずのa_mcにhitTestObjectがtrueなのか?ということなのです。
以下が出力ですが

当たった
当たった
ArgumentError: Error #2025: 指定した DisplayObject は呼び出し元の子でなければなりません。

一回目の「当たった」でa_mcをremoveChildしました。
しかしそのa_mcに二回目もなぜか当たり、エラーが出ます。
二回目は当たらずに、エラーも出ない、そんな状態が目標です。

ひょっとしてremoveChildした物にhitTestObjectがtrueなのは当たり前なのでしょうか?
もしそうならa_mcが存在しなくする方法があるのでしょうか?
よろしくおねがいします。
ひろゆき
Åê¹ÆNo.43093
投稿日時: 2009-8-7 9:34
ちょんまげら
居住地: 東京砂漠
投稿: 4403
使用環境:
10.8.5

Flash Professional CS4/CS6/CC

Safari 6.1
Re: removeChildしたmcにhitTestObjectが反応する
引用:
koppeさんは書きました:
ひょっとしてremoveChildした物にhitTestObjectがtrueなのは当たり前なのでしょうか?
もしそうならa_mcが存在しなくする方法があるのでしょうか?
よろしくおねがいします。

確かめてみればよいのでは?

import flash.display.Shape;

var circle1:Shape = new Shape();
circle1.graphics.beginFill(0x0000FF);
circle1.graphics.drawCircle(40, 40, 40);
addChild(circle1);
var circle2:Shape = new Shape();
circle2.graphics.beginFill(0x00FF00);
circle2.graphics.drawCircle(40, 40, 40);
circle2.x = 50;
addChild(circle2);
trace(circle1.hitTestObject(circle2));

import flash.display.Shape;

var circle1:Shape = new Shape();
circle1.graphics.beginFill(0x0000FF);
circle1.graphics.drawCircle(40, 40, 40);
addChild(circle1);
var circle2:Shape = new Shape();
circle2.graphics.beginFill(0x00FF00);
circle2.graphics.drawCircle(40, 40, 40);
circle2.x = 50;
//addChild(circle2);
trace(circle1.hitTestObject(circle2));

import flash.display.Shape;

var circle1:Shape = new Shape();
circle1.graphics.beginFill(0x0000FF);
circle1.graphics.drawCircle(40, 40, 40);
addChild(circle1);
var circle2:Shape = new Shape();
circle2.graphics.beginFill(0x00FF00);
circle2.graphics.drawCircle(40, 40, 40);
circle2.x = 50;
//addChild(circle2);
circle2 = null;
trace(circle1.hitTestObject(circle2));

import flash.display.Shape;

var circle1:Shape = new Shape();
circle1.graphics.beginFill(0x0000FF);
circle1.graphics.drawCircle(40, 40, 40);
addChild(circle1);
var circle2:Shape = new Shape();
circle2.graphics.beginFill(0x00FF00);
circle2.graphics.drawCircle(40, 40, 40);
circle2.x = 50;
//addChild(circle2);
circle2 = null;
if (circle2)  trace(circle1.hitTestObject(circle2));


----------------
質問する際は、回答者に具体的な情報を与えてください。

koppe
Åê¹ÆNo.43096
投稿日時: 2009-8-7 16:27
半人前
居住地:
投稿: 57
使用環境:
WinXPsp3,Flashcs4
Re: removeChildしたmcにhitTestObjectが反応する
お返事ありがとうございます。

if (b_mc.hitTestObject(a_mc)) {
trace("当たった");
removeChild(a_mc);
}

のところを

if (a_mc) {
if (b_mc.hitTestObject(a_mc)) {
trace("当たった");
removeChild(a_mc);
a_mc=null;
}
}

に変更すればエラーが出ませんでした。
条件式の意味ですが、

もしa_mcが空でなければ{
そしてもしb_mcとa_mcが当たっていれば{
「当たった」表示;
表示リストからはずす;
a_mcを空にする;
}
}

といった解釈でよろしいでしょうか?

if (a_mc)

といった条件を使ったことが無いのでご確認お願いします。
ひろゆき
Åê¹ÆNo.43098
投稿日時: 2009-8-7 17:08
ちょんまげら
居住地: 東京砂漠
投稿: 4403
使用環境:
10.8.5

Flash Professional CS4/CS6/CC

Safari 6.1
Re: removeChildしたmcにhitTestObjectが反応する
引用:
koppeさんは書きました:
if (a_mc)

といった条件を使ったことが無いのでご確認お願いします。

ヘルプを活用しましょう。
null

F-site | if (condition=1)」なども参考になるでしょうか。



----------------
質問する際は、回答者に具体的な情報を与えてください。

koppe
Åê¹ÆNo.43102
投稿日時: 2009-8-8 6:39
半人前
居住地:
投稿: 57
使用環境:
WinXPsp3,Flashcs4
Re: removeChildしたmcにhitTestObjectが反応する
なるほどnullを入れたら条件がfalseになるのを利用するのですね...

ありがとうございました。
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ

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