まずは結果。
塗り残しっぽいのはありますが、一応想定通り?
##作成理由
とあるゲームを「TIC-80」という FantasyConsole に移植しようとしているのですが、
ふと以前に読んだ「ミサイルコマンドで三日月型の爆風が表示される場合があるが、それは画面処理の問題で意図したものではなかった」みたいな記事を思い出しました。
その時は「へーそうなんだー」くらいに思ってたのですが、「TIC-80」でそれを再現できるのでは?、と思ったのがきっかけです。
(もう一度その記事を読みたいのですが探し方が悪かったのか見つけられませんでした。
ご存知の方がおられましたら教えて頂けると幸いです。)
##描画処理
爆風を表す円が大きくなってその後小さくなる、というのを最も軽い処理で実現するなら、
- 円の半径を少しずつ大きくしながら、その外側のみ描画
- 小さくするときも同様に外側のみ背景色で描画しつつ半径を小さくしていく
ってことでしょうか。
「TIC-80」には「circb(x,y,r,c)」中心座標x,y、半径r、色c の円を幅1ドットで描画、という
APIがあるので、それを使用。上記の処理のみ記述。
MIN_X,MAX_X=40,200
MIN_Y,MAX_Y=40,100
BGCOLOR,BOMBCOLOR=0,15
ran,min=math.random,math.min
function bomb(br,x,y)
local mcnt,cnt=br*2,br*2
return function()
if cnt<1 then return end
cnt=cnt-1
r=min(cnt,mcnt-cnt)
circb(x,y,r,cnt>mcnt//2 and BOMBCOLOR or BGCOLOR) end end
function testinit()
t=0
bombr=15
bmaket=8
updatet=5
maxb=100
bombs={}
cls(BGCOLOR)
end
testinit()
function TIC()
if t%bmaket==0 then
table.insert(bombs,bomb(bombr,ran(MIN_X,MAX_X),ran(MIN_Y,MAX_Y)))
if #bombs>maxb then
table.remove(bombs,1) end end
if t%updatet==0 then
for i,f in ipairs(bombs) do f() end end
t=t+1
end
(幅40文字,高さ17文字の TIC-80 のエディタで書いているため最近はTIC()やinit()以外の
end 前では改行しないスタイルを使用。MoonScriptとかLispっぽいインデントスタイル?)
スタイル以外にも色々問題がある気がしますが‥。
自分はLuaしか知らないためこのようなコードになりましたが他の言語だとどういう書き方に
なるのかは興味あります。(TIC-80は javascript も使えますのでどなたか! (笑)
processing とかだともっときれいに表示されるのでしょうか?
##まとめ
- 円を大きくして小さくする、という処理のみで三日月型の爆風が再現できた
ここからは自分の想像ですが、意図したものではなかったが
面白かったので残した
みたいな感じだったのではないかと思います(スト2のキャンセル技みたいに)。
マクロスで有名(?)な三日月型爆発ですが、ミサイルコマンドの発売が
1980年。マクロス放送開始が1982年。
三日月型爆風がミサイルコマンドからインスパイアされた、という説も
結構信憑性がある気がしますね。
(今、ちょっと調べたらマクロスのバリア制御?がトラックボール? おー)