自機のパワーアップ(1/2) |
1.変数の宣言、初期設定 |
2.オプションの移動 |
3.オプションを描画 |
4.自機爆発中の処理を修正する |
5.自機弾に関する処理を修正する |
一口に自機のパワーアップといっても、いろいろな種類がありますね。
1.変数の宣言、初期設定 |
オプションからも自機と同じように弾を出したいのですから、弾に関する配列変数shotx,shoty,shotfが3組あればよいという事になります。そこで、これらを1次元配列から2次元配列に修正します。
dim shotx,3,4
dim shoty,3,4
dim shotf,3,4
shotx .0 .n (n=0〜3)が自機用、shotx .1 .nが1個めのオプション用、shotx .2 .nが2個めのオプション用です。shoty,shotfについても同様です。
オプションの座標の配列変数を宣言します。
dim optionx,2:dim optiony,2
以上は「プログラム起動時の初期設定」で行います。
「ゲームスタート時の初期設定」で、オプションの個数を設定します。
noption=2
本当は最初は0個で、アイテムを取ると1個増えるようにしたいのですが、アイテムの処理をまだ作っていないので、とりあえず2個にしておきます。
「ステージスタート時の初期設定」で、以下を行います。
自機弾の存在フラグを0に設定する処理を修正します。2次元配列になったので、次のようになります。
repeat 3
i=cnt
repeat 4
shotf.i.cnt=0
loop
loop
オプション用のカウンターに0を代入します。
optcnt=0
2.オプションの移動 |
オプションの個数に応じた移動処理を行います。
すると、「オプションの移動」処理は、以下のようになります。
if (playerf=1)|(playerf=2) {
repeat noption
i=(-(optcnt*4)+(128*cnt))&255
optionx.cnt=playerx+(vcos.i*48>>8)
optiony.cnt=playery+(vsin.i*48>>8)
loop
}
optcnt=optcnt+1
この処理は、自機の状態が「通常」または「復活中」の場合に行います。やられたらオプションを失うのであれば、復活中の時はやらなくていいんじゃないの? と思う方がいるかもしれませんが、復活している最中にアイテムを取ることはあり得ます。
repeat文の引数が0である時、repeatとloopの間にある処理は行われません。ですから、オプションが0個である時、この処理は行われません。
iはオプションの角度です。1個めの角度は、-(optcnt*4)で求まります。2個めの角度は、それに128を足した値です。"&255"は以前説明した通り、角度を0〜255の範囲に収めるためのものです。
自機の中心の座標は、playerx,playeryそれぞれに16を足した値です。オプションの中心の座標も同様です。
半径が48ドットですから、optionxは(playerx+16)+(vcos.i*48>>8)-16となります。つまりplayerx+(vcos.i*48>>8)です。vcos.iは小数部8ビットを含んだ値ですから、整数にするには8ビット右にシフトする必要があります。すると"vcos.i>>8*48"と書いた方が分かりやすいように感じるかもしれませんが、これだと">>8"を行った時点で小数部が切り捨てられてしまいますので、誤差が大きくなります。"*48"を先にやった方が、精度が高いです。(といいますか、"vcos.i>>8*48"の計算結果は、0か48にしかなりません。)
optionyについても同様です。
3.オプションを描画 |
絵のファイル中の、オプションの座標です。
オプションを描画する処理は以下の通りです。
if (playerf=1)|(playerf=2) {
repeat noption
gdx=optionx.cnt:gdy=optiony.cnt
gdox=$E0:gdoy=0
gdw=32:gdh=32
gosub *Graphic_Draw
loop
}
4.自機爆発中の処理を修正する |
自機がやられたら、オプションの個数を0にするよう、命令を追加します。
; 自機爆発中の処理
if playerf=3 {
peplcnt=peplcnt+1
if peplcnt=100 {
noption=0 ←ここです。
nplayer=nplayer-1
if nplayer=0 {
playerf=0
govercnt=0
}
else {
playerf=2
revcnt=0
playerx=xsize/2-16
playery=ysize-64
}
}
}