背景描画

本作の背景は、星を多重スクロール風(4層)で表示しています。
多重といっても描画は各層の重ねあわせではなく、それぞれの星を全くバラバラに縦移動させています。
このような描画をする場合、X座標、Y座標、速度、色などの情報を管理する必要があります。
しかし、各情報を個別の配列で管理したり、乱数値をそれぞれ得たりすると、コード量が膨れてしまいます。


最終的に以下のようなコード(本体はrepeat-loop部分)となりました。(このままスクリプトエディタに張り付けて実行可能です。)
なお、dim省略などの行儀のよくない作りをしており、ヘタに組み込むと弊害が出たりします。参考にする場合は十分注意してください。

*main
    redraw:await 15:redraw 0:color :boxf
	repeat 207			; cntはx座標成分と兼用
		dup fs,sppg(cnt)	; sppgはdimしていないが、初回描画で207個分に拡張される
		if(fs){}else{fs=rnd(32767)}	; 描画色(0-31)、速度(0-3)、Y位置(32倍計算)を1度に乱数取得
		tmp=((fs&3)+1)*32:hsvcolor (fs&31)*6,100,tmp+127:pset cnt*3,fs/32
		fs+tmp:fs\(16400+cnt) ; Y位置を動かして、下まで行ったら変化を加えて上から繰り返し。
	loop
	goto *main


詳細を見ていきましょう。

repeat 207

207は星の数。半端ですが、後のpsetで3倍した値をX座標の範囲にあてています。
右側ゲージに掛からないよう、X座標を621までに抑えたので、この値。

dup fs,sppg(cnt)

整数型配列sppgによって各星の位置や属性を管理しています。アクセスのコストを下げるためcntで示される要素をfsにdupします。
どこにもdimがありませんが、初回で207個分のループによって配列が自動拡張されることを利用して、配列宣言を省略しています。

if(fs){}else{fs=rnd(32767)}

fsの値が0である場合、乱数値で初期化します。初期化したいのはY位置、色指定、スクロール速度。
関数は高コストなので、rnd()は一回。
Y座標の初期値(32倍計算)、描画色指定(0-31)、速度指定(0-3)のまとまりとして乱数を得てfsに代入します。
最初はどの配列要素も0ですから、ランダムなY座標に星が置かれます。
(厳密には配列拡張が行われた際に反故にされる範囲がありますが、初回描画だけなので無視)

tmp=((fs&3)+1)*32

fsの下2ビット(0-3の4種)に1足して32倍したものを速度値(32,64,96,128)としています。
速度であると同時に、明度の制御にも使っています。

hsvcolor (fs&31)*6,100,tmp+127

hsvcolorによる色指定。
fsの下5ビット(0-31)を6倍して色相値として指定、彩度は100固定、明度は速く動く星ほど大きくします。

pset cnt*3,fs/32

X座標は上にも書いたようにcntの3倍、Y座標はfsを32で割った値。

fs+tmp

Y方向の移動計算。速度値を加算するだけです。

fs\(16400+cnt)

星が画面下に到達した場合に、画面上部に持ってくるための計算。480*32より適当に大きな値でfsを割った余りを代入しています。
速度や描画色も変わってきます。(隣の星と変化の差をつけるためにcntも利用)
このとき余りが丁度0になって、次の描画で乱数値の取得対象になることが稀にあります。
その場合、途中の高さから星が出現するわけですが、ただの背景描画ですから気にする必要はありません。


repeat−loop部分、AXにして220Bytesになります。