TeamworkCastが配信している、PICO-8のチュートリアル動画の解説を連載中です。
前回はこちら。
そして今回の動画はこちらです。
【解説メモ】
タイトル画面で、スタートするとフェードアウトするようにする。
Lexaloffle の BBS > PICO-8 > Workshop の Sample Code: Screenshake and Fading のカートリッジをダウンロードして読み込む。
その中のコード function fadepal(_perc)〜end をコピーして、breakoutプログラムを再び読み込み、function doblink()〜end の後ろにペースト。
TABを新しく作り(TAB2)、function _update60() update_start() update_gameover() update_levelover() update_game() updateball(bi) をカット&ペーストで移動させる。
TABを新しく作り(TAB3)、function _draw() draw_start() draw_gameover() draw_levelover() draw_game() をカット&ペーストで移動させる。
function _draw()内のdoshake()をfunction _update60()内のdoblink()の下にカット&ペースト。
function update_start()のstartcountdown=80の下にblinkspeed=1を記述し、doblink()が8個連続で並んでいるのをすべて消し、if startcountdown<=0 then内のstartcountdown=-1の下にblinkspeed=8を記述。
function _init()内のblinkspeed=8の下にfadeperc=0を加える。
function update_start()内のblinkspeed=8の下にfadeperc=0を加え、elseの下のstartcountdown-=1の下にfadeperc+=0.05を加える。
function _draw()内の先頭に
pal()
if fadeperc!=0 then
fadepal(fadeperc)
end
を加える。
function update_start()内のfadeperc+=0.05をfadeperc=(80-startcountdown)/80に変更。
function _init()内のstartcountdown=-1の下にgovercountdown=-1を加える。
function gameover()内のmode=”gameover”の下にgovercountdown=60を加え、“gameover”を“gameoverwait”に変更。
function _update60()内のupdate_gameover()の下に
elseif mode=="gameoverwait" then
update_gameoverwait()
を加える。
function update_gameover()〜endの後ろに
function update_gameoverwait()
govercountdown-=1
if govercountdown<=0 then
govercountdown= -1
mode="gameover"
end
end
function _draw()内にも_update60()と同じように
elseif mode=="gameoverwait" then
draw_game()
をelseif mode==”gameover” thenの前に記述(draw_game()で、draw_gameoverwait()でないことに注意)。
function doblink()内のlocal g_seq={3,11,7,11}の下にlocal w_seq={5,6,7,6}を追加。
function _init()内のblink_g_i=1の下にblink_w=7とblink_w_i=1を記述。
function doblink()内に
blink_w_i+=1
if blink_w_i > #w_seq then
blink_w_i=1
end
blink_w=w_seq[blink_w_i]
を記述。
function gameover()内にblinkspeed=16を記述。
function update_gameover()を
function update_gameover()
if govercountdown<0 then
if btnp(4) then
govercountdown=80
blinkspeed=1
sfx(12)
end
else
govercountdown-=1
fadeperc=(80-govercountdown)/80
if govercountdown<=0 then
govercountdown= -1
blinkspeed=8
fadeperc=0
startgame()
end
end
end
と変更する。
function fadepal(_perc)内のpal(j,col)をpal(j,col,1)に変更する(描画した色も変更させる)。
function _draw()内で先程先頭に書いた
pal()
if fadeperc!=0 then
fadepal(fadeperc)
end
を一番下に移動。
【自分の感想】
今回は、フェードアウト効果を実装するにはどうしたら良いのかがわかった。
色は15この数字のテーブルを用意して、色番号の数値に対応する要素の値を色番号に変更する事で、次第に暗くなるように描く色が変更される(最後はすべて黒色の0番になる)。
色番号がcolで、テーブルがdpal={0,1,1, 2,1,13,6, 4,4,9,3, 13,1,13,14}となていて、
col=dpal[col]
で、色を一段回くらい色に変更する。
例えば、黄色は10番で、dpal[10]は、9(オレンジ)になる。
次にオレンジの9番は、dpal[9]で、4(茶色)になる。
茶色の4番は、dpal[4]で、2(小豆色)になる。
小豆色の2番は、dpal[2]で、1(紺色)になる。
最後に、紺色の1番は、dpal[1]で、0(黒色)になる。
はじめ、ビット操作をして明るさを落としていると思ったら、変換テーブルを利用していたことを知り、勉強になりました。
今回のフェードアウト効果は、サンプルプログラムのjelpi.p8を参考にしたようで、他人のプログラムコードは勉強になることを改めて思いました。
終わりに、今までやってきた動画の記述を追っていくやり方は、大変で間違い探しをしているかのようで、本質を得られず、時間と労力がかなり必要で非効率だと思い、これからは変更や修正の意味や動きのポイントを解説するだけに止めようと思う。
コメント