現在STGを作っています。今「ライフが最初に3つあって敵とぶつかるとライフが一つ減る」という処理を作りたいですが、
まず敵との衝突判定が分かりません。
講座どうりやってみたけど敵機と自機がぶつかってもそのままスルーしました
randomize
buffer 1 ;ウィンドウID1
picload "HSP2.jpg";画像
screen 0,1010,530 ;画面
boxf
gmode 2
button "start" ,*start ;スタート
*mainmenu
await 1
goto *mainmenu
*start
cls 4
gsel 0
tama=0 ;自機弾0:発射していない1:発射している
tama_x=0 : tama_y=0 ;自機弾の座標
ENEMYMAX=5;敵の最大
repeat ENEMYMAX
enemy.cnt=0 ;敵の存在 0:いない1:いる
emx.cnt=0:emy.cnt=0 ;敵の座標
loop
jkx=(1010-60)/2:jky=400 ;初期位置
jkb=0 ;自機の存在 0:いる -1:いない
nokori=3 ;自機残数
dim tama,2 自機弾
dim tama_x,2
dim tama_y,2
*game
;mainloop メインループ
repeat 1
redraw 0
gosub *move ;自機処理
gosub *teki1 ;敵機処理
gosub *hitcheck ;当たり判定
gosub *attack ;自機と敵との衝突判定
gosub *jiki_disp ;自機残数処理
if jkb=-1:nokori=nokori-1 ;自機状態なし
loop
repeat ENEMYMAX
if enemy.cnt : pos emx.cnt,emy.cnt : gcopy 1,155,0,70,55 ;敵
loop
await 16
redraw 1
goto *game
*move
color 165,250,250
boxf
color 0,0,0
;移動量
pos jkx,jky
gcopy 1,0,0,55,60 ;画像
stick key, 15 ;キー
if key&1:jkx=jkx-16 ;左
if key&2:jky=jky-16 ;上
if key&4:jkx=jkx+16 ;右
if key&8:jky=jky+16 ;下
;弾設定
if key&&16{
repeat 2
if tama(cnt)=0{
tama(cnt)=1
tama_x(cnt)=(jkx)
tama_y(cnt)=(jky)
break
}
loop
}
repeat 2
if tama_y(cnt)<0:tama(cnt)=0
if tama(cnt)=1{
tama_y(cnt)-=30
pos tama_x(cnt),tama_y(cnt)
gcopy 1,60,0,57,70;弾画像
}
loop
;ウィンドウ内
if jkx>=ginfo_winx-50:jkx=ginfo_winx-50
if jkx<=0:jkx=0
if jky>=ginfo_winy-50:jky=ginfo_winy-50
if jky<=0:jky=0
return
*teki1
repeat ENEMYMAX
emrnd=rnd(20)
if emrnd<12:break
b=rnd(1010-60) ;乱数
if enemy.cnt=0:emx.cnt=b:emy.cnt=0:enemy.cnt=1
loop
repeat ENEMYMAX ;敵の処理
if enemy.cnt:emy.cnt+=3 ;SPEED
if emy.cnt>530:emx.cnt=0:emy.cnt=0:enemy.cnt=0
loop
return
;当たり判定
*hitcheck
repeat ENEMYMAX
if enemy.cnt and tama {
ex=emx.cnt:ey=emy.cnt:tx=tama_x:ty=tama_y
if (ex<tx+57)and(ex+70>tx)and(ey<ty+70)and(ey+65>ty){
enemy.cnt=0:emx.cnt=0:emy.cnt=0
break
}
}loop
return
*jiki_disp
if nokori <= 0 :return ;残り0なら戻る
color 0, 10, 40 ;表示領域
boxf 0,465,200,530 ;自機消去
repeat nokori - 1
pos 60,470
font "MSゴジック",26,1
color 255,255,255
mes strf("LIFE %01d" , nokori )
pos 0 ,468
gcopy 1, 0, 0,55,60
loop
return
;敵機と自機の衝突判定
*attack
foreach ENEMYMAX
if enemy.cnt = 0 & (jky+60 > emy.cnt) && (jkx+55 > emx.cnt) &&(emx.cnt+57>jkx) &&(emy.cnt+70>jky) {
;爆破アニメーション
redraw 1
pos jkx * 8 , jky * 8
repeat 17, 1
gcopy 1, cnt * 60, 60
wait 50
loop
jkb = -1 ;自機状態なし 設定
break
}
loop
return