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
[ ツッコむ ]
以上です。

