敵の配置データ(1/2)

 どこでどんな敵が出てくるかをデータとして指定し、これに従って出るように改良します。ついでに、アイテムの配置もこのデータの中に含め、やはりこれに従って出るようにします。

 1.敵の配置データを用意する
 2.敵の出現
 3.アイテムの出現

 1.敵の配置データを用意する

 今まで敵の種類、x座標は乱数で決めていましたが、やめます。1度に出す敵のデータを、以下のように書きます。
  " ,0, , ,2, ,0, , , "
 画面の横幅を32ドットごとに区切り、左から何番目に何を出すかを指定します。この場合、左から2番目に種類0、5番目に種類2、7番目に種類0の敵を出します。左から1番目のx座標は0、2番目は32、3番目は64、……となります。半角スペースの箇所には何も出しません。画面の横幅が320ドットですから、1行には10個のデータがあります。
 1度に出す敵は2匹まで、という制限もやめます。
 アイテムは、オプションを"o"、ボムを"b"で表します。
  " ,0, , ,2, ,0, , ,o"
 と書けば、右から1番目にオプションアイテムを出す、という指定になります。
 この1行に対応して出てくる敵、アイテムは下図の通りです。
  敵の行データ

 敵の配置データを書くためのファイルをenemap.asとします。
 データを入れるための配列変数enemapを宣言します。
    sdim enemap,20,3,100
 例えばステージ1のデータは以下のようになります。
    ; ステージ1のデータ
    enemap.0.64="5, , , , , , , , , "
    ・
    ・
    ・
    enemap.0.10=" ,1, , , , , , ,1, "
    enemap.0. 9=" , , , , , , , , , "
    enemap.0. 8=" , , , ,1, , , , , "
    enemap.0. 7=" , , , , , , , , , "
    enemap.0. 6=" , , , , , , , ,0, "
    enemap.0. 5=" , , , , , , ,0, , "
    enemap.0. 4=" , , , , , ,0, , , "
    enemap.0. 3=" , , , ,o, , , , , "
    enemap.0. 2=" ,0, , , , , , , , "
    enemap.0. 1=" , ,0, , , , , , , "
    enemap.0. 0=" , , ,0, , , , , , "
 1番目の添え字はステージ番号、2番目の添え字は行番号です。mappntが64の倍数の時に敵を出します。0行目がmappnt=0の時、1行目がmappnt=64の時、2行目がmappnt=128の時……に出す敵のデータです。mappntは0から始まって4096まで増えますから、0行から64行までのデータが必要ということになります。
 64行目にある種類5の敵はボスです。ボスは必ず画面の中央から出すようにしましたので、左から何番目に書いても同じです。
 なお、画面中に敵は最大10匹まで、アイテムは1個までしか出せませんから、あまりぎゅうぎゅう詰めに並べてしまうと、指定した通りに出ません。

 2.敵の出現

「敵の出現」処理を修正します。

(1)全体
 mappntが64の倍数の時、該当する行のenemapにつき、左から順に文字を見ていきます。文字は変数kに入れるものとし、kがアイテムだった場合の処理、kが敵だった場合の処理を行います。
    ; 敵の出現
    if (mappnt\64=0)&(mappnt<=4096) {
        s=stageno-1
        i=mappnt/64
        itemstr=""
        repeat 10
            k=0
            str k
            strmid k,enemap.s.i,cnt*2,1
            kがアイテムである時の処理
            kが敵である時の処理
        loop
    }

(2)kがアイテムである時の処理
 kが"o"か"b"の時、後の「アイテムの出現」処理に渡すために、その文字を変数itemstrに、文字の位置をitemposに入れます。strはstring、posはpositionの略です。
    if (k="o")|(k="b") {
        itemstr=k
        itempos=cnt
        continue
    }
 kが"o"でも"b"でもない場合、itemstrには""(文字が何もない)が入ります。

(3)kが敵である時の処理
 kが"o"でも"b"でも半角スペースでもない時、それは敵の種類ですので、敵を出します。この処理は前とだいたい同じですが、以下の点が違います。

    if k!" " {
        int k
        x=cnt
        repeat 10
            if enemyf.cnt=0 {
                enekind.cnt=k
                if eneclass.k=0 {
                    enemyx.cnt=x*32
                    enelife.cnt=3
                }
                if eneclass.k=1 {
                    enemyx.cnt=x*32
                    enelife.cnt=20
                }
                if eneclass.k=2 {
                    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
                break
            }
        loop
    }

 3.アイテムの出現

 mappntとは関係なく、種類をitemstrに応じて、位置をitemposに応じて決めるように変えます。itemstrが""の場合何も出しません。
    ; アイテムの出現
    if (itemf=0)&(itemstr!"") {
        itemf=1
        if (itemstr="o") { ikind=0 }
        if (itemstr="b") { ikind=1 }
        itemx=itempos*32
        itemy=-32
    }


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