読者です 読者をやめる 読者になる 読者になる

プチコンで遊ぼう! (はてなブログ版)

任天堂3DSのプチコンで遊ぼう! [twitter:@eida_s]

はてなダイアリーから移行しました。 はてなダイアリーのURLを開いても自動的にこちらにリダイレクトされますのでご了承ください。

ラスタースクロールっぽいもの

プチコン

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