2018/10/27(土) [n年前の日記]
#1 [tic80] TIC-80でラスタースクロール処理
TIC-80関係のスクリーンショット画像を眺めていたらラスタースクロールっぽい処理をしてる事例があったので、どうやったらそんな処理ができるのか少し試したり。
こんな感じかなあ…。
SCN()関数を記述すれば、y方向に1ライン描画する度に処理が呼ばれるそうで。 *1
_SCN - nesbox/TIC-80 Wiki
ちなみに、昔の版では SCN() ではなく scanline() という関数名だった模様。
また、
_poke - nesbox/TIC-80 Wiki
_RAM - nesbox/TIC-80 Wiki
しかしコレ、BGだけをラスタースクロール、みたいなことはできるのだろうか…。現状ではスプライト相当までグネグネしちゃってるけど…。
こんな感じかなあ…。
-- title: game title -- author: game developer -- desc: short description -- script: lua t=0 x=96 y=24 function TIC() if btn(0) then y=y-1 end if btn(1) then y=y+1 end if btn(2) then x=x-1 end if btn(3) then x=x+1 end cls(13) map(0,0) spr(1+t%60//30*2,x,y,14,3,0,0,2,2) print("HELLO WORLD!",84,84) t=t+1 end function SCN(row) local x,y x=8*math.cos(math.rad(3*t+4*row)) y=6*math.sin(math.rad(2*t+4*row)) poke(0x3FF9,x) poke(0x3FF9+1,y) end
SCN()関数を記述すれば、y方向に1ライン描画する度に処理が呼ばれるそうで。 *1
_SCN - nesbox/TIC-80 Wiki
ちなみに、昔の版では SCN() ではなく scanline() という関数名だった模様。
また、
- poke(0x3FF9, x方向の値)
- poke(0x3FF9+1, y方向の値)
_poke - nesbox/TIC-80 Wiki
_RAM - nesbox/TIC-80 Wiki
しかしコレ、BGだけをラスタースクロール、みたいなことはできるのだろうか…。現状ではスプライト相当までグネグネしちゃってるけど…。
◎ OVR()を使って分離。 :
OVR() という関数を記述すれば、SCN() で描画した後から別の何かを描画できる ―― SCN() の処理とは分離した描画ができるらしい。
コレを使えば、BGだけラスタースクロールをして、スプライトは処理をかけない、ということもできる模様。
_OVR - nesbox/TIC-80 Wiki
このソースの例では、OVR() 内でスプライト相当の描画+文字描画をしているので、そこだけはラスタースクロールしない状態になっている。
一応ブラウザ上でも動くソレも置いてみたり。
_rasterttest02.tic.html
コレを使えば、BGだけラスタースクロールをして、スプライトは処理をかけない、ということもできる模様。
_OVR - nesbox/TIC-80 Wiki
-- title: game title -- author: game developer -- desc: short description -- script: lua t=0 x=96 y=24 function TIC() if btn(0) then y=y-1 end if btn(1) then y=y+1 end if btn(2) then x=x-1 end if btn(3) then x=x+1 end cls(13) map(0,0) t=t+1 end function SCN(row) local x,y x=8*math.cos(math.rad(3*t+4*row)) y=6*math.sin(math.rad(2*t+4*row)) poke(0x3FF9,x) poke(0x3FF9+1,y) end function OVR() spr(1+t%60//30*2,x,y,14,3,0,0,2,2) print("HELLO WORLD!",84,84) end
このソースの例では、OVR() 内でスプライト相当の描画+文字描画をしているので、そこだけはラスタースクロールしない状態になっている。
一応ブラウザ上でも動くソレも置いてみたり。
_rasterttest02.tic.html
*1: もしかすると、TIC() で画面に描画する内容を作ってから、画面描画用のバッファに、SCN() でy方向に1ラインずつ転送している…のかな…。
[ ツッコむ ]
以上です。