- ベストアンサー
深度とhittestとは?
- 深度とhittestについて調べてみたが解決できず質問する。
- 弾を撃って当たったら両方消える処理を実装するために深度を考慮する必要がある。
- しかし、深度を考慮すると連射ができなくなってしまう問題が発生している。解決策を教えて欲しい。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
一応確認ですが 以下の様にして動きませんか? 当方でFLASH 8(as 2),FLASH 6(as 1)で書き出した所、動く様ですが。 //jikiのMCの中に書くスクリプト onClipEvent (load) { a = 1; count = 1; } onClipEvent (enterFrame) { //jiki.attachMovie("tama", "tama"+a, a); if (Key.isDown(Key.SPACE)) { _root.attachMovie("tama", "tama"+a, a); _root["tama"+a]._x =this._x; _root["tama"+a]._y = this._y; a++; } } // //ライブラリ内のtamaのフレームに書くスクリプト this.onEnterFrame = function() { this._x+=10;//tamaの移動 if (this.hitTest(_root.teki)) { trace("hit") this.removeMovieClip(); _root.teki.removeMovieClip(); } }; 変数aについてですが、 jikiのMCにaと書くと jikiのa(_rootで表現すると_root.jiki.a)と認識され tekiのMCにaと書くと tekiのa(_rootで表現すると_root.teki.a)と認識され それぞれ別の変数として扱われます。 同じ変数として扱うのであれば_root.aとして下さい。 (jikiのaをそのままにし、tekiのaを_root.jiki.aとしても可。逆も可) ただし、_root.aとすると 最後のtamaのみしか、判定がされなくなります。 a=15の時、14以下は無視されます。 (tekiが一体であれば、上記のスクリプトの様に tamaの方で当たり判定を行えば問題ありません) 画面上にあるtamaを全てを判定するにはいくつか手段があります。 とりあえず今回は配列を使用して、tamaをリスト化して判定してみます。 // //jikiのMC内のスクリプト onClipEvent (load) { _root.a = 1; count = 1; //スクリーンにあるtamaのリストです。 _root.tama_list=new Array(); } onClipEvent (enterFrame) { //jiki.attachMovie("tama", "tama"+a, a); if (Key.isDown(Key.SPACE)) { _root.attachMovie("tama", "tama"+_root.a, _root.a); _root["tama"+_root.a]._x =this._x; _root["tama"+_root.a]._y = this._y; //tamaを配置したらリストに追加する _root.tama_list.push(_root["tama"+_root.a]); _root.a++; } } // //tekiのMC内のスクリプト onClipEvent (enterFrame) { //リストにあるtamaの数だけ判定する for (var i = 0; i<=_root.tama_list.length; i++) { if (this.hitTest(_root.tama_list[i])) { trace(_root.tama_list[i]); _root.tama_list[i].removeMovieClip(); //tamaを削除したらリストからも削除する。 //もしtamaの方で画面外など消す場合には同じスクリプトを挿入する _root.tama_list.splice(i,1); this.removeMovieClip(); } } }
その他の回答 (1)
- sjt2007
- ベストアンサー率25% (3/12)
8行目、 jiki.attachMovieClip("tama","tama"+a,a) とありますが jikiのMCの中に弾を配置する事になっています。 jikiではなく、_rootに置けば期待通りになると思います。 _root.attachMovieClip("tama","tama"+a,a) もう一点、 tamaのスクリプトというのは tamaのMCのタイムラインに書いてあるのですか? そうであれば tekiというのはtamaのMC内にあるtekiを指してしまっています。 実際にはtekiは_rootにありますよね? 以下の様に書けばよろしいかと思います。 if(this.hittest(_root.teki)){ _root.teki.removeMovieClip(); this.removeMovieClip(); } this.removeMovieClip()を 先に実行してしまうと MCが消えてしまうので teki.removeMovieClip();が実行されません。 その為、順を変えました。
お礼
回答ありがとうございます。変更してみました。 が、上手く動きませんでした。 //メインのタイムラインにおいてある「jiki」の中にかいてあるスクリプト onClipEvent(load){ function shotting(){ a=1; if(Key.isDown(Shot_Key_code)){ _root.attachMovie("tama","tama"+a , a); _root["tama"+a]._x = this._x; _root["tama"+a]._y = this._y; trace("tama"+a); a++; } onClipEvent(enterFrame){ shotting(); } //敵の中に書いてあるスクリプト(ライブラリの中にあります) if (this.hitTest(_root["tama"+a])) { _root["tama"+a].removeMovieClip(); this.removeMovieClip(); trace("hit"); } です。敵の中のスクリプト _root["tama"+a]の部分でaの部分を10に変更して試してみたところ、10発目の玉はキチンと当たり判定が出ました。なので、このaの部分が問題なのだとは思うのですが、どのようにしたらいいのかわかりません。 もし、このようにしてみたらいかが?という意見がありましたら教えていただきたいです。宜しくお願いします。
お礼
動作確認までしてもらってありがとうございます。 無事動作しました。 本当にありがとうございます。