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


HSPTV!掲示板


未解決 解決 停止 削除要請

2011
1219
まぁしぃ当たり判定の意味不明な当たり6未解決


まぁしぃ

リンク

2011/12/19(Mon) 01:19:10|NO.43839

こんばんわ!!

前に書き込みをさせていただいたまぁしぃです。

ただ今 HSP3を使用して横スクロールのシューティングゲームを
作成しているのですが、前によしこっからは自分でやる!!
と思ったのですが・・・

もう何を消しても何を足しても当たり判定がおかしなことになってしまいました・・・

簡単に説明しますと

敵に当たる

敵&弾が消滅

次の敵が表示

前回の敵と違う座標で勝手に消滅

カウント関数をいろんなところにわけがわからず使っていたのですが
すべて消去してやってみてもだめでした・・・

なぜこんなことになってしまうのかがさっぱりわかりません・・・

正直すべてプログラムを見て、見やすくするこつや
こんなことやってみたらなどのアイデアをいただけたらと
思ったのですが今すべての文を見たら 580行をこえていたので
さすがに張るわけにはいかないので、当たり判定の部分を張らせていただきます;;

ヒントでもかまいません;;  おしえてください;;


//当たり判定(敵機1) if teki = 1{ if ( ( (tama_x+10) >= teki_x && (tama_x+10) <= teki_x + 40) || ( teki_x >= (tama_x+10) && teki_x <= (tama_x+10)+23)){ //敵 || 自弾 if ( ( (tama_y+15) >= teki_y && (tama_y+15) <= teki_y + 40) || ( teki_y >= (tama_y+15) && teki_y <= (tama_y+15)+8)){ //敵 || 自弾 teki = 0 tama = 0 } } } if teki = 1{ if ( ( (teki_x+5) >= (x+10) && (teki_x+5) <= (x+10) + 20) || ( (x+10) >= (teki_x+5) && (x+10) <= (teki_x+5) + 30)){ //敵 || 自機 if ( ( (teki_y+5) >= (y+10) && (teki_y+5) <= (y+10) + 20) || ( (y+10) >= (teki_y+5) && (y+10) <= (teki_y+5) + 30)){ //敵 || 自機 jiki-- teki = 0 } } }

x = 自機のX座標
y = 自機のY座標
teki_x = 敵のX座標
teki_y = 敵のY座標
tama_x = 自機弾のX座標
tama_y = 自機弾のY座標



この記事に返信する


通りすがり

リンク

2011/12/19(Mon) 11:38:00|NO.43841

当たりの処理に関する基本的な方法が分かって無い様に見受けられたので
自機、敵、弾を色違いのブロックで表した簡単な当たり判定のサンプルを書いてみました。
十字キーによる移動とスペースキーによる弾の発射が出来ます。
頑張って解読してみてください。

jiki_size = 32 ; 自機の大きさ jiki_speed = 1 ; 自機の移動スピード jiki_posx = (GINFO_WINX - jiki_size) / 2 ; 自機の位置座標・横 jiki_posy = GINFO_WINY - jiki_size - 100 ; 自機の位置座標・縦 teki_size = 64 ; 敵の大きさ teki_posx = (GINFO_WINX - teki_size) / 2 ; 敵の位置座標・横 teki_posy = 100 ; 敵の位置座標・縦 tama_size = 16 ; 自機弾の大きさ tama_speed = 5 ; 自機弾の発射スピード tama_posx = -tama_size ; 自機弾の位置座標・横 tama_posy = -tama_size ; 自機弾の位置座標・縦 tama_flg = 0 ; 自機弾の発射フラグ *MAINLOOP // 自機移動 stick key_arrow, 15 if (key_arrow & 1) ! 0 :jiki_posx -= jiki_speed if (key_arrow & 2) ! 0 :jiki_posy -= jiki_speed if (key_arrow & 4) ! 0 :jiki_posx += jiki_speed if (key_arrow & 8) ! 0 :jiki_posy += jiki_speed // 弾移動 if tama_flg = 1 { if tama_posy < -tama_size :tama_flg = 0 tama_posy -= tama_speed } // 弾発射 getkey key_space, 32 if key_space = 1 & tama_flg = 0 { tama_flg = 1 tama_posx = jiki_posx + (jiki_size - tama_size) / 2 tama_posy = jiki_posy - tama_size } redraw 0 color 255, 255, 255 :boxf // 敵表示 color 255, 0, 0 pos teki_posx, teki_posy boxf teki_posx, teki_posy, teki_posx + teki_size - 1, teki_posy + teki_size - 1 // 自機表示 color 0, 0, 255 pos jiki_posx, jiki_posy boxf jiki_posx, jiki_posy, jiki_posx + jiki_size - 1, jiki_posy + jiki_size - 1 // 弾表示 if tama_flg = 1 { color 0, 255, 0 pos tama_posx, tama_posy boxf tama_posx, tama_posy, tama_posx + tama_size - 1, tama_posy + tama_size - 1 } // 敵と自機弾の接触判定 if (teki_posx < tama_posx + tama_size) & (teki_posx + teki_size > tama_posx) { if (teki_posy < tama_posy + tama_size) & (teki_posy + teki_size > tama_posy) { color 0, 0, 0 pos teki_posx, teki_posy mes "当たった" }} redraw 1 await 32 goto *MAINLOOP
そんな事は分かってるって場合はあれだけでは分かりませんので
もう少し詳しく質問した方が良いと思います。



まぁしぃ

リンク

2011/12/19(Mon) 23:36:45|NO.43853

ありがとうございます!!

正直当たり判定に関しては恥ずかしながらほぼ理解は0に近いものです・・・
のせていただいたプログラムをしっかりみて理解できるように努力します!!



mmo

リンク

2011/12/20(Tue) 08:31:40|NO.43854

自分がいつも書く簡単な当たり判定の仕方は

size=32 dx=tama_x-teki_x dy=tama_y-teki_y if (dx<0):dx=-dx if (dy<0):dy=-dy if ((dx<size)&(dy<size)):mes "弾が敵に当たった" size=32 dx=jiki_x-teki_x dy=jiki_y-teki_y if (dx<0):dx=-dx if (dy<0):dy=-dy if ((dx<size)&(dy<size)):mes "プレイヤーと敵が接触"

こんな感じで判定する物同士の座標を引いてsize(仮に32)以内の答えになったら接触と判定するようにしています。

わかりにくいと思う「 if (dx<0):dx=-dx 」は、座標がマイナスになってしまった場合に式がなりたたなくなるので、
マイナスを代入して、マイナスを打ち消しています。
例えばtama_x = 0でteki_x=40の時は0-40 = -40 ですよね。 -40と言う答えは相応しくないので
dx=-dxの部分で-(-40)=40 と言う風にマイナスを無くしています。



通りすがり

リンク

2011/12/20(Tue) 08:35:29|NO.43855

無駄な命令が入っていたので修正しました。
こちらを参考にしてください。

jiki_size = 32 ; 自機の大きさ jiki_speed = 1 ; 自機の移動スピード jiki_posx = (GINFO_WINX - jiki_size) / 2 ; 自機の位置座標・横 jiki_posy = GINFO_WINY - jiki_size - 100 ; 自機の位置座標・縦 teki_size = 64 ; 敵の大きさ teki_posx = (GINFO_WINX - teki_size) / 2 ; 敵の位置座標・横 teki_posy = 100 ; 敵の位置座標・縦 tama_size = 16 ; 自機弾の大きさ tama_speed = 5 ; 自機弾の発射スピード tama_posx = -tama_size ; 自機弾の位置座標・横 tama_posy = -tama_size ; 自機弾の位置座標・縦 tama_flg = 0 ; 自機弾の発射フラグ *MAINLOOP // 自機移動 stick key_arrow, 15 if (key_arrow & 1) ! 0 :jiki_posx -= jiki_speed if (key_arrow & 2) ! 0 :jiki_posy -= jiki_speed if (key_arrow & 4) ! 0 :jiki_posx += jiki_speed if (key_arrow & 8) ! 0 :jiki_posy += jiki_speed // 弾移動 if tama_flg = 1 { if tama_posy < -tama_size :tama_flg = 0 tama_posy -= tama_speed } // 弾発射 getkey key_space, 32 if key_space = 1 & tama_flg = 0 { tama_flg = 1 tama_posx = jiki_posx + (jiki_size - tama_size) / 2 tama_posy = jiki_posy - tama_size } redraw 0 color 255, 255, 255 :boxf // 敵表示 color 255, 0, 0 boxf teki_posx, teki_posy, teki_posx + teki_size - 1, teki_posy + teki_size - 1 // 自機表示 color 0, 0, 255 boxf jiki_posx, jiki_posy, jiki_posx + jiki_size - 1, jiki_posy + jiki_size - 1 // 弾表示 if tama_flg = 1 { color 0, 255, 0 boxf tama_posx, tama_posy, tama_posx + tama_size - 1, tama_posy + tama_size - 1 } // 敵と自機弾の接触判定 if (teki_posx < tama_posx + tama_size) & (teki_posx + teki_size > tama_posx) { if (teki_posy < tama_posy + tama_size) & (teki_posy + teki_size > tama_posy) { color 0, 0, 0 pos teki_posx, teki_posy mes "当たった" }} redraw 1 await 32 goto *MAINLOOP



杉村

リンク

2011/12/20(Tue) 13:26:19|NO.43858

mmoさんの回答に蛇足なのですが
abs か absf 命令を使えないでしょうか?

size=32 dx=abs(tama_x-teki_x) dy=abs(tama_y-teki_y) if ((dx<size)&(dy<size)):mes "弾が敵に当たった" size=32 dx=abs(jiki_x-teki_x) dy=abs(jiki_y-teki_y) if ((dx<size)&(dy<size)):mes "プレイヤーと敵が接触"

参考になれば幸いです。



mmo

リンク

2011/12/21(Wed) 02:01:10|NO.43874

>杉村さん
あ、なるほど、absと言う手がありましたか。
速度を100万回で計測してみると、

dx=a-b : if dx<0 : dx=-dx // 342ミリ秒
dx=abs(a-b) // 191ミリ秒

と言うようにabsを使ったほうが早いことがわかりました。

ついでですが

if(( abs(ax-bx) < size )&( abs(ay_by < size ))) : mes "AとBが接触"
と言う風に一行で簡単に当たり判定が行えますね。
当たり判定まで行って100万回で400ミリ秒は結構早いのでは無いでしょうか。

CPU性能等により測定は変わりますから何とも言えませんが。



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