ラスタースクロールっぽいもの
Twitterでラスタースクロールの話題が出たので、ラスタースクロールを行うサンプルを作ってみました。
以前、MinorMinerを作った時に、キャラ定義の書き換えをうまく使うと高速で画面処理できるということがわかっていました。
ま、要は8bit時代からあるPCG書き換えを使った技なんだけど、これをうまく使うとラスタースクロールもできそうだな、と構想していました。
今回、ちょうど話題も出たことなのでサンプルを作ってみた次第です。
ソースを見ればわかりますが、キャラ定義の文字列を左右にローテイトしているだけなので、さほど難しくありません。(メモリを直接扱える言語の方がもうちょっと直感的に書けると思います)
これを緻密にやれば、大きな背景をラスタースクロールすることもできると思います。
'RASTER TEST CLEAR DIM WV(100) CLS CHRINIT "BGF0" CH(0)=ASC("|"):CH(1)=ASC("#") CH(2)=ASC("A"):CH(3)=ASC("B") FOR I=0 TO 22 LOCATE 0,I ?(CHR$(CH(I%2*2))+CHR$(CH(I%2*2+1)))*32 NEXT GOSUB @TBLINIT FOR I=0 TO 3 CHRREAD("BGF0",CH(I)),CR$(I) NEXT TM=0 @LOOP B=BUTTON() A$=CR$(0):B$=CR$(1):OF=0:GOSUB @MAKEWAVE CH$(0)=RA1$:CH$(1)=RA2$ A$=CR$(2):B$=CR$(3)OF=8:GOSUB @MAKEWAVE CH$(2)=RA1$:CH$(3)=RA2$ FOR I=0 TO 3 CHRSET "BGF0",CH(I),CH$(I) NEXT TM=TM+1:IF TM==20 THEN TM=0 VSYNC 3 GOTO @LOOP @MAKEWAVE RA2$=B$ RA1$="":RA2$="" FOR I=0 TO 7 J=WV(TM+I+OF)*((B>0)+1) IF J>0 THEN RA1$=RA1$+MID$(B$,I*8+8-J,J)+MID$(A$,I*8,8-J) IF J==0 THEN RA1$=RA1$+MID$(A$,I*8,8) IF J<0 THEN RA1$=RA1$+MID$(A$,I*8-J,8+J)+MID$(B$,I*8,-J) IF J>0 THEN RA2$=RA2$+MID$(A$,I*8+8-J,J)+MID$(B$,I*8,8-J) IF J==0 THEN RA2$=RA2$+MID$(B$,I*8,8) IF J<0 THEN RA2$=RA2$+MID$(B$,I*8-J,8+J)+MID$(A$,I*8,-J) NEXT RETURN @TBLINIT RESTORE @WAVETBL FOR I=0 TO 36 READ WV(I) NEXT RETURN @WAVETBL DATA 0, 1, 2, 2, 3, 3, 3, 2 DATA 2, 1, 0,-1,-2,-2,-3,-3 DATA -3,-2,-2,-1, 0, 1, 2, 2 DATA 3, 3, 3, 2, 2, 1, 0,-1 DATA -2,-2,-3,-3,-3