敵の処理を改良する(2/5)

 2.変数の初期設定

「プログラム起動時の初期設定」に以下を追加します。
    ; 敵の変数宣言
    dim enekind,10
    dim enedir,10
    dim explosionx,5:dim explosiony,5
 enekindは敵の種類を入れます。
  敵の属性

 今まで、敵は左右にふらふらしながらもまっすぐに下降するものだけでした。今回、斜めに動く敵を追加しています。画面の左半分に出てきた時には右斜めに、右半分に出てきた時には左斜めに動かすことによって、バランスよく見えるようにしたいと思います。
 そこで、データ(enemvdx , enemvdy)としては右斜めに動くものを書いておき、右半分に出てきた時にはそれとは左右を反転して(enemvdxの正負を逆にして)動かすことにします。そのままの場合はenedirに0を、反転する場合は1を入れます。(dirはdirectionの略です。)
 敵の階級によって、爆発の仕方を変えたいと思います。ボスの場合は、ボムでやった時と同じように、複数の爆煙を描くことにします。そこで、爆煙の座標explosionx , explosionyを配列変数として追加しています。

 3.ステージ数表示

「ゲームスタート時の初期設定」と「ステージスタート時の初期設定」の間に「ステージ数表示」処理を追加します。
    *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秒空けた方が良い旨が記述されているからです。ステージ数を表示している時間が、前のステージが終わって次のステージが始まる間になるわけですから、それにあたります。

 4.敵の出現

    ; 敵の出現
    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
    }

 5.敵の移動

    ; 敵の移動
    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から始まる値になります。


[目次へ][前へ][次へ] inserted by FC2 system