メイン 迷える子羊の部屋【初心者専用】 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です。投稿なさったスクリプト全文を読んだわけではないのですが、ざ
っと拝見していて気になった点を一つ。
「敵」ってのはこのUFOのことですよね?で、上記のスクリプトで、そのUFOを attachMovieする際に使う変数としてufo_aが定義されていますね。その上で↓
赤字の部分で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」も消えてしまう・・・というようなことが起こってたりはしないでし ょうか? スクリプトをざっと読んだだけなので、長々と書いた割にまるっきり的はずれだっ たりしたらごめんなさい。
|
10-feet | Åê¹ÆNo.37257 投稿日時: 2008-1-21 19:17 |
新米 居住地: 投稿: 25
使用環境:
WinXp,Flash CS3 Pro,AS2.0 player8 |
Re: attachMovieで複製したMCがなぜか消える 早速の解答ありがとうございます。
引用:
正にコレでした・・・。 深度の値を変えたり、パスや複製する場所などを変えながら 試してみてたのですが、こういう意味だったとは。
の部分を丸ごと消して
を追加したら解決しました。 弾と敵の当たり判定を組む時にfor文を使おうと思い、 弾のMC名が無限に増えていくのをを防ぐ為にbulletMC0?2までと 制限をかけたのですが、それをそのまま使っていたのが 仇となってたみたいですね。うーむ、もっと理解しないとです。 わかりやすい内容でとても助かりました。 勉強になります。ありがとうございました! 1つ解決したおかげでまた新たな疑問が生まれました。
の弾の部分でも複製される名前に制限をかけてます。 これをしないと弾の名前が延々と増えていき、自分の腕では当たり判定を持たせられない為です。 ですがこれだと敵の複製・消滅と同じ理由で不具合が発生したりしますか? 自分で動かしている分には特に不具合らしきものは見られないもので・・・。 |
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フレーム
_root 第1フレーム
また、FlashPlayer8以降の書き出しであれば、 MovieClip.hitTest() を用いずに、BitmapDataを用いて当たり判定をする という手もあると思います。
|
10-feet | Åê¹ÆNo.37273 投稿日時: 2008-1-22 12:49 |
新米 居住地: 投稿: 25
使用環境:
WinXp,Flash CS3 Pro,AS2.0 player8 |
Re: attachMovieで複製したMCがなぜか消える 引用:
その通りですね。見落としてました。 書き込んでいただいたソースを打ち込んで試してみました。 段階が踏まれていて、とてもわかりやすかったです。 その中でいくつか疑問点がありました。
Number関数(初めて知りました) 調べてみたのですが、数値に変換する?という事が書かれていました。
上記のように書いても、出力などに違いが見られなかったです。 よろしければここでNumber関数を使う理由というのを教えてもらえないでしょうか? それと
for inというのは、指定されたMC(bulletField)の中にあるMC(bullet)の数だけ繰り返す。 という解釈でよろしいですか? 引用:
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さんは書きました: 上記はNumber関数を使っているのではなく、変数の型指定をしています。 Flash ActionScript入門ノート: 厳密な型指定 引用: for inというのは、指定されたMC(bulletField)の中にあるMC(bullet)の数だけ繰り返す。 「flash for in」でGoogle検索すると、野中先生の下記のページにたどり着きます。 FN0110003 - for...inループについて - Flash : テクニカルノート 引用: BitmapDataという関数もあるのですね。 BitmapDataクラスについては下記などを参照してみて下さい。 Flashゲーム講座&ASサンプル集【ビットマップデータについて】
|
ひろゆき | Åê¹ÆNo.37276 投稿日時: 2008-1-22 13:54 |
ちょんまげら 居住地: 東京砂漠 投稿: 4403
使用環境:
10.8.5 Flash Professional CS4/CS6/CC Safari 6.1 |
Re: attachMovieで複製したMCがなぜか消える 引用:
10-feetさんは書きました: これは、Number関数ではありません。データ型です。 変数の値がどのような種類のものかを指定したものです。 単に「a」というだけでは、その中身がどのようなものなのか分かりませんね。
この型指定がなくとも、問題はありません。 ただ、ActionScript2.0以降を用いるのであれば、ヘルプなどを見ても、 この型指定が幾度となく出てくるので、覚えておいて損はないでしょう。 また、型指定をすることで、矛盾するようなスクリプトの記述を防ぐことができたりもします。 引用:
まず、ヘルプで「for..in ステートメント」あたりをお読みください。 ムービークリップに限らず、for (... in A) で、 A(オブジェクト)上にあるプロパティに対して反復処理を行います。
などのようにも、使えます。 # 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 » |
スレッド表示 | 新しいものから | 前のトピック | 次のトピック | トップ |
投稿するにはまず登録を | |