自機のパワーアップ(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

実行画面
実行画面


[プログラム全体と絵をダウンロード]
※「ゲームスタート時の初期設定」の、"noption=2 "の2を0や1に変えてみて下さい。

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