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

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

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

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

スプライトのテストプログラム

日経ソフトウェア2011.6月号掲載のプチコンの記事に、スプライトのサンプルプログラムがあるので、これを改造してみた。


たくさんの星(100個まで可)が画面をくるくる回りながら飛び回る。

今回のキモは、通常のスプライトではできない、中心角からの回転を擬似的に再現していること。
SPANGLEを使うと、スプライトの左上の角を中心に回転してしまうため、スプライトの表示位置がずれてしまう。
このプログラムでもSPANGLEを使って回転を行っているが、表示位置がずれる分を計算して求め、その分を補正して(ほぼ)正しい位置に表示されるようにしている。

'PRG:SPTEST2
'┏━━━━━━┓
'┃ スプライト テスト ┃
'┗━━━━━━┛
@DECLARE
CLEAR
MX=15:'スターコスウ
DIM SX(MX+1):'スターX
DIM SY(MX+1):'スターY
DIM SR(MX+1):'スターカイテンカク
DIM SS(MX+1):'スタージョウタイ
DIM SC(MX+1):'スターカラーパレット
DIM ADX(360):'カイテンホセイテーブルX
DIM ADY(360):'カイテンホセイテーブルY

@CONSTANT
_RSPD=2:'カイテンソクド(オオキイホドハヤイ)

@INIT
CLS:SPCLR:GCLS
GOSUB @TBL_INIT
GOSUB @SP_INIT
VISIBLE 1,1,1,1,1,1
GOTO @MAINLOOP

@TBL_INIT
S=8*SQR(2)
FOR I=0 TO 359
ADX(I)=SIN(-2*PI()*(I-45)/360)*S
ADY(I)=COS(-2*PI()*(I-45)/360)*S
NEXT
RETURN

@SP_INIT
FOR I=0 TO MX
SC(I)=RND(16)
SPSET I,156,SC(I),0,0,0
SX(I)=RND(255):SY(I)=RND(191)
SR(I)=0:SS(I)=RND(8)
SPOFS I,SX(I),SY(I)
'SPANIM I,4,8,0
NEXT
RETURN

@MAINLOOP
GOSUB @STARMOVE
GOSUB @STARROLL
GOTO @MAINLOOP
'GOTO @EXIT

@STARMOVE
FOR I=0 TO MX
DX=(SS(I) AND 1)*2-1
DY=(SS(I) AND 2)-1
SX(I)=SX(I)+DX
SY(I)=SY(I)+DY
IF SX(I)<8 THEN SS(I)=SS(I) OR 1
IF SX(I)>247 THEN SS(I)=SS(I) AND 6
IF SY(I)<8 THEN SS(I)=SS(I) OR 2
IF SY(I)>183 THEN SS(I)=SS(I) AND 5
SPOFS I,SX(I)-ADX(SR(I)),SY-ADY(SR(I))
NEXT
RETURN

@STARROLL
FOR I=0 TO MX
T=((SS(I) AND 4)-2)/2
SR(I)=(SR(I)+_RSPD*T+360)%360
SPANGLE I,SR(I)
NEXT
RETURN

@EXIT
END