mieki256's diary



2018/10/28() [n年前の日記]

#1 [tic80] TIC-80でラスタースクロール処理その2

TIC-80 0.70.6 で、SCN() を使ってラスター単位というか走査線単位相当での処理を試しているところ。

走査線単位でアレコレできるなら、もしかして _アレ もできるのかな、と…。水面に見えるかもしれない系の画面効果を書いてみたり。

tic80_scn_hflip_ss01.gif

以下のページを開けば、ブラウザ上でも実行できる。

_rasterttest03.tic.html

念のために再度書いておくけど…。

ソース。 :

ソースは以下。
-- 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() を使ってバンク切り替えもできる模様。

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ラインずつ暗くなってしまうはず。

余談。CRTっぽい表示。 :

_Releases - nesbox/TIC-80 の Changelog を眺めていたら、F6キーを押すとCRT(ブラウン管)っぽい表示ができると知った。

tic80_crt_look_ss01.png

ホントだ…。それっぽい…。円形に歪ませつつ、 _シャドーマスク っぽいソレにしてるのかな…。

_アパーチャーグリル - Wikipedia
_スロットマスク - Wikipedia

*1: メガドライブの実機では、水平帰線割込みでパレット値を書き換えると画面にノイズが出てしまうので、該当部分にスプライトを乗せてチラつかせる等の小技が必要だった記憶があるけれど。TIC-80は疑似的にこういった処理をしてるだけなのでノイズが出ないから、妙な小技を使わなくて済む分、気楽に遊べてイイ感じだなと…。
*2: ちなみに今回は、水面の境界ラインで、1回しか書き換えてない。

以上です。

過去ログ表示

Prev - 2018/10 -
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31

カテゴリで表示

検索機能は Namazu for hns で提供されています。(詳細指定/ヘルプ


注意: 現在使用の日記自動生成システムは Version 2.19.6 です。
公開されている日記自動生成システムは Version 2.19.5 です。

Powered by hns-2.19.6, HyperNikkiSystem Project