自機のパワーアップ(2/2) |
5.自機弾に関する処理を修正する |
自機弾に関する処理は、基本的には自機のみについてやっていた処理をnoption+1機分に増やすだけです。「ステージスタート時の初期設定」の、自機弾の存在フラグを0に設定する処理を修正した時と同じように、たいていはrepeat,loop文を2重にするだけです。それ以外の修正をした箇所については補足説明をつけています。
; 自機弾の移動
repeat noption+1
i=cnt
repeat 4
if shotf.i.cnt=1 {
shoty.i.cnt=shoty.i.cnt-16
if ((shotx.i.cnt+4)<=0)|(shotx.i.cnt>=xsize)|(shoty.i.cnt<=-16)
{ shotf.i.cnt=0 }
}
loop
loop
オプションは画面の左右端より外に出ます。すると画面の外で弾を撃つことになります。これはおかしいので、画面の左右端より外にある場合にも弾を消すように変えています。(ただし画面の下端より外にある場合はそのままとしています。)
; 自機弾の射出
if ((playerf=1)|(playerf=2))&(ckey=1) {
shotcnt=shotcnt+1
if shotcnt=4 {
shotcnt=0
repeat noption+1
i=cnt
n=-1
repeat 4
if shotf.i.cnt=0 {
n=cnt
break
}
loop
if n!-1 {
if i=0 {
shotx.i.n=playerx+14
shoty.i.n=playery-16
}
else {
j=i-1
shotx.i.n=optionx.j+14
shoty.i.n=optiony.j-16
}
shotf.i.n=1
}
loop
}
}
弾の座標shotx,shotyの設定ですが、自機から出ている時は自機の座標をもとに、オプションから出ている時はオプションの座標をもとに計算する必要がありますから、そのように修正しています。
; 敵と自機弾の当たり判定
repeat noption+1
i=cnt
repeat 4
if shotf.i.cnt=1 {
x=shotx.i.cnt:y=shoty.i.cnt
f=0
repeat 10
if ((enemyf.cnt=1)|(enemyf.cnt=2))&(x<(enemyx.cnt+32))&
((x+4)>enemyx.cnt)&(y<(enemyy.cnt+32))&((y+16)>enemyy.cnt) {
f=1
enemyno=cnt
gosub *Enemy_Dmg
}
loop
if f=1 { shotf.i.cnt=0 }
}
loop
loop
; 自機弾を描画
repeat noption+1
i=cnt
repeat 4
if shotf.i.cnt=1 {
gdx=shotx.i.cnt:gdy=shoty.i.cnt
gdox=96:gdoy=0
gdw=4:gdh=16
gosub *Graphic_Draw
}
loop
loop
まとめますと、自機のパワーアップに関する処理は以下のようになります。
; プログラム起動時の初期設定 ; 自機弾の配列宣言 dim shotx,3,4 dim shoty,3,4 dim shotf,3,4 ; オプションの変数宣言 dim optionx,2:dim optiony,2 ; ゲームスタート時の初期設定 noption=2 ; ステージスタート時の初期設定 repeat 3 i=cnt repeat 4 shotf.i.cnt=0 loop loop optcnt=0 ; オプションの移動 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 noption+1 i=cnt repeat 4 if shotf.i.cnt=1 { shoty.i.cnt=shoty.i.cnt-16 if ((shotx.i.cnt+4)<=0)|(shotx.i.cnt>=xsize) |(shoty.i.cnt<=-16) { shotf.i.cnt=0 } } loop loop ; 自機弾の射出 if ((playerf=1)|(playerf=2))&(ckey=1) { shotcnt=shotcnt+1 if shotcnt=4 { shotcnt=0 repeat noption+1 i=cnt n=-1 repeat 4 if shotf.i.cnt=0 { n=cnt break } loop if n!-1 { if i=0 { shotx.i.n=playerx+14 shoty.i.n=playery-16 } else { j=i-1 shotx.i.n=optionx.j+14 shoty.i.n=optiony.j-16 } shotf.i.n=1 } loop } } ; 敵と自機弾の当たり判定 repeat noption+1 i=cnt repeat 4 if shotf.i.cnt=1 { x=shotx.i.cnt:y=shoty.i.cnt f=0 repeat 10 if ((enemyf.cnt=1)|(enemyf.cnt=2)) &(x<(enemyx.cnt+32)) &((x+4)>enemyx.cnt) &(y<(enemyy.cnt+32)) &((y+16)>enemyy.cnt) { f=1 enemyno=cnt gosub *Enemy_Dmg } loop if f=1 { shotf.i.cnt=0 } } loop loop ; 自機爆発中の処理 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 } } } ; オプションを描画 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 } ; 自機弾を描画 repeat noption+1 i=cnt repeat 4 if shotf.i.cnt=1 { gdx=shotx.i.cnt:gdy=shoty.i.cnt gdox=96:gdoy=0 gdw=4:gdh=16 gosub *Graphic_Draw } loop loop
実行画面