貫通弾の当たり判定
投稿者 : がり(1-154-93-120.mexne.jp)
- 2009/09/09(Wed) 23:57
No.12519
|
|
|
|
|
敵キャラにHPを設定したシューティングを作成している者です。
敵を貫通する弾を作ったのですが、弾が通過中にフレーム毎で当たり判定を拾ってしまいます。 よって設定以上のダメージを与えることになってしまいます。
とりあえず、敵側に for (t in $chars) {// if (t is tama && crashTo(t) && hidan!=t){ //tama=攻撃弾の親クラス hidan=t; HP-=$jiki.attack * t.damage; //$jiki=自機 $jiki.attack=自機の攻撃力 damege=弾の攻撃力 } というものを組み込んでみました。
コレだと一見問題が解決したかに見えますが、 同種の弾が敵に同時に当たると、案の定フレーム毎でhidan内のtが入れ替わり、 当たり判定をフレーム毎で拾ってしまいます。
解りづらくてすみませんが、同種の弾が同時に当たっても それぞれの当たり判定を一度だけ拾う形で貫通するにはどうしたら良いのでしょうか?
|
Re: 貫通弾の当たり判定
投稿者 : ロンド(flh1aas245.iba.mesh.ad.jp)
- 2009/09/10(Thu) 12:07
No.12520
|
|
|
|
これで動きました。 ↓敵と弾のプログラム
//=========================== // 敵 //=========================== extends DxChar;
HP = 10; // HP初期化
while(! screenOut()) { for (t in $chars) { if (t is tama && crashTo(t)){ hitFlg = 1; // 当り判定フラグ初期化 1=当たる 0=当たらない for(e in t.hitArray) { // 弾の配列を全て見る if(e == this){ // 配列内に自分があれば hitFlg = 0; // 当たらないフラグを立てる break; } } if(hitFlg == 1){ // 弾の配列内に自分がなかった場合 t.hitArray.add(this); // 弾の配列に自分を追加 HP--; // 当り判定の処理 } } } drawtext(x,y-30,HP,$clWhite,12); // HP表示 update(); } //=========================== // 弾 //=========================== extends DxChar;
constructor tama(x,y,p) { super(x,y,p); hitArray = new array(); // 配列に接触した敵を格納する }
while(! screenOut()) { x += 10; // 配列を表示 for(i=0; i<hitArray.size(); i++) { drawText(20, 20+(i*20), hitArray.get(i), $clWhite, 12); } update(); }
弾オブジェクトの配列に接触した敵を格納し、当り判定のときにその配列を見てます。 配列内に自分(敵)がなければ当り判定の処理をし、あればスルーします。
注意点としては、constructor tama()の中で配列を生成しないと jikiとenemyが接触してる状態(いわゆるゼロ距離発射)で弾を発射したときにエラーが起きてしまうことです。 (配列が生成される前に当り判定で配列を見ようとするため)
|
Re: 貫通弾の当たり判定
投稿者 : がり(1-154-93-120.mexne.jp)
- 2009/09/10(Thu) 21:03
No.12521
|
|
|
|
ご回答ありがとうございます。 早速やってみます。
こちらは途方にくれていたところでした。 本当にありがとうございます。
|
Re: 貫通弾の当たり判定
投稿者 : OceanLight(nthkid196169.hkid.nt.ftth.ppp.infoweb.ne.jp)
- 2009/09/12(Sat) 12:28
No.12522
|
|
|
|
for(e in t.hitArray) { // 弾の配列を全て見る if(e == this){ // 配列内に自分があれば hitFlg = 0; // 当たらないフラグを立てる break; } }
は処理が重いので、
if(t.hitArray.indexOf(this)!=-1){ //indexOf;配列の中に()の要素が無ければ-1 hitFlg = 0; }
に置き換えても動くと思います。
|
勉強になります
投稿者 : ロンド(flh1aas245.iba.mesh.ad.jp)
- 2009/09/12(Sat) 17:32
No.12523
|
|
|
|
たしかに、その方が処理が軽いし見た目もスマートになりますね。動作も問題ありませんでした。
|
|