2018/10/28(日) [n年前の日記]
#1 [tic80] TIC-80でラスタースクロール処理その2
TIC-80 0.70.6 で、SCN() を使ってラスター単位というか走査線単位相当での処理を試しているところ。
走査線単位でアレコレできるなら、もしかして _アレ もできるのかな、と…。水面に見えるかもしれない系の画面効果を書いてみたり。
以下のページを開けば、ブラウザ上でも実行できる。
_rasterttest03.tic.html
念のために再度書いておくけど…。
走査線単位でアレコレできるなら、もしかして _アレ もできるのかな、と…。水面に見えるかもしれない系の画面効果を書いてみたり。
以下のページを開けば、ブラウザ上でも実行できる。
_rasterttest03.tic.html
念のために再度書いておくけど…。
- 動作中に画面をクリック → ESCキー → 「CLOSE GAME」を選べば、入力待ち画面になる。
- 入力待ち画面でF1キーを押せばエディタが開くので、ソースを修正して動作確認ができる。実行は Ctrl + R。
- F2キーを押せばドットエディタが、F3キーを押せばマップエディタが開く。
◎ ソース。 :
ソースは以下。
-- title: game title -- author: game developer -- desc: short description -- script: lua t=0 x=24 y=32 sy=0 PAL_ADDR=0x3FC0 SCR_OFST=0x3FF9 function TIC() local spd=2 if btn(0) then y=y-spd end if btn(1) then y=y+spd end if btn(2) then x=x-spd end if btn(3) then x=x+spd end cls(0) map(0,0) spr(1+t%60//30*2,x,y,14,2,0,0,2,2) print("HELLO WORLD!",84,28) t=t+1 sy=math.floor((136*0.7)+16*math.sin(math.rad(t))) -- reset palette sync(1<<5) end function SCN(row) local dy=row-sy local rx,ry if dy<0 then rx=0 ry=0 else rx=1.5*math.cos(math.rad(4*t+55*dy)) ry=-dy*2 end poke(SCR_OFST,rx) poke(SCR_OFST+1,ry) if dy==0 then -- palette change for i=PAL_ADDR,PAL_ADDR+16*3-1 do poke(i,peek(i)*0.7) end end end
◎ 走査線単位でのパレット値の書き換え。 :
今回は、水面部分が少し暗い色になるようにしてみたり。SCN() の中で、16色分のパレットを書き換えることで暗くしている。要は、
_メガドライブ版ソニックの水面処理
みたいな感じ。
*1
_RAM - nesbox/TIC-80 Wiki によると、パレット値は 0x3FC0 から 16色 x 3 Byte (RGB 24 bit) = 48byte として記録されている。その領域を _poke() で書き換えてやれば、走査線単位でパレット値を変化させることができる。 *2
ただ、パレット値を書き換えると、次回の描画時に、暗くなったパレット値のまま画面を描いてしまうので…。TIC()内の最後のあたりで sync(1<<5) を呼んでパレットをリセットしている。
_sync - nesbox/TIC-80 Wiki
sync() に、マスク情報を渡しながら呼ぶことで、画像領域、マップ、効果音、音楽、パレットを、new した直後の状態にリセットできるらしい。また、おそらく有償版の TIC-80 なら、sync() を使ってバンク切り替えもできる模様。
_RAM - nesbox/TIC-80 Wiki によると、パレット値は 0x3FC0 から 16色 x 3 Byte (RGB 24 bit) = 48byte として記録されている。その領域を _poke() で書き換えてやれば、走査線単位でパレット値を変化させることができる。 *2
ただ、パレット値を書き換えると、次回の描画時に、暗くなったパレット値のまま画面を描いてしまうので…。TIC()内の最後のあたりで sync(1<<5) を呼んでパレットをリセットしている。
_sync - nesbox/TIC-80 Wiki
sync() に、マスク情報を渡しながら呼ぶことで、画像領域、マップ、効果音、音楽、パレットを、new した直後の状態にリセットできるらしい。また、おそらく有償版の TIC-80 なら、sync() を使ってバンク切り替えもできる模様。
◎ OVR()についてメモ。 :
TIC() や SCN() の描画後に、別の何かを独立して描画できる OVR() については、実装された際に書かれた記事が参考になりそうだなと。
_Overlap mode - Issue #429 - nesbox/TIC-80
_TIC-80さんのツイート: "going to add new "overlap" mode to #TIC80 https://t.co/AaOOmN7HRd to create this kind of effects… "
上記記事のスクリーンショットの事例では、スクロールだけなら map() を複数呼ぶことでも実現できるけど。1ライン描画するたびにパレット値を書き換えて、BG相当を少しずつ暗くしてる・グラデーションにしているあたりがポイントかもしれないなと。もし OVR() が無かったら、自機も1ラインずつ暗くなってしまうはず。
_Overlap mode - Issue #429 - nesbox/TIC-80
_TIC-80さんのツイート: "going to add new "overlap" mode to #TIC80 https://t.co/AaOOmN7HRd to create this kind of effects… "
上記記事のスクリーンショットの事例では、スクロールだけなら map() を複数呼ぶことでも実現できるけど。1ライン描画するたびにパレット値を書き換えて、BG相当を少しずつ暗くしてる・グラデーションにしているあたりがポイントかもしれないなと。もし OVR() が無かったら、自機も1ラインずつ暗くなってしまうはず。
◎ 余談。CRTっぽい表示。 :
_Releases - nesbox/TIC-80
の Changelog を眺めていたら、F6キーを押すとCRT(ブラウン管)っぽい表示ができると知った。
ホントだ…。それっぽい…。円形に歪ませつつ、 _シャドーマスク っぽいソレにしてるのかな…。
_アパーチャーグリル - Wikipedia
_スロットマスク - Wikipedia
ホントだ…。それっぽい…。円形に歪ませつつ、 _シャドーマスク っぽいソレにしてるのかな…。
_アパーチャーグリル - Wikipedia
_スロットマスク - Wikipedia
[ ツッコむ ]
以上です。