敵の配置データ(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"でも半角スペースでもない時、それは敵の種類ですので、敵を出します。この処理は前とだいたい同じですが、以下の点が違います。
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
}