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


HSPTV!掲示板


未解決 解決 停止 削除要請

2011
0921
HSP6あたり判定...12解決


HSP6

リンク

2011/9/21(Wed) 12:05:36|NO.41550

あたり判定の質問です。
pre
if x>(enemy003x-10) & x<(enemy003x+10) & y>(enemy003y-60) & y<(enemy003y+60) : life-1
if x>(enemy004x-35) & x<(enemy004x+35) & y>(enemy004y-55) & y<(enemy004y+55) : life-1
/pre
このスクリプトであたり判定をしてみたのですが、うまく反応してくれませんでした。
ちなみに、enemy003の大きさは10X40、enemy004の大きさは50X50です。
また、自機の大きさは40X60です。
だれかいいやり方を教えてください!!



この記事に返信する


HSP6

リンク

2011/9/21(Wed) 12:08:52|NO.41551

すみません。
pre〜/preの部分はスクリプトです。
preと/preは気にしないでください。



ookenn

リンク

2011/9/21(Wed) 15:00:13|NO.41553

すこし、情報が少ないので聞きますが。
enemy00●x,enemy00●y ●は3や4のこと
はそれぞれの座表ですか?
描画する際はそれを左上として描画するんですよね?
うまくいかないという部分も抽象的でわかりにくいです…

いちおう今までのうちで回答しておくと
HSP6さんが示しているあたり判定は、
点と四角形の領域との当たり判定であり
今回は四角形同士のあたり判定だと思うので、少し異なります

下のスクリプトを見ていただくとわかりますが

黄緑があたり判定の範囲
赤青がそれぞれ障害物?です
自機は水色です

実行するとわかりますが。マウスの先があたり判定の範囲に入っているかはいってないか
で決まるのが分かると思います。
しかも、あたり判定と障害物の大きさなどがバラバラであり、うまくいくはずがありません


//適当に代入 enemy003x=100 enemy004x=200 enemy003y=100 enemy004y=200 repeat redraw 0 //画面塗りつぶし color 255,255,255 boxf color 0,0,0 //あたり判定可視化 color 100,255,100 boxf enemy003x-10, enemy003y-60,enemy003x+10, enemy003y+60 boxf enemy004x-35, enemy004y-55,enemy004x+35, enemy004y+55 //enemy003 color 255,100,100 boxf enemy003x,enemy003y,enemy003x+10,enemy003y+40 //enemy003 color 100,100,255 boxf enemy004x,enemy004y,enemy004x+50,enemy004y+50 //今回はマウス座標を自機座標に color 0,255,255 x=mousex y=mousey boxf x,y,x+40,y+60 //あたり判定 pos 0,0 color 0,0,0 if x>(enemy003x-10) & x<(enemy003x+10) & y>(enemy003y-60) & y<(enemy003y+60) : mes "003と接触" if x>(enemy004x-35) & x<(enemy004x+35) & y>(enemy004y-55) & y<(enemy004y+55) : mes "004と接触" await 10 redraw 1 loop



ookenn

リンク

2011/9/21(Wed) 17:10:27|NO.41560

肝心の四角形同士のあたり判定ですが、
以下のスクリプトで可能です
ちなに渡す座標が
描画する際のその座標が左上となる場合だけに有効です
2つありますがどっちも同じ意味です。
ちなみに渡す座標を配列で管理した阿呆が
あたり判定をループでやれますので便利ですよ。

if x < enemy003x + 10 and enemy003x < x+40{ if y < enemy003y + 40 and enemy003y < y+60 : mes "003と接触" } if x < enemy004x + 50 and enemy004x < x+40 and y < enemy004y + 50 and enemy004y < y+60 : mes "004と接触"



lltakashill

リンク

2011/9/21(Wed) 17:13:39|NO.41561

HSP開発wikiのhttp://hspdev-wiki.net/?%BE%D7%C6%CD%C8%BD%C4%EA
を参考にしてみたらどうでしょうか?
ココにはこのほかにもいろいろないいことが書いているので、
いろいろ参考になります。



ザーメン

リンク

2011/9/21(Wed) 18:16:09|NO.41565

HSPだと&と&&は同じ意味なのかな?



ookenn

リンク

2011/9/21(Wed) 18:20:07|NO.41567

らしいですね。
私はHSPではローマ字のほうを使うので気にしたことなかったw



HSP6

リンク

2011/9/21(Wed) 18:21:38|NO.41568

皆さんありがとうございます。
説明が下手だったり、情報が少なくてすみません。
色々試してみます。



HSP6

リンク

2011/9/21(Wed) 19:41:49|NO.41571

NO.41560の方のやり方でやってみたのですが、
自機が左から敵にあたった時のみ僕の思いどうりになります。
ほかの方向から当たると、おかしいときに反応します。
どうしたら直せますか?
また、NO.41553の方、アドバイスありがとうございます。
また、回答してくれた皆さんに感謝します。
これからも回答待ってます!!



ookenn

リンク

2011/9/21(Wed) 20:22:05|NO.41572

う〜ん
状況は想像できるんだけど今出てるスクリプトじゃどうも判断できかねますね。
自分の書いたものに絶対の自信があるわけでもありませんが、
HSP6さんのスクリプトが間違っているという可能性もあります。
ただそれだと、スクリプトの前後を見ない限りどうも言えませんので
もう少し広範囲にスクリプトを切り抜いていただけると光栄に思います。



TTRUKO

リンク

2011/9/21(Wed) 20:30:58|NO.41573

NO.41553のコードのif文を、NO.41560のコードに置き換えてみるとわかりますが、
ookennさんの判定計算は正しく動いていますよ〜^^;
(判定文の書き方によっては1ピクセル程度のずれはあるかもしれませんけど)

HSP6さんがご自分で作った部分のどこかに間違いがあるはずなので
HSP6さんのコードを見せてくだされば、だれかがミスを見つけてくれると思います〜

//適当に代入 enemy003x = 100 enemy004x = 200 enemy003y = 100 enemy004y = 200 repeat redraw 0 //画面塗りつぶし color 255, 255, 255 boxf color 0, 0, 0 //enemy003 color 255, 100, 100 boxf enemy003x, enemy003y, enemy003x + 10, enemy003y + 40 //enemy003 color 100,100,255 boxf enemy004x, enemy004y, enemy004x + 50,enemy004y + 50 //今回はマウス座標を自機座標に color 0, 255, 255 x = mousex y = mousey boxf x, y, x + 40, y + 60 //あたり判定 pos 0, 0 color 0, 0, 0 if ( x < enemy003x + 10 ) and ( enemy003x < x + 40 ) { if ( y < enemy003y + 40 ) and ( enemy003y < y+60 ) : mes "003と接触" } if ( x < enemy004x + 50 ) and ( enemy004x < x + 40 ) and ( y < enemy004y + 50 ) and ( enemy004y < y + 60 ) : mes "004と接触" await 10 redraw 1 loop



HSP6

リンク

2011/9/22(Thu) 15:40:20|NO.41599

皆さんのおかげで解決できました!!
あたり判定とenemy出現の際のコードも間違っていました。
たくさんのアドバイスありがとうございます!!



mmo

リンク

2011/9/23(Fri) 16:45:38|NO.41610

当たり判定についてはこういう方法はいかがでしょうか。
画像表示などの処理は省いています。


enemy003x=100 //敵のX位置 enemy003y=100 //敵のY位置 enemy003size=32 / 2 //敵の中心からの当たり判定の大きさ enemy004x=100 enemy004y=100 enemy004size=32 / 2 *main gosub *hittest wait 1 goto*main //当たり判定 *hittest //敵同士の座標を引く。 もしマイナスの値の場合hitXを-で代入することにより+の値にする。 hitX=enemy003x-enemy004x : if(hitX<0):hitX=-hitX hitY=enemy003y-enemy004y : if(hitY<0):hitY=-hitY hitSize=enemy003size+enemy004size //敵同士のサイズを掛け合わせた値 if((hitX<hitSize)&&(hitY<hitSize)){ //敵同士の座標がhitSize内に納まると当たったと認識 mes "hit!" } return



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