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


HSPTV!掲示板


未解決 解決 停止 削除要請

2021
0202
さく当たり判定4解決


さく

リンク

2021/2/2(Tue) 02:12:38|NO.92199

プログラミング初心者です!
ある方のを見て、当たり判定が距離なのかそれともほかの判断で当たったと判定されているのかわからないため、教えていただきたいです。
よろしくお願いいたします。

wx=600:wy=600 ; 画面サイズ
screen 0,wx,wy
color 0,150,150:boxf 0,0,600,600


mx=400:my=300 ; プレイヤーの座標
msp=4 ; プレイヤーの移動スピード
ms=20 ; 衝突判定円の半径
cx=500:cy=500 ;●の座標
ex=50:ey=50 ; ▼の座標
frame=0

;■
kx = 50:ky = 250;初期位置XとY
dx = 3:dy = 3 ;移動量XとY

;120秒間
countermax=120*60
counter=1

*game1
redraw 0 ; 画面更新開始
color 0,150,150:boxf 0,0,800,800

;自機
stick key,%11111 ; キー入力
if key&1 : mx=limit( mx-msp, 0, wx ) ; 左移動
if key&4 : mx=limit( mx+msp, 0, wx ) ; 右移動
if key&2 : my=limit( my-msp, 0, wy ) ; 上移動
if key&8 : my=limit( my+msp, 0, wy ) ; 下移動
pos mx-ms,my-ms
color
mes "自"


;●
dist=abs(cx-mx)+abs(cy-my) ; 敵との距離を簡易的に求める
if dist<(ms*2) : goto *gameover ; 衝突していたら*gameoverへ

;新しい座標=aline(現在の座標,追いかける座標)
cx=alien(cx,mx) ; ●のX座標を動かす
cy=alien(cy,my) ; Y座標を動かす


;▼
dist=abs(ex-mx)+abs(ey-my) ; 敵との距離を簡易的に求める
if dist<(ms*2) : goto *gameover ; 衝突していたら*gameoverへ
if sqrt( (ex-mx) * (ex-mx) + (ey-my) * (ey-my) ) < 150 {
ex=alien1(ex,mx) ; 敵のX座標を動かす
ey=alien1(ey,my) ; 敵のY座標を動かす
}else{
ex=ex ;敵のX座標を動かさない
ey=ey ;敵のY座標を動かさない
}


;■
dist=abs(kx-mx)+abs(ky-my) ; 敵との距離を簡易的に求める
if dist<(ms*2) : goto *gameover ; 衝突していたら*gameoverへ
kx + dx
ky + dy
;画面外へ出たら方向転換
if(kx < 0 | kx > 570) {
dx *= -1
}
if(ky < 0 | ky > 570) {
dy *= -1
}
pos kx - 8 , ky - 8
color 255,255,255:gmode 4,0,0,256 ;画像背景の透明化
color
mes "■"


;●
gsel 0
pos cx-ms,cy-ms
color 255,255,255:gmode 4,0,0,256 ;画像背景の透明化
color
mes "●"


;▼
gsel 0
pos ex-ms,ey-ms
color 255,255,255:gmode 4,0,0,256 ;画像背景の透明化
color
mes "▼"


;タイマー
color 0,0,0
pos 0,570:font"MS ゴシック",30

redraw 1 ; 画面更新終わり
await 1000/60 ; 1/60秒で画面を更新
frame++ ; フレームを進める
goto *game1 ; 繰り返す


*gameover
; GAME OVER時の処理
font msgothic,80
color 0,0,0:pos 130,300
mes "GAME OVER"
redraw 1
stop

;●
#defcfunc alien int value1, int value2
; 敵が追いかけてくる関数
csp=2 ; 敵の移動スピード
res=limit( value2-value1, -csp, csp )
return value1+res

;▼
#defcfunc alien1 int value3, int value4
; 敵が追いかけてくる関数
esp=2 ; 敵の移動スピード
res=limit( value4-value3, -esp, esp )
return value3+res



この記事に返信する


沢渡

リンク

2021/2/2(Tue) 10:05:19|NO.92200

距離ですね。
「●」型の敵に関する処理について見ますと、

dist=abs(cx-mx)+abs(cy-my) ; 敵との距離を簡易的に求める if dist<(ms*2) : goto *gameover ; 衝突していたら*gameoverへ
ここではcxとcyが敵の中心座標、mxとmyは自機の中心座標です。
absというのは絶対値(元の数値が0かプラスならそのまま、マイナスならプラスに直す)
を求める関数ですから、両者の「x座標の差」と「y座標の差」を足したものを
このプログラムでは「距離」と定義づけています。
そして、msというのはキャラクターの半径ですから、この距離が半径の2倍より
小さかったら「当たった」ということになります。
(▲型の敵や■型の敵についても同様の処理)



さく

リンク

2021/2/4(Thu) 23:40:57|NO.92211

沢渡さん

回答していただきありがとうございます!
返事が遅くなり申し訳ありません…


細かく説明してくださりありがとうございます!
>>msというのはキャラクターの半径
ms=20なので半径の2倍ということはキャラクターの当たり判定が40ということでしょうか?
理解が足らずすみません。よろしくお願いいたします。



沢渡

リンク

2021/2/5(Fri) 14:57:26|NO.92215

>ms=20なので半径の2倍ということはキャラクターの当たり判定が40ということでしょうか?
そういうことになります。(もちろんmsの値を変化させたらそれに応じて当たり判定も変化する)
自機の中心部分と敵の中心部分の距離が40未満になったら「衝突した」とみなされるということです。



さく

リンク

2021/2/5(Fri) 17:25:25|NO.92216

沢渡さん

そうなんですね!
教えていただきありがとうございました!



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