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

パスワード:


パスワード紛失

新規登録
メインメニュー
メイン
   迷える子羊の部屋【初心者専用】
     自身でremoveChildしたインスタンスの接触判定だけが残ってしまう?
投稿するにはまず登録を

フラット表示 前のトピック | 次のトピック
投稿者 スレッド
Masamune_Y
Åê¹ÆNo.48459
投稿日時: 2011-12-23 2:28
新米
居住地: 東京
投稿: 21
使用環境:
オンライン
自身でremoveChildしたインスタンスの接触判定だけが残ってしまう?
とりあえず入門用書籍を読み終わり、練習作としてゲームっぽい動作をするものを1から作ってみていたのですが、
途中不可解な動作が起きてしまい原因に見当が付かないので、どなたかご指南願えますでしょうか。

作成していたのは、シューティングゲームの基本動作部の様なモノで、
自機と自弾、敵に見立てたブロックをそれぞれカスタムクラスとして作成し、
ブロックのみをオーサリングで配置しました。
http://csf.artisania.net/stg_00.html
※クリックで自弾の発射を開始、20HITでブロック消去
※音が出ます


自弾とブロックの接触でブロック内の変数を減らし、
0になった時点でブロックが自身でremoveChildを行い、消去したいのですが、
その時に見た目上は消えるのですがその場に判定が残ってしまっています。
タイムラインのアクションからブロックをtraceしてみても、見た目が消えた後も[object Block]のままなので、消えていないようです。

おそらく問題があるのが、自弾かブロックのどちらかの記述だと思うのですが…

自弾のクラス
package CLSs {
	
	import flash.events.*;
	import flash.display.*; 

	public class Shot_P1 extends MovieClip {
		private var TimeLine_mc:MovieClip;
		var MP3_Kin:Kin_mp3 = new Kin_mp3();
		var kin_d:Boolean = true;
		public function Shot_P1(Get_mc:MovieClip) {
			TimeLine_mc = Get_mc;
			addEventListener(Event.ENTER_FRAME, Shoot);
		}
				
		private function Shoot(e:Event):void{
			if (this.hitTestObject(TimeLine_mc.BLOCK)){
				if(kin_d){MP3_Kin.play(0,1); kin_d = false; TimeLine_mc.BLOCK.$durability--;}
				this.scaleX = this.scaleY += 0.15;
				this.alpha -= 0.1;
				if(this.scaleX > 3){
					stage.removeChild(this);
					removeEventListener(Event.ENTER_FRAME, Shoot);
				}
			}
			else if (this.y > stage.y){
				this.y -=  15;
			}
			else if (this.y < stage.y + 1){
				stage.removeChild(this);
				removeEventListener(Event.ENTER_FRAME, Shoot);
			}
		}
	}
}


ブロックのクラス
package CLSs {
	
	import flash.display.MovieClip;
	import flash.events.*;
	import flash.geom.ColorTransform;
	
	public class Block extends MovieClip {
		public var $durability:int = 20;
		private var _$durability:int = $durability;
		public var $c:int = 0;
		
		public function Block() {
			addEventListener(Event.ENTER_FRAME, Hit);
		}
		private function Hit(e:Event):void{
			if($durability < 1){
//				ここがとても怪しげ?
				this.parent.removeChild(this);
				removeEventListener(Event.ENTER_FRAME, Hit);
			}
			else if($durability < _$durability){
				$c = 100;
				_$durability = $durability;
			}
			else if($c > 0){
				var color:ColorTransform = new ColorTransform( 1, 1, 1, 1, $c, $c, $c, 0);
				this.transform.colorTransform = color;
				$c -= 5;
			}
		}
	}
}


なんとなく怪しげなのがremoveChild時に
this.parent.
と指定している事だと思うのですが、このままではstage.で指定する事が出来ないようで、
オーサリングで配置したので位置の参照を渡す方法もわからず、(配置したものについては基本的に必要無い…と思っていたのですが)
また、見た目だけ消えるという動作が意味不明で、混乱しています。

解決方法と、出来ればなぜ見た目だけが消えるという動作になったのかをお教え下さいませんでしょうか。
よろしくお願い致します。
フラット表示 前のトピック | 次のトピック

題名 投稿者 日時
 » 自身でremoveChildしたインスタンスの接触判定だけが残ってしまう? Masamune_Y 2011-12-23 2:28
     Re: 自身でremoveChildしたインスタンスの接触判定だけが残ってしまう? vader 2011-12-23 15:29
       Re: 自身でremoveChildしたインスタンスの接触判定だけが残ってしまう? Masamune_Y 2011-12-23 17:45
     Re: 自身でremoveChildしたインスタンスの接触判定だけが残ってしまう? mayor 2011-12-23 15:31
       Re: 自身でremoveChildしたインスタンスの接触判定だけが残ってしまう? Masamune_Y 2011-12-23 17:46
         Re: 自身でremoveChildしたインスタンスの接触判定だけが残ってしまう? Fumio 2011-12-23 23:48
           Re: 自身でremoveChildしたインスタンスの接触判定だけが残ってしまう? Masamune_Y 2011-12-24 2:09

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