« [奮闘記]流れる星空を背景に、自分が好きなように動かせるキャラを表示するのだ | トップページ | [奮闘記]数式ってのはこういうものなのだ »

[奮闘記]配列を使って星の動きを制御するのだ

実は、今までのやり方の応用で多重スクロール(速度の異なったスクロールを重ね合わせる)をやってみたのだが、めったくそ遅い(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行書く手間を省いてるというわけだ。これは便利。

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

« [奮闘記]流れる星空を背景に、自分が好きなように動かせるキャラを表示するのだ | トップページ | [奮闘記]数式ってのはこういうものなのだ »

1.奮闘記」カテゴリの記事

コメント

コメントを書く

コメントは記事投稿者が公開するまで表示されません。

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/67538/57445598

この記事へのトラックバック一覧です: [奮闘記]配列を使って星の動きを制御するのだ:

« [奮闘記]流れる星空を背景に、自分が好きなように動かせるキャラを表示するのだ | トップページ | [奮闘記]数式ってのはこういうものなのだ »