今回はMIAさん作の「発色弾」というソフトを使って爆発アニメーションに挑戦します。
↓発色弾で生成した画像

buffer 1,80,40
picload "tip.bmp"
buffer 2,768,192
picload "explosion.bmp"
screen 0,400,400
gmode 2
//敵の情報
dim enemy,20
dim enemy_x,20
dim enemy_y,20
//爆発アニメ
dim exp,10 //爆発アニメの現在のコマ
dim exp_x,10 //爆発した位置
dim exp_y,10
*main
color 0,0,0
boxf 0,0,400,400 //背景塗りつぶし
gosub *enemy_appear
gosub *enemy_process
gosub *explosion
redraw 1
wait 1
redraw 0
goto *main
//敵出現ルーチン
*enemy_appear
time++
if (time \ 50) = 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 (rnd(300) = 0) {
enemy(cnt) = 0
repeat 10
if exp(cnt) = 0 :i = cnt:break
loop
exp(i) = 1
exp_x(i) = enemy_x(cnt) - 28
exp_y(i) = enemy_y(cnt) - 28
}
pos enemy_x(cnt),enemy_y(cnt)
gcopy 1,40,0,40,40
}
loop
return
//爆発アニメ
*explosion
repeat 10
if exp(cnt) = 0 :continue
pos exp_x(cnt),exp_y(cnt)
flame = int((exp(cnt)-1)/4)
if (exp(cnt) >= 1) & (exp(cnt) <= 36) :gcopy 2,flame * 96,0,96,96
if (exp(cnt) >= 37) & (exp(cnt) <= 60) :gcopy 2,flame * 96,96,96,96
exp(cnt)++
if exp(cnt) = 61 :exp(cnt) = 0
loop
return
まずexp_xとexp_yには敵が爆発した瞬間の座標が入ります。
expはアニメーションのコマを表します。expが4増える毎(4ループする毎)に絵が変わります。
int(n)はnを超えない最大の整数を返す関数です。
簡単に言うと小数点付の数の小数点を取るはたらきをします。
(例)1.6→1、2.9→2、4.0→4
つまり、frame = int((exp(cnt)-1)/4) は
exp=1〜4のとき、1コマ目の爆風
exp=5〜8のとき、2コマ目の爆風
exp=9〜12のとき、...
を表示するという事を表しています。