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

パスワード:


パスワード紛失

新規登録
メインメニュー
メイン
   迷える子羊の部屋【初心者専用】
     attachMovieで複製したMCがなぜか消える
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
10-feet
Åê¹ÆNo.37254
投稿日時: 2008-1-21 17:58
新米
居住地:
投稿: 25
使用環境:
WinXp,Flash CS3 Pro,AS2.0
player8
attachMovieで複製したMCがなぜか消える
前回、初投稿した際の自分の発言で気分を害された人がいましたら、この場を借りて謝罪します。
無知でした。申し訳ないです。

それでは本題に入りたいと思います。
問題点:attachMovieで複製した弾と、同じくattachMovieで複製した敵がいます。
弾が敵に当たった瞬間、爆発してムービークリップ上から敵が消える仕様です。
この時に当たった敵以外の敵が爆発モーション無しで一緒に消えてしまう現象が起きて困っています。
爆発して消えた敵は再度複製されるのですが、弾に当たらずに消えた敵は複製されませんでした。
弾は3発(設定通りに)発射可能で、それぞれ存在する敵全てに当たり、当たれば消えます。
敵も最初は10体(設定通りに)出現します。
何が原因かわからない状態です。ご教授頂けたら幸いです。

以下がメイン上に置かれたMC(インスタンス名:roboBody)に書かれているASです。
尚、移動系のASは長くなるために省略しています。
<code>
onClipEvent (load) {
//attachMovie の名前、深度につかう変数
a = 0;
//ムービー上のミサイルの数を数える変数
bulletcounter = 0;
//ミサイルの最大連射数を持つ変数
maxbullet = 3;
}

onClipEvent(enterFrame){
//スペースキーが押された瞬間のみinput_xにtrueを入れる
if ( Key.isDown(Key.SPACE) && key_space == 0 ) {
input_x = true;
}

key_space = Key.isDown(Key.SPACE);

//input_xがtrueで、ムービー上の弾の数を数える変数bulletcounterrが
//最大連射数(maxbullet)より小さいときに{}内のスクリプト実行
if (input_x == true && bulletcounter<maxbullet){
//attachMovie()で弾のムービークリップを生成
bulletName = "bulletMC" + a;
_root.field.attachMovie("bullet", bulletName , a);

//生成したムービークリップを、発射キャラの位置に移動
_root.field[ bulletName ]._x = this._x - 3;
_root.field[ bulletName ]._y = this._y - 50;

fscommand("play_sound","0,1"); //発射音SE

//ミサイルが一発発射されたのでbulletcounterを1増やす
bulletcounter++;

//次attachMovieで使うための数字を1増やす、最大連射数に達したら深度を0に戻す
if (a < maxbullet){
a++;
}
else if (a == maxbullet){
a = 0;
}

input_x = false;
}
}
</code>

以下がライブラリにあるbullet(MC)に書かれているASです。
識別子は"bullet"です。
<code>
1フレーム目
this._y -=15;

2フレーム目
if ( this._y < -80 ) {
_root.roboBody.bulletcounter -= 1;
this.removeMovieClip();
} else {
this.gotoAndPlay(_currentframe-1);
}
</code>

そして以下がufoを出すためにメイン>field(インスタンス名)の中に設置したenemyStart(インスタンス名)に書いたASです。
<code>
onClipEvent (load) {
//attachMovie の名前、深度につかう変数
ufo_a = 0;
//ムービー上のufoの数を数える変数
ufocounter = 0;
//ufoの最大出現数を持つ変数
maxufo = 10;
}


onClipEvent(enterFrame){

if ( ufocounter<maxufo){
//attachMovie()でufoのムービークリップを生成
ufoName = "ufoMC" + ufo_a;
_root.field.map.attachMovie("ufo", ufoName , ufo_a);

_root.field.map[ufoName]._x = Math.floor( Math.random() * 300 ) + 35;
_root.field.map[ufoName]._y = Math.floor( Math.random() * -200 ) - 20;

//ufoが1体出現されたのでufocounterを1増やす
ufocounter++;

//次attachMovieで使うための数字を1増やす、最大出現数に達したら深度を0に戻す
if (ufo_a < maxufo){
ufo_a++;
}
else if (ufo_a == maxufo){
ufo_a = 0;
}
}

}
</code>

そして以下がライブラリのufo(MC)の"start(フレーム名)"に書かれたASです。
識別子は"ufo"です。
<code>
enMaxHitPoint = 1;
enHitPoint = enMaxHitPoint;
ufoSpeed = 2;


//UFOを左へ移動させ、画面から消えたら右に戻すファンクション
function ufoMove( ufoSpeed ){
this._y += ufoSpeed;

num1 = 650;

if( this._y > num1 ){
this._x = Math.floor( Math.random() * 300 ) + 35;
this._y = Math.floor( Math.random() * -200 ) - 50;
this.enHitPoint = enMaxHitPoint;
}

}

//プレーヤーの攻撃を受けたときの設定
function attacked(){

for (i = 0; i < 4; i++){

bullethit = "bulletMC" + i;

if (_root.field[ bullethit ] != null){
if( this._y > 30 ){
//bulletとthis(ufo)が触れていればtrueを返す
if( _root.field[ bullethit ].hitTest( this.ufo ) ){
this.enHitPoint -= 1;
_root.field[ bullethit ].removeMovieClip();
_root.roboBody.bulletcounter -= 1;
}
}
}

}

}

//ヒットポイントが0になったら消える
function dead(){
if( this.enHitPoint < 1 ){
_root.score += 100;
this.gotoAndPlay("dead");
}
}

this.stop();
</code>

そして以下がufo(MC)内の"dead(フレーム名)"の最後(爆発後)
に書かれたASです。
<code>
_root.field.enemyStart.ufocounter -= 1;
this.removeMovieClip();
</code>

最後に、ufo(MC)内の本体(レイヤー名)に置いたMC(インスタンス名は"ufo")に書いたASです。
<code>
onClipEvent(enterFrame){

_parent.ufoMove( _parent.ufoSpeed );

_parent.attacked();
_parent.dead();

}
</code>

関係ありそうな部分を全て載せた為、長くなってしまいました。
弾を出すために1度trueを入れているのは「そうしなくてはいけない」からです。
そこについての突っ込みは無しで・・・。
Tonpoo (gaienboy改め)
Åê¹ÆNo.37255
投稿日時: 2008-1-21 18:30
職人
居住地: 東京・神宮前
投稿: 717
使用環境:
Windows 7 Professional,
Flash CS5 Pro,
Flash Player 10,1,102,64
Re: attachMovieで複製したMCがなぜか消える
gaienboyです。投稿なさったスクリプト全文を読んだわけではないのですが、ざ
っと拝見していて気になった点を一つ。

onClipEvent (load) {
	//attachMovie の名前、深度につかう変数
	ufo_a = 0;
	(中略)
}

「敵」ってのはこのUFOのことですよね?で、上記のスクリプトで、そのUFOを
attachMovieする際に使う変数としてufo_aが定義されていますね。その上で↓

onClipEvent(enterFrame){
	if ( ufocounter<maxufo){
		//attachMovie()でufoのムービークリップを生成
		ufoName = "ufoMC" + ufo_a;
		_root.field.map.attachMovie("ufo", ufoName , ufo_a);
		(中略)
		//次attachMovieで使うための数字を1増やす、最大出現数に達したら深度を0に戻す
		if (ufo_a < maxufo){
			ufo_a++;
		}
		else if (ufo_a == maxufo){
			ufo_a = 0;
		}
	}
}


赤字の部分でufo_aのレベルにufoのムービークリップをattachMovieしています。
さらにその後、青字の部分で、その後のattachMovieに備え、ufo_aをインクリメ
ントしていますが、緑字の部分で一定の条件が揃った時にufo_aの値をリセットし
ています。

ここでufo_aの値をリセットしてしまっているために、同じ名前を持つインスタン
スが複数存在することになってしまい、不具合が起こってるのかもしれないと思っ
たのですが、どうでしょう。例えば、たぶん初期段階では

ufoMC0
ufoMC1
ufoMC2
・・・

とattachMovieされていきますよね。で、maxufoの値が10なので、11回以上
attachMovieされた場合、

・・・
ufoMC9
ufoMC10
ufoMC0
・・・

と、またufoMC0が出現することになります。もちろん、maxufoの値以上の数の
ufoが同時に出現することの無いように、「10体attachMovieされたら、一旦複製
処理を停止し、そのうちの何体かが撃墜されたら、撃墜された分だけまた
attachMovieする」というような処理になっていることとは思います。

ただ、必ずしもufoMC0から順番に撃墜されるわけでないとすれば、例えば
ufoMC5が撃墜されたとしても、次にattachMovieされるufoの名前はufoMC0にな
ってしまいます。すると、「ufoMC0」が同時に複数存在することになります。こ
のときに片方の「ufoMC0」が撃墜されると、同じ名前を持つもう片方の
「ufoMC0」も消えてしまう・・・というようなことが起こってたりはしないでし
ょうか?

スクリプトをざっと読んだだけなので、長々と書いた割にまるっきり的はずれだっ
たりしたらごめんなさい。


----------------
Tonpoo (a.k.a. gaienboy)
Tonpoo.com / TONPOOBLOG / twitter@tonpootwit

10-feet
Åê¹ÆNo.37257
投稿日時: 2008-1-21 19:17
新米
居住地:
投稿: 25
使用環境:
WinXp,Flash CS3 Pro,AS2.0
player8
Re: attachMovieで複製したMCがなぜか消える
早速の解答ありがとうございます。

引用:

gaienboyさんは書きました:
ただ、必ずしもufoMC0から順番に撃墜されるわけでないとすれば、例えば
ufoMC5が撃墜されたとしても、次にattachMovieされるufoの名前はufoMC0にな
ってしまいます。すると、「ufoMC0」が同時に複数存在することになります。こ
のときに片方の「ufoMC0」が撃墜されると、同じ名前を持つもう片方の
「ufoMC0」も消えてしまう・・・というようなことが起こってたりはしないでし
ょうか?



正にコレでした・・・。
深度の値を変えたり、パスや複製する場所などを変えながら
試してみてたのですが、こういう意味だったとは。


if (ufo_a < maxufo){
	ufo_a++;
}
else if (ufo_a == maxufo){
	ufo_a = 0;
}


の部分を丸ごと消して


ufo_a++;


を追加したら解決しました。

弾と敵の当たり判定を組む時にfor文を使おうと思い、
弾のMC名が無限に増えていくのをを防ぐ為にbulletMC0?2までと
制限をかけたのですが、それをそのまま使っていたのが
仇となってたみたいですね。うーむ、もっと理解しないとです。
わかりやすい内容でとても助かりました。
勉強になります。ありがとうございました!

1つ解決したおかげでまた新たな疑問が生まれました。

//次attachMovieで使うための数字を1増やす、最大連射数に達したら深度を0に戻す
if (a < maxbullet){
	a++;
}
else if (a == maxbullet){
	a = 0;
}

の弾の部分でも複製される名前に制限をかけてます。
これをしないと弾の名前が延々と増えていき、自分の腕では当たり判定を持たせられない為です。
ですがこれだと敵の複製・消滅と同じ理由で不具合が発生したりしますか?
自分で動かしている分には特に不具合らしきものは見られないもので・・・。
10-feet
Åê¹ÆNo.37258
投稿日時: 2008-1-21 19:33
新米
居住地:
投稿: 25
使用環境:
WinXp,Flash CS3 Pro,AS2.0
player8
Re: attachMovieで複製したMCがなぜか消える
不具合が発生しました(汗)
弾が2発しか発射されなくなりました。
恐らく1発だけしか発射されない状態にもなると思います。

原因は先程の「消える理由」と同じだと思っています。
先程教えてくださった事を頭に入れ、自分で解決しようと思います。
ありがとうございました!!
ひろゆき
Åê¹ÆNo.37263
投稿日時: 2008-1-22 1:29
ちょんまげら
居住地: 東京砂漠
投稿: 4403
使用環境:
10.8.5

Flash Professional CS4/CS6/CC

Safari 6.1
Re: attachMovieで複製したMCがなぜか消える
引用:
10-feetさんは書きました:
前回、初投稿した際の自分の発言で気分を害された人がいましたら、この場を借りて謝罪します。
無知でした。申し訳ないです。

であれば、マルチポスト先にもフィードバックされた方が良いのでは?


引用:
弾の部分でも複製される名前に制限をかけてます。
これをしないと弾の名前が延々と増えていき、自分の腕では当たり判定を持たせられない為です。

field 上に、弾専用のムービークリップを生成した上で、
for in で、チェックすれば、弾のインスタンス名に制限をかける必要はないのではないでしょうか?


新規ファイルにて、テスト。
ライブラリに、ムービークリップ(リンケージ識別子: bullet) を用意。

_root 第1フレーム
this.createEmptyMovieClip("bulletField", 1);
for (var n:Number = 0; n < 4; n++) {
	bulletField.attachMovie("bullet", "bullet"+n, n);
}
checkBullet();

function checkBullet():Void {
	for (var n:String in bulletField) {
		trace(n);
	}
}
で、ムービープレビュー。

this.createEmptyMovieClip("bulletField", 1);
for (var n:Number = 0; n < 4; n++) {
	bulletField.attachMovie("bullet", "bullet"+n, n);
}
checkBullet();

bulletField.bullet2.removeMovieClip();
trace("bullet2を削除");
checkBullet();

function checkBullet():Void {
	for (var n:String in bulletField) {
		trace(n);
	}
}
で、ムービープレビュー。

_root 第1フレーム
this.createEmptyMovieClip("bulletField", 1);
var a:Number = 0;
for (var n:Number = 0; n < 4; n++) {
	createBullet();
}
checkBullet();

bulletField.bullet1.removeMovieClip();
bulletField.bullet2.removeMovieClip();
createBullet();
trace("bullet1,2を削除してbullet4を追加");
checkBullet();

function createBullet():Void {
	bulletField.attachMovie("bullet", "bullet"+a, a);
	a++;
}
function checkBullet():Void {
	for (var n:String in bulletField) {
		trace(n);
	}
}
で、ムービープレビュー。


また、FlashPlayer8以降の書き出しであれば、
MovieClip.hitTest() を用いずに、BitmapDataを用いて当たり判定をする
という手もあると思います。


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

10-feet
Åê¹ÆNo.37273
投稿日時: 2008-1-22 12:49
新米
居住地:
投稿: 25
使用環境:
WinXp,Flash CS3 Pro,AS2.0
player8
Re: attachMovieで複製したMCがなぜか消える
引用:

ひろゆきさんは書きました:
であれば、マルチポスト先にもフィードバックされた方が良いのでは?

その通りですね。見落としてました。

書き込んでいただいたソースを打ち込んで試してみました。
段階が踏まれていて、とてもわかりやすかったです。
その中でいくつか疑問点がありました。


var a:Number = 0;

Number関数(初めて知りました)
調べてみたのですが、数値に変換する?という事が書かれていました。

var a = 0;

上記のように書いても、出力などに違いが見られなかったです。
よろしければここでNumber関数を使う理由というのを教えてもらえないでしょうか?
それと


for (var n:String in bulletField) {
	trace(n);
}

for inというのは、指定されたMC(bulletField)の中にあるMC(bullet)の数だけ繰り返す。
という解釈でよろしいですか?


引用:

また、FlashPlayer8以降の書き出しであれば、
MovieClip.hitTest() を用いずに、BitmapDataを用いて当たり判定をする
という手もあると思います。

BitmapDataという関数もあるのですね。
こちらも初めて知ったので、これから勉強してみます。
Tonpoo (gaienboy改め)
Åê¹ÆNo.37275
投稿日時: 2008-1-22 13:54
職人
居住地: 東京・神宮前
投稿: 717
使用環境:
Windows 7 Professional,
Flash CS5 Pro,
Flash Player 10,1,102,64
Re: attachMovieで複製したMCがなぜか消える
gaienboyです。横レス失礼します。

引用:
10-feetさんは書きました:

var a:Number = 0;

Number関数(初めて知りました)
調べてみたのですが、数値に変換する?という事が書かれていました。

var a = 0;

上記のように書いても、出力などに違いが見られなかったです。
よろしければここでNumber関数を使う理由というのを教えてもらえないでしょうか?

上記はNumber関数を使っているのではなく、変数の型指定をしています。

Flash ActionScript入門ノート: 厳密な型指定

引用:
for inというのは、指定されたMC(bulletField)の中にあるMC(bullet)の数だけ繰り返す。
という解釈でよろしいですか?

「flash for in」でGoogle検索すると、野中先生の下記のページにたどり着きます。

FN0110003 - for...inループについて - Flash : テクニカルノート

引用:
BitmapDataという関数もあるのですね。
こちらも初めて知ったので、これから勉強してみます。

BitmapDataクラスについては下記などを参照してみて下さい。

Flashゲーム講座&ASサンプル集【ビットマップデータについて】


----------------
Tonpoo (a.k.a. gaienboy)
Tonpoo.com / TONPOOBLOG / twitter@tonpootwit

ひろゆき
Åê¹ÆNo.37276
投稿日時: 2008-1-22 13:54
ちょんまげら
居住地: 東京砂漠
投稿: 4403
使用環境:
10.8.5

Flash Professional CS4/CS6/CC

Safari 6.1
Re: attachMovieで複製したMCがなぜか消える
引用:
10-feetさんは書きました:
var a:Number = 0;

Number関数(初めて知りました)

これは、Number関数ではありません。データ型です。
変数の値がどのような種類のものかを指定したものです。

単に「a」というだけでは、その中身がどのようなものなのか分かりませんね。
var a:Number = 1;
var b:String = "Test";
var c:Boolean = false;
var a:MovieClip;

この型指定がなくとも、問題はありません。
ただ、ActionScript2.0以降を用いるのであれば、ヘルプなどを見ても、
この型指定が幾度となく出てくるので、覚えておいて損はないでしょう。
また、型指定をすることで、矛盾するようなスクリプトの記述を防ぐことができたりもします。

引用:
for (var n:String in bulletField) {
	trace(n);
}

for inというのは、指定されたMC(bulletField)の中にあるMC(bullet)の数だけ繰り返す。
という解釈でよろしいですか?

まず、ヘルプで「for..in ステートメント」あたりをお読みください。

ムービークリップに限らず、for (... in A) で、
A(オブジェクト)上にあるプロパティに対して反復処理を行います。

var list:Object = new Object();
list = {a: "1番目", b; "2番目", d: 4};
trace(list.a);
trace(list.b);
trace(list.c);

var list:Object = new Object();
list = {a: "1番目", b; "2番目", d: 4};
for (var n:String in list) {
	trace(n);
	trace(list[n]);
}

などのようにも、使えます。

# gaienboyさんが挙げておられるリンク先を何度も読み返されると良いでしょう。
# 最初のうちは、慣れなくて、よく分かりませんが、
# 分からないと言って、手をつけなければ、近づくことすらできませんね。


引用:
BitmapDataという関数もあるのですね。

関数ではなくて、クラスですね。

BitmapDataで衝突判定 (2)
BitmapDataで衝突判定 (3)


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

10-feet
Åê¹ÆNo.37279
投稿日時: 2008-1-22 15:08
新米
居住地:
投稿: 25
使用環境:
WinXp,Flash CS3 Pro,AS2.0
player8
Re: attachMovieで複製したMCがなぜか消える
gaienboyさん、ひろゆきさん
丁寧な解答ありがとうございます。

データ型について、ある程度理解できたと思います。
カギを用意して、カギ穴に合ったカギじゃないとダメという事ですね。

教えて頂いたサイトも勉強になります。

for..inについては・・・もうちょっとかかりそうですが
先程よりはわかってきたと思います。
お二人のおかげです。

まずはfor..inとhitTestを利用して、弾と敵の当たり判定の部分に取り掛かろうと思います。
それが出来て、理解してから、BitmapDataを学んでみたいと思います。
軽く読んでみた感じだと色々と応用が利きそうな感じで
使いこなせれば楽しくなりそうです。

今回は本当にありがとうございました。
また機会があればよろしくお願いします。
ひろゆき
Åê¹ÆNo.37280
投稿日時: 2008-1-22 15:24
ちょんまげら
居住地: 東京砂漠
投稿: 4403
使用環境:
10.8.5

Flash Professional CS4/CS6/CC

Safari 6.1
Re: attachMovieで複製したMCがなぜか消える
引用:
10-feetさんは書きました:
データ型について、ある程度理解できたと思います。
カギを用意して、カギ穴に合ったカギじゃないとダメという事ですね。

あまり早急に分かった気にならない方が良いように思います。


変数は箱に例えられることがありますが、
型指定していない場合は、
この変数の箱が箱ではなく、袋だと考えてもいいでしょう。

袋に入れる値がどのような形(数値だとか文字列だとか)であっても、
袋は形を変えることができるので、その値を入れることはできます。

しかし、変数が型指定してある箱だとすると、
その箱の形によって、箱に入れる値には制限がつきます。
数値の形をした箱には、数値しか入れられない。
なので、ここに、入れてはいけない文字列を入れようとすると、
エラーが生じます。間違った形の値を入れようとしていることが分かります。

カギのように、個々に対応しているようなものと考えるよりは、
箱の種類が異なるくらいの大枠の分類だと考えた方が良いように思います。


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

(1) 2 »
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ

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