HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2009
0823
白いコーヒー牛乳STGの当たり判定5解決


白いコーヒー牛乳

リンク

2009/8/23(Sun) 19:17:26|NO.27261

今、STGを作っていて弾に当たり判定を持たせようとしてるのですが
全部の弾に当たり判定がつきません・・・
判定をつけるヒントを教えてください、お願いします(T_T)

書き方がへたで、見づらいと思います・・


mx=190:my=320;自機の初期位置 dim tkx,30;これは敵のX値 tkx(0)=190 dim tky,30;これは敵のY値 tky(0)=0 dim etx,30;これは敵の弾のX値 etx(0)=190:etx(1)=190:etx(2)=190 etx(3)=190:etx(4)=190:etx(5)=190 etx(6)=190:etx(7)=190:etx(8)=190 dim ety,30;これは敵の弾のY値 ety(0)=100 ety(1)=100 ety(2)=100 tim=0 ////////////////////////////// screen 0,400,400 repeat tim+1 redraw 0 color 0,100,250:boxf font "MSゴシック",20 color 255 pos mx,my:mes "▲" color 0,0,0 pos 0,0:mes tim gosub *ziki_idou gosub *teki_koudou //敵に接触したら if (abs(mx-tkx)<5)&(abs(my-tky)<5) { pos 100,400:color 0,0,0:mes "あたった" } //弾に当たったら if (abs(mx-etx)<5)&(abs(my-ety)<5) { pos 100,400:color 0,0,0:dialog "あたった" } redraw 1 wait 5 loop *ziki_idou stick key,15 if key&1:mx-6 :if mx<0:mx=0 if key&2:my-6 :if my<0:my=0 if key&4:mx+6 :if mx>400:mx=400 if key&8:my+6 :if my>400:my=400 return *teki_koudou if tim>20:pos tkx(0),tky(0):mes "敵":tky(0)+3: if tky(0)>100:tky(0)=100 if tky(0)=100{ pos etx(0),ety(0):mes"◎":ety(0)+5 pos etx(1),ety(0)-5:mes"◎":etx(1)-1 pos etx(2),ety(0)-5:mes"◎":etx(2)+1 } if ety(0)>200{ pos etx(3),ety(1):mes"◎":ety(1)+5 pos etx(4),ety(1)-5:mes"◎":etx(4)-1 pos etx(5),ety(1)-5:mes"◎":etx(5)+1 } if ety(1)>200{ pos etx(6),ety(2):mes"◎":ety(2)+5 pos etx(7),ety(2)-5:mes"◎":etx(7)-1 pos etx(8),ety(2)-5:mes"◎":etx(8)+1 } return

if (abs(mx-etx)<5)&(abs(my-ety)<5)
       を
if (abs(mx-etx(2))<5)&(abs(my-ety(0))<5)
にすると1回目の右の弾にあたります・・



この記事に返信する


SYAM

リンク

2009/8/23(Sun) 20:22:14|NO.27262

配列変数の添え字( etx(2) だと 2 の部分 )を省略すると、添え字に 0 を指定したのと同じになります。
つまり、今のスクリプトでは常に 0 番目の弾とのあたり判定しかチェックしていないのです。
すべての弾とのあたり判定をチェックするには、弾の個数ぶんだけループして全部の弾と自機とのあたり判定をチェックする必要があります。



Sucret

リンク

2009/8/23(Sun) 20:57:03|NO.27263

ヒントではないのですが、一箇所エラーがあったので。

ゲームが始まってすぐに上に移動すると何故か何もない場所で「あたった」のダイアログが出てきます。
その場所は丁度敵の停止位置で、座標を見ると弾の発射地点でもあるみたいですが、
おそらく出現していない弾との衝突も判定していると思われます。



SYAM

リンク

2009/8/23(Sun) 21:03:26|NO.27265

同時に発射した弾の Y 座標をひとつの変数で使いまわしているようですが、キャラクターの座標はすべて別々に管理した方がよいでしょう。
そうすれば、どれがどれと同時に発射されたのかまで管理しなくてもよくなり、すべてのキャラクターについて同じ処理をするときに非常に簡単なスクリプトで書けるようになりますね。


#define MAX_ENEMY 32 dim x,MAX_ENEMY dim y,MAX_ENEMY dim vx,MAX_ENEMY dim vy,MAX_ENEMY repeat MAX_ENEMY x(cnt)=rnd(480) y(cnt)=rnd(480) vx(cnt)=rnd(5)-2 vy(cnt)=rnd(5)-2 loop px = 232 py = 300 pvx = 0 pvy = 0 screen 0,480,480,0 *MAIN_ROUTINE gosub *PLAYER_MOVE gosub *ENEMY_ROUTINE gosub *HIT_CHECK gosub *REDRAW_ROUTINE await 16 goto *MAIN_ROUTINE *PLAYER_MOVE stick s,15 pvx += ( ((s&4)!=0) - ((s&1)!=0) ) * 2 pvy += ( ((s&8)!=0) - ((s&2)!=0) ) * 2 px = px + pvx py = py + pvy pvx = pvx * 4 / 5 pvy = pvy * 4 / 5 return *ENEMY_ROUTINE repeat MAX_ENEMY x(cnt) += vx(cnt) if( (x(cnt)>=480) || (x(cnt)<=0) ) { vx(cnt) = -vx(cnt) } y(cnt) += vy(cnt) if( (y(cnt)>=480) || (y(cnt)<=0) ) { vy(cnt) = -vy(cnt) } loop return *HIT_CHECK repeat MAX_ENEMY if (abs(px-x(cnt)) < 8){ if(abs(py-y(cnt)) < 8){ dialog "Hit.",0 x(cnt)=rnd(480) y(cnt)=rnd(480) } } loop *REDRAW_ROUTINE redraw 0 color 0,0,0 boxf color 0,255,0 repeat MAX_ENEMY pos x(cnt),y(cnt) mes "猫" loop color 255,255,255 pos px,py mes "▲" redraw 1 return



GENKI

リンク

2009/8/23(Sun) 21:21:13|NO.27266




白いコーヒー牛乳

リンク

2009/8/24(Mon) 17:14:54|NO.27272

みなさん教えてくれてありがとうございます!
絶対完成させます^^



ONION software Copyright 1997-2023(c) All rights reserved.