今回はHSPネタです。
大昔に自分が書いたコードを見ていたら、「星の多重スクロール」をさせるプログラムがありました。星といってもpsetで点を打って動かしてるだけです。横スクロールシューティングの背景でよくあるアレです。
仕様としては、3レイヤーで各20個の点が移動します。
そのコードがこちら。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 |
title "Star Scroll Test (3Layers)" dim ax,20 dim ay,20 dim bx,20 dim by,20 ax = rnd(640),rnd(640),rnd(640),rnd(640),rnd(640),rnd(640),rnd(640),rnd(640),rnd(640),rnd(640),rnd(640),rnd(640),rnd(640),rnd(640),rnd(640),rnd(640),rnd(640),rnd(640),rnd(640),rnd(640) bx = rnd(640),rnd(640),rnd(640),rnd(640),rnd(640),rnd(640),rnd(640),rnd(640),rnd(640),rnd(640),rnd(640),rnd(640),rnd(640),rnd(640),rnd(640),rnd(640),rnd(640),rnd(640),rnd(640),rnd(640) cx = rnd(640),rnd(640),rnd(640),rnd(640),rnd(640),rnd(640),rnd(640),rnd(640),rnd(640),rnd(640),rnd(640),rnd(640),rnd(640),rnd(640),rnd(640),rnd(640),rnd(640),rnd(640),rnd(640),rnd(640) ay = rnd(480),rnd(480),rnd(480),rnd(480),rnd(480),rnd(480),rnd(480),rnd(480),rnd(480),rnd(480),rnd(480),rnd(480),rnd(480),rnd(480),rnd(480),rnd(480),rnd(480),rnd(480),rnd(480),rnd(480) by = rnd(480),rnd(480),rnd(480),rnd(480),rnd(480),rnd(480),rnd(480),rnd(480),rnd(480),rnd(480),rnd(480),rnd(480),rnd(480),rnd(480),rnd(480),rnd(480),rnd(480),rnd(480),rnd(480),rnd(480) cy = rnd(480),rnd(480),rnd(480),rnd(480),rnd(480),rnd(480),rnd(480),rnd(480),rnd(480),rnd(480),rnd(480),rnd(480),rnd(480),rnd(480),rnd(480),rnd(480),rnd(480),rnd(480),rnd(480),rnd(480) *sc redraw 0 cls 4 color 253,255,100 pset ax(1),ay(1) ax(1)-2 if ax(1)<0:ax(1) = 640:ay(1)=rnd(480) pset ax(2),ay(2) ax(2)-2 if ax(2)<0:ax(2) = 640:ay(2)=rnd(480) pset ax(3),ay(3) ax(3)-2 if ax(3)<0:ax(3) = 640:ay(3)=rnd(480) pset ax(4),ay(4) ax(4)-2 if ax(4)<0:ax(4) = 640:ay(4)=rnd(480) pset ax(5),ay(5) ax(5)-2 if ax(5)<0:ax(5) = 640:ay(5)=rnd(480) pset ax(6),ay(6) ax(6)-2 if ax(6)<0:ax(6) = 640:ay(6)=rnd(480) pset ax(7),ay(7) ax(7)-2 if ax(7)<0:ax(7) = 640:ay(7)=rnd(480) pset ax(8),ay(8) ax(8)-2 if ax(8)<0:ax(8) = 640:ay(8)=rnd(480) pset ax(9),ay(9) ax(9)-2 if ax(9)<0:ax(9) = 640:ay(9)=rnd(480) pset ax(10),ay(10) ax(10)-2 if ax(10)<0:ax(10) = 640:ay(10)=rnd(480) pset ax(11),ay(11) ax(11)-2 if ax(11)<0:ax(11) = 640:ay(11)=rnd(480) pset ax(12),ay(12) ax(12)-2 if ax(12)<0:ax(12) = 640:ay(12)=rnd(480) pset ax(13),ay(13) ax(13)-2 if ax(13)<0:ax(13) = 640:ay(13)=rnd(480) pset ax(14),ay(14) ax(14)-2 if ax(14)<0:ax(14) = 640:ay(14)=rnd(480) pset ax(15),ay(15) ax(15)-2 if ax(15)<0:ax(15) = 640:ay(15)=rnd(480) pset ax(16),ay(16) ax(16)-2 if ax(16)<0:ax(16) = 640:ay(16)=rnd(480) pset ax(17),ay(17) ax(17)-2 if ax(17)<0:ax(17) = 640:ay(17)=rnd(480) pset ax(18),ay(18) ax(18)-2 if ax(18)<0:ax(18) = 640:ay(18)=rnd(480) pset ax(19),ay(19) ax(19)-2 if ax(19)<0:ax(19) = 640:ay(19)=rnd(480) pset ax(0),ay(0) ax(0)-2 if ax(0)<0:ax(0) = 640:ay(0)=rnd(480) color 140,106,255 pset bx(1),by(1) bx(1)-3 if bx(1)<0:bx(1) = 640:by(1)=rnd(480) pset bx(2),by(2) bx(2)-3 if bx(2)<0:bx(2) = 640:by(2)=rnd(480) pset bx(3),by(3) bx(3)-3 if bx(3)<0:bx(3) = 640:by(3)=rnd(480) pset bx(4),by(4) bx(4)-3 if bx(4)<0:bx(4) = 640:by(4)=rnd(480) pset bx(5),by(5) bx(5)-3 if bx(5)<0:bx(5) = 640:by(5)=rnd(480) pset bx(6),by(6) bx(6)-3 if bx(6)<0:bx(6) = 640:by(6)=rnd(480) pset bx(7),by(7) bx(7)-3 if bx(7)<0:bx(7) = 640:by(7)=rnd(480) pset bx(8),by(8) bx(8)-3 if bx(8)<0:bx(8) = 640:by(8)=rnd(480) pset bx(9),by(9) bx(9)-3 if bx(9)<0:bx(9) = 640:by(9)=rnd(480) pset bx(10),by(10) bx(10)-3 if bx(10)<0:bx(10) = 640:by(10)=rnd(480) pset bx(11),by(11) bx(11)-3 if bx(11)<0:bx(11) = 640:by(11)=rnd(480) pset bx(12),by(12) bx(12)-3 if bx(12)<0:bx(12) = 640:by(12)=rnd(480) pset bx(13),by(13) bx(13)-3 if bx(13)<0:bx(13) = 640:by(13)=rnd(480) pset bx(14),by(14) bx(14)-3 if bx(14)<0:bx(14) = 640:by(14)=rnd(480) pset bx(15),by(15) bx(15)-3 if bx(15)<0:bx(15) = 640:by(15)=rnd(480) pset bx(16),by(16) bx(16)-3 if bx(16)<0:bx(16) = 640:by(16)=rnd(480) pset bx(17),by(17) bx(17)-3 if bx(17)<0:bx(17) = 640:by(17)=rnd(480) pset bx(18),by(18) bx(18)-3 if bx(18)<0:bx(18) = 640:by(18)=rnd(480) pset bx(19),by(19) bx(19)-3 if bx(19)<0:bx(19) = 640:by(19)=rnd(480) pset bx(0),by(0) bx(0)-3 if bx(0)<0:bx(0) = 640:by(0)=rnd(480) color 255,255,255 pset cx(1),cy(1) cx(1)-5 if cx(1)<0:cx(1) = 640:cy(1)=rnd(480) pset cx(2),cy(2) cx(2)-5 if cx(2)<0:cx(2) = 640:cy(2)=rnd(480) pset cx(3),cy(3) cx(3)-5 if cx(3)<0:cx(3) = 640:cy(3)=rnd(480) pset cx(4),cy(4) cx(4)-5 if cx(4)<0:cx(4) = 640:cy(4)=rnd(480) pset cx(5),cy(5) cx(5)-5 if cx(5)<0:cx(5) = 640:cy(5)=rnd(480) pset cx(6),cy(6) cx(6)-5 if cx(6)<0:cx(6) = 640:cy(6)=rnd(480) pset cx(7),cy(7) cx(7)-5 if cx(7)<0:cx(7) = 640:cy(7)=rnd(480) pset cx(8),cy(8) cx(8)-5 if cx(8)<0:cx(8) = 640:cy(8)=rnd(480) pset cx(9),cy(9) cx(9)-5 if cx(9)<0:cx(9) = 640:cy(9)=rnd(480) pset cx(10),cy(10) cx(10)-5 if cx(10)<0:cx(10) = 640:cy(10)=rnd(480) pset cx(11),cy(11) cx(11)-5 if cx(11)<0:cx(11) = 640:cy(11)=rnd(480) pset cx(12),cy(12) cx(12)-5 if cx(12)<0:cx(12) = 640:cy(12)=rnd(480) pset cx(13),cy(13) cx(13)-5 if cx(13)<0:cx(13) = 640:cy(13)=rnd(480) pset cx(14),cy(14) cx(14)-5 if cx(14)<0:cx(14) = 640:cy(14)=rnd(480) pset cx(15),cy(15) cx(15)-5 if cx(15)<0:cx(15) = 640:cy(15)=rnd(480) pset cx(16),cy(16) cx(16)-5 if cx(16)<0:cx(16) = 640:cy(16)=rnd(480) pset cx(17),cy(17) cx(17)-5 if cx(17)<0:cx(17) = 640:cy(17)=rnd(480) pset cx(18),cy(18) cx(18)-5 if cx(18)<0:cx(18) = 640:cy(18)=rnd(480) pset cx(19),cy(19) cx(19)-5 if cx(19)<0:cx(19) = 640:cy(19)=rnd(480) pset cx(0),cy(0) cx(0)-5 if cx(0)<0:cx(0) = 640:cy(0)=rnd(480) redraw 1 wait 2 goto *sc |
いやぁもう長くて酷いですね。驚いたことに、なんとループを使っていません。アホかと。
このプログラムは配列変数の数だけ繰り替し処理を行っていますが、ループを使わず、すべてずらずらと記述してあります。無駄ですね。
ループの説明に入る前に配列変数について少し。
たとえば、arrValという変数を用意します。配列は5です。
1 |
dim arrVal,5 |
続いて、これに値を代入します。
1 |
arrVal = 1,2,3,4,5 |
これで値が代入されました。
ではこれを全部足してみます。
1 2 3 |
total = arrVal(0)+arrVal(1)+arrVal(2)+arrVal(3)+arrVal(4) mes total stop |
これで画面には1+2+3+4+5の結果が表示されることでしょう。
この例の場合では配列が少ないのでたいした手間ではありませんが、最初にあげたプログラムのように、配列が多くなった場合はどうでしょうか。
入力するのは大変手間ですね。そこでループを使います。
今度は、arrValの配列を100として、先ほどと同様に値を1から順番に入れていきます。
1 2 3 4 |
dim arrVal,100 for i,0,100,1 arrVal(i)=i+1 next |
ループを使うとたったこれだけです。
ここではfor~next文を用いています。2行目の意味は「i」を「0」から「100」まで「1」づつ増やせ。となります。
従ってarrVal(0)には1が、arrVal(1)には2が、というように順番に代入されていくのです。
ではこれを足していきます。
1 2 3 4 |
foreach arrVal total = total+arrVal(cnt) loop mes total |
今度はforeach~loop文を使用しました。
arrValの配列の数だけforeach~loop間を繰り返せ、という意味になります。ここではarrValの配列は100ですから、100回繰り返されます。
cntはループした回数を表します。すなわち、1回目のループではcnt=0、2回目のループではcnt=1となります。
それでは、以上を踏まえた上で、最初のプログラムを書き換えてみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
title "Star Scroll Test (3Layers)" dim ax,20 dim ay,20 dim bx,20 dim by,20 for i,0,20,1 ay(i) = rnd(640) bx(i) = rnd(640) cx(i) = rnd(640) ax(i) = rnd(480) by(i) = rnd(480) cy(i) = rnd(480) next *sc redraw 0 cls 4 foreach ay color 253,255,100 pset ax(cnt),ay(cnt) ax(cnt)-2 if ax(cnt)<0:ax(cnt) = 640:ax(cnt)=rnd(480) loop foreach by color 140,106,255 pset bx(cnt),by(cnt) bx(cnt)-3 if bx(cnt)<0:bx(cnt) = 640:by(cnt)=rnd(480) loop foreach cy color 255,255,255 pset cx(cnt),cy(cnt) cx(cnt)-5 if cx(cnt)<0:cx(cnt) = 640:cy(cnt)=rnd(480) loop redraw 1 wait 2 goto *sc |
いかがでしょうか。行数は1/5となり、大幅な軽量化ができました。
余談ですが、さらにコンパクトにもできます。
配列0~19に1層目のデータを、20~39に2層目を、40~59に3層目のデータを格納させました。
もっとも、リソースが豊富な今のコンピュータ環境からいうと、容量よりも可読性の方を優先すべきでしょうね。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
title "Star Scroll Test (3Layers)" dim x,60 dim y,60 for i,0,60,1 x(i) = rnd(640) y(i) = rnd(480) next *sc redraw 0 cls 4 foreach x if 0<= cnt and cnt<=19 :x(cnt)-2:color 253,255,100 if 20<= cnt and cnt<=39 :x(cnt)-3:color 255,146,100 if 40<= cnt and cnt<=60 :x(cnt)-5:color 255,255,255 if x(cnt)<0:x(cnt) = 641:y(cnt)=rnd(480) pset x(cnt),y(cnt) loop redraw 1 wait 2 goto *sc |