今回は自機と敵の当たり判定、弾と敵の当たり判定を設定します。
ソースが膨れてきたので各処理をサブルーチン化しました。
さらに当たり判定の範囲がわかりやすいように、背景の色と画像の透過処理を変更しました。
当たり判定の方法はいろいろありますが、今回は自機と敵機の座標の差の絶対値を利用しました。
自機と敵機が接触、弾と敵機が接触すると、敵が消えます。
abs(n)はnの絶対値を返す関数です。
buffer 1,80,40
picload "tip.bmp"
screen 0,400,400
//自機の弾の情報
dim tama,40
dim tama_x,40
dim tama_y,40
//敵の情報
dim enemy,20
dim enemy_x,20
dim enemy_y,20
*main
gosub *display
gosub *jiki_process
gosub *enemy_appear
gosub *enemy_process
gosub *bullet
redraw 1
wait 1
redraw 0
goto *main
//画面初期化&自機描画ルーチン
*display
color 255,255,255
boxf 0,0,400,400 //背景塗りつぶし
pos x,y
gcopy 1,0,0,40,40 //自機表示
return
//自機の操作ルーチン
*jiki_process
stick key,31
if key & 1:x--
if key & 2:y--
if key & 4:x++
if key & 8:y++
if key & 16 {
repeat 40
if tama(cnt) = 0 {
tama(cnt) = 1
tama_x(cnt) = (x + 20)
tama_y(cnt) = y
break
}
loop
}
if x < 0 :x = 0
if x > 360:x = 360
if y < 0 :y = 0
if y > 360:y = 360
return
//敵出現ルーチン
*enemy_appear
time++
if (time \ 200) = 0 {
repeat 20
if enemy(cnt) = 0 {
enemy(cnt) = 1
enemy_x(cnt) = rnd(361)
enemy_y(cnt) = -40
enemy_hp(cnt) = 10
break
}
loop
}
return
*enemy_process
//敵の処理
repeat 20
if enemy_y(cnt) > 400 : enemy(cnt) = 0
if enemy(cnt) = 1{
enemy_y(cnt)++
if (abs(x - enemy_x(cnt)) < 40) & (abs(y - enemy_y(cnt)) < 40): enemy(cnt) = 0
pos enemy_x(cnt),enemy_y(cnt)
gcopy 1,40,0,40,40
}
loop
return
//弾の処理ルーチン
*bullet
repeat 40
if tama_y(cnt) < 0 : tama(cnt) = 0
if tama(cnt) = 1 {
tama_y(cnt)-=10
i = cnt
repeat 20
if enemy(cnt) = 1 {
if (abs(tama_x(i) - enemy_x(cnt)) < 40) & (abs(tama_y(i) - enemy_y(cnt)) < 40): enemy(cnt) = 0
}
loop
color 0,0,0
pset tama_x(cnt),tama_y(cnt)
}
loop
return