配列を使って星の動きを制御するのだ

実は、今までのやり方の応用で多重スクロール(速度の異なったスクロールを重ね合わせる)をやってみたのだが、めったくそ遅い(T-T)/これに加えて、敵キャラ表示したり当り判定の処理をやったり、、、なんてこと想像もしたくなかったので、別のやり方を模索することにした。なんでも、敵キャラのデータを管理するのには「配列変数」というのを使うと便利らしい。いずれやらなきゃならんのなら、単純に制御できるもので勉強してみようっつーことで、今回のお題が決定。


;初期設定
	SCREEN 0,600,400,1
	CLS 4
	RANDOMIZE
	MX=300 :MY=200		;自機の初期位置を指定
	MOVE=4			;自機の移動速度を指定
	SMAX=100 			;星の最大数

;配列定義
	DIM X,SMAX			;星のx軸座標
	DIM Y,SMAX			;星のy軸座標
	DIM C,SMAX			;星の色
	DIM S,SMAX			;星の移動速度

;バッファー2に自機の画像を描きこみ
	BUFFER 2,600,400,1
	POS 0,0 : PICLOAD "myship.bmp"

;星をランダムに表示
	GSEL 0 : COLOR 0,0,0 : BOXF 0,0,600,400
	REPEAT SMAX
		RND X.CNT,600
		RND Y.CNT,400
		RND C.CNT,3 : C.CNT=(C.CNT+1)*64-1
		RND S.CNT,4 : S.CNT=S.CNT+1
		COLOR C.CNT,C.CNT,C.CNT
		PSET X.CNT,Y.CNT
	LOOP

;--------------
;メインルーチン
;--------------
*MAIN
	REDRAW 2
	COLOR 0,0,0 : BOXF 0,0,600,400
	GOSUB *HAIKEI
	GOSUB *JIKI
	REDRAW 1
	AWAIT 16
GOTO *MAIN


;流れる星を表示するためのサブルーチン
*HAIKEI
	REPEAT SMAX
		COLOR C.CNT,C.CNT,C.CNT
		Y.CNT=Y.CNT+S.CNT
		IF Y.CNT>400 :Y.CNT=0
		PSET X.CNT,Y.CNT
	LOOP
RETURN


;自機を動かすためのサブルーチン	
*JIKI
	STICK PAT,15
	IF PAT=128 : END
	XV=(PAT>>2&1)-(PAT&1)
	YV=(PAT>>3&1)-(PAT>>1&1)
	MX=XV*MOVE+MX : MY=YV*MOVE+MY
	IF MX<0   : MX=O
	IF MX>566 : MX=566
	IF MY<0   : MY=0
	IF MY>364 : MY=364
	POS MX,MY : GMODE 2 : GCOPY 2,0,0,32,32
RETURN

ふむ、、、今までに比べると、なんか短くなったような気がする。特に失敗作(遅すぎる)の多重スクロールのプログラムなんて、この2倍ぐらいの長さだもんな(笑)

DIM(配列を割り当てる変数名),(要素の最大数)
指定した数の要素を持つ配列変数を作成
使うとき(変数名).(要素番号)

ちなみに変数名と要素番号の間は.(ピリオド)ね。

今までプログラムの本とか見ても、何に使うか一番わからなかったのがこの配列。でも仮に配列を使わないで、同じように星を100個制御しようと思うと、変数をめちゃめちゃいっぱい作らなきゃいけなくなるということのようだ。今回の場合、星の配置・明るさ・移動速度をランダムに設定してるから、配列変数を使わないと「;星をランダムに表示」のところはこんな感じになる。


;星をランダムに表示
	GSEL 0 : COLOR 0,0,0 : BOXF 0,0,600,400
	RND X0 ,600 : RND Y0 ,400 : RND C0 ,3 : RND S0 ,4
	RND X1 ,600 : RND Y1 ,400 : RND C1 ,3 : RND S1 ,4
	RND X2 ,600 : RND Y2 ,400 : RND C2 ,3 : RND S2 ,4
	RND X3 ,600 : RND Y3 ,400 : RND C3 ,3 : RND S3 ,4
・ ・ (中略) ・ ・
RND X98,600 : RND Y98,400 : RND C98,3 : RND S98,4 RND X99,600 : RND Y99,400 : RND C99,3 : RND S99,4

こんなのやってられっか〜〜〜(T-T)/
これを配列変数を使うことによって「n番目の要素」っていう感じに変数で処理ができるようになるというわけ。

んで、今回のミソ二つ目のシステム変数。一番上のプログラムで緑色になってるCNTってやつね。これはREPEAT〜LOOPの中で、今は何回目のループなのか?っていうのを格納してるスグレモノ。正確に言うと「カウンター」を調べるものなので、一回目のループだとCNT=0になるらしい。だからX.CNTが意味するのは、Xのカウンター番目の要素ってことだな。要はREPEAT〜LOOPを使うことによって、100行書く手間を省いてるというわけだ。これは便利。

さて、次のお題だけど、自機を操作するところで丸暗記^^;した部分(青くなってる部分ね)、全く意味がわからなくて悔しかったんで、方々に尋ねてやっと理解できた。それを忘れないうちに脳味噌に叩き込んでやろうっつーことで、ちょっと今までの奮闘記とは系統が異なるけど「解説」じみたことをやってみたいと思う。間違ってなきゃいいんだけど^^;

前のページへ戻る 奮闘記のメニューへ戻る 次のページへ進む