「プログラム起動時の初期設定」に以下を追加します。
; 敵の変数宣言
dim enekind,10
dim enedir,10
dim explosionx,5:dim explosiony,5
enekindは敵の種類を入れます。
今まで、敵は左右にふらふらしながらもまっすぐに下降するものだけでした。今回、斜めに動く敵を追加しています。画面の左半分に出てきた時には右斜めに、右半分に出てきた時には左斜めに動かすことによって、バランスよく見えるようにしたいと思います。
そこで、データ(enemvdx , enemvdy)としては右斜めに動くものを書いておき、右半分に出てきた時にはそれとは左右を反転して(enemvdxの正負を逆にして)動かすことにします。そのままの場合はenedirに0を、反転する場合は1を入れます。(dirはdirectionの略です。)
敵の階級によって、爆発の仕方を変えたいと思います。ボスの場合は、ボムでやった時と同じように、複数の爆煙を描くことにします。そこで、爆煙の座標explosionx , explosionyを配列変数として追加しています。
「ゲームスタート時の初期設定」と「ステージスタート時の初期設定」の間に「ステージ数表示」処理を追加します。
*Stage_Start
; ステージ数表示
gosub *Clear_Screen
msx=112 :msy=208
mescont="S T A G E "+stageno
gosub *wrtmes
ddredraw
await 2000
"await 2000"で2秒待っています。なぜ2秒かというと、HSPのヘルプに、midiの演奏を止めてから再び鳴らすまで、1、2秒空けた方が良い旨が記述されているからです。ステージ数を表示している時間が、前のステージが終わって次のステージが始まる間になるわけですから、それにあたります。
- 敵はmappntが4096以下の時だけ出し、それ以降は出さないことにします。
- mappntが2048の時中型敵を、4096の時ボスを出します。それ以外の時はザコを出します。
- 種類は0〜2番がザコ、3、4番が中型敵、5〜7番がボスです。ザコと中型敵は、どの種類にするかを乱数で決めます。ボスは、ステージ1は5番、ステージ2は6番、ステージ3は7番を出します。
- 敵のx座標は、ザコと中型敵については乱数で決めます。ボスについては、画面の真ん中とします。
- y座標は、画面上端のすぐ上とします。ザコは−32、中型敵は−64、ボスは−96です。
- 耐久力enelifeですが、ザコは3、中型敵は20、ボスは300に設定します。
- enedirですが、敵の中心のx座標が画面の中心より小さい時は0、等しいかまたは大きい時は1とします。
- ザコは今まで通り1度に2つ出します。中型敵とボスは1つしか出しません。
; 敵の出現
if (mappnt\64=0)&(mappnt<=4096) {
n=0
w=-1
repeat 10
if enemyf.cnt=0 {
if (mappnt!2048)&(mappnt!4096) {
rnd enekind.cnt,3
}
if mappnt=2048 {
rnd enekind.cnt,2
enekind.cnt=enekind.cnt+3
}
if mappnt=4096 {
enekind.cnt=stageno+4
}
k=enekind.cnt
if eneclass.k!2 {
repeat
rnd r,xsize/(32*(eneclass.k+1))
if r!w { break }
loop
w=r
enemyx.cnt=r*(32*(eneclass.k+1))
if eneclass.k=0 {
enelife.cnt=3
}
else {
enelife.cnt=20
}
}
else {
enemyx.cnt=(xsize-96)/2
enelife.cnt=300
}
enemyy.cnt=-32*(eneclass.k+1)
enedir.cnt=0
if (enemyx.cnt+(32*(eneclass.k+1)/2))>=(xsize/2) {
enedir.cnt=1
}
enemyf.cnt=1
enemycnt.cnt=0
n=n+1
if (mappnt!2048)&(mappnt!4096) {
if n=2 { break }
}
else {
if n=1 { break }
}
}
loop
}
- 32*(eneclass.k+1)という式が随所に出てきますが、これは敵のサイズを表しています。eneclassは0か1か2です。それに1を足して32倍すればそれぞれ32、64、96となり、階級に応じた大きさとなります。
- x座標を決める時、前は敵が画面からはみださないように、左右の端には出さないようにしていたのですが、今回は気にしていません。以前の講座「画面の大きさを調整する」で、はみだしても気にしなくていいようにしたからです。
- 敵の種類に対応する動きのパターンenemvdx , enemvdyに従って移動させます。
- ボスに関してだけ、しばらくの間(enemycntが64になるまで)まっすぐ下に動かします。その後enemvdx , enemvdyに従って移動させます。
- enemvdxをx座標に足す時に、enedirが0の場合は+enemvdxを、enedirが1の場合は-enemvdxを足します。
- 下端からはみだした時だけでなく、enedirが0の場合は右端から、enedirが1の場合は左端からはみだした場合も敵を消します。
; 敵の移動
repeat 10
if (enemyf.cnt=1)|(enemyf.cnt=2) {
k=enekind.cnt
if (eneclass.k=2)&(enemycnt.cnt<64) {
enemyy.cnt=enemyy.cnt+2
}
else {
if eneclass.k!2 {
i=enemycnt.cnt\nenemv.k
}
else {
i=(enemycnt.cnt-64)\nenemv.k
}
enemyx.cnt=enemyx.cnt+(enemvdx.k.i*(1-(enedir.cnt*2)))
enemyy.cnt=enemyy.cnt+enemvdy.k.i
}
if (enedir.cnt=0)&(enemyx.cnt>=xsize) { enemyf.cnt=0 }
if (enedir.cnt=1)&(enemyx.cnt<=(-32*(eneclass.k+1))) { enemyf.cnt=0 }
if (enemyy.cnt>=ysize) { enemyf.cnt=0 }
enemycnt.cnt=enemycnt.cnt+1
}
loop
nenemvが要素の数なので、前に"i=enemycnt.cnt\16"とあった所は"i=enemycnt.cnt\nenemv.k"となります。ボスはenemycntが64以降の時動きのパターンに従って動くようにしたいので"i=(enemycnt.cnt-64)\nenemv.k"とします。64を引くことで、0から始まる値になります。
[目次へ]|[前へ]|[次へ]