LoginSignup
1

More than 3 years have passed since last update.

posted at

updated at

【TIC-80】三日月爆発を再現したかった

まずは結果。

missile.gif

塗り残しっぽいのはありますが、一応想定通り?

作成理由

とあるゲームを「TIC-80」という FantasyConsole に移植しようとしているのですが、

ふと以前に読んだ「ミサイルコマンド三日月型の爆風が表示される場合があるが、それは画面処理の問題で意図したものではなかった」みたいな記事を思い出しました。
その時は「へーそうなんだー」くらいに思ってたのですが、「TIC-80」でそれを再現できるのでは?、と思ったのがきっかけです。
(もう一度その記事を読みたいのですが探し方が悪かったのか見つけられませんでした。
 ご存知の方がおられましたら教えて頂けると幸いです。)

描画処理

爆風を表す円が大きくなってその後小さくなる、というのを最も軽い処理で実現するなら、

  • 円の半径を少しずつ大きくしながら、その外側のみ描画
  • 小さくするときも同様に外側のみ背景色で描画しつつ半径を小さくしていく

ってことでしょうか。
「TIC-80」には「circb(x,y,r,c)」中心座標x,y、半径r、色c の円を幅1ドットで描画、という
APIがあるので、それを使用。上記の処理のみ記述。

missile.lua
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年。
三日月型爆風がミサイルコマンドからインスパイアされた、という説も
結構信憑性がある気がしますね。
(今、ちょっと調べたらマクロスのバリア制御?がトラックボール? おー)

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
1