7.爆発アニメーション

今回は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のとき、...
を表示するという事を表しています。