敵の処理を改良する(5/5)

 まとめますと、以下のようになります。
enedata.as

	; 敵のデータ
	

	; 動きのパターン
	dim enemvdx,8,32
	dim enemvdy,8,32
	dim nenemv,8

	; 階級
	dim eneclass,8

	; アニメーションパターン
	dim eneanimx,8,4:dim eneanimy,8,4
	dim enedmgx,8,4:dim enedmgy,8,4
	dim neneanim,8

	; 敵0 ザコ 茶
	enemvdx.0.0=-8:enemvdy.0.0=4
	enemvdx.0.1=-6:enemvdy.0.1=4
      ・
      ・
      ・
	enemvdx.0.15=-6:enemvdy.0.15=4
	nenemv.0=16
	eneclass.0=0
	eneanimx.0.0=$80:eneanimy.0.0=0
	eneanimx.0.1=$A0:eneanimy.0.1=0
	eneanimx.0.2=$C0:eneanimy.0.2=0
	eneanimx.0.3=$A0:eneanimy.0.3=0
	enedmgx.0.0=$60:enedmgy.0.0=$20
	enedmgx.0.1=$80:enedmgy.0.1=$20
	enedmgx.0.2=$A0:enedmgy.0.2=$20
	enedmgx.0.3=$80:enedmgy.0.3=$20
	neneanim.0=4

	; 敵1 ザコ 紫
	enemvdx.1.0=2:enemvdy.1.0=2
	enemvdx.1.1=2:enemvdy.1.1=4
      ・
      ・
      ・
sample15.as
	; プログラム起動時の初期設定
	#include "enedata.as"

	; 敵の変数宣言
	dim enekind,10
	dim enedir,10
	dim explosionx,5:dim explosiony,5

*Stage_Start
	; ステージ数表示
	gosub *Clear_Screen
	msx=112 :msy=208
	mescont="S T A G E  "+stageno
	gosub *wrtmes
	ddredraw
	await 2000

	; 敵の移動
	repeat 10
		if (enemyf.cnt=1)|(enemyf.cnt=2) {
			k=enekind.cnt
			if (eneclass.k=2)&(enemycnt.cnt<64) {
				enemyy.cnt=enemyy.cnt+2
			}
			else {
				if eneclass.k!2 {
					i=enemycnt.cnt\nenemv.k
				}
				else {
					i=(enemycnt.cnt-64)\nenemv.k
				}
				enemyx.cnt=enemyx.cnt+(enemvdx.k.i*(1-(enedir.cnt*2)))
				enemyy.cnt=enemyy.cnt+enemvdy.k.i
			}
			if (enedir.cnt=0)&(enemyx.cnt>=xsize) { enemyf.cnt=0 }
			if (enedir.cnt=1)&(enemyx.cnt<=(-32*(eneclass.k+1))) {
				enemyf.cnt=0 }
			if (enemyy.cnt>=ysize) { enemyf.cnt=0 }
			enemycnt.cnt=enemycnt.cnt+1
		}
	loop

	; 敵の出現
	if (mappnt\64=0)&(mappnt<=4096) {
		n=0
		w=-1
		repeat 10
			if enemyf.cnt=0 {
				if (mappnt!2048)&(mappnt!4096) {
					rnd enekind.cnt,3
				}
				if mappnt=2048 {
					rnd enekind.cnt,2
					enekind.cnt=enekind.cnt+3
				}
				if mappnt=4096 {
					enekind.cnt=stageno+4
				}
				k=enekind.cnt
				if eneclass.k!2 {
					repeat
						rnd r,xsize/(32*(eneclass.k+1))
						if r!w { break }
					loop
					w=r
					enemyx.cnt=r*(32*(eneclass.k+1))
					if eneclass.k=0 {
						enelife.cnt=3
					}
					else {
						enelife.cnt=20
					}
				}
				else {
					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
				n=n+1
				if (mappnt!2048)&(mappnt!4096) {
					if n=2 { break }
				}
				else {
					if n=1 { break }
				}
			}
		loop
	}

	; 敵弾の出現
	repeat 10
		k=enekind.cnt
		l=32*(eneclass.k+1)
		if ((enemyf.cnt=1)|(enemyf.cnt=2))&(enemyx.cnt>=0)&(enemyx.cnt<=(xsize-l))
			&(enemyy.cnt>=0)&(enemyy.cnt<=(ysize-l))&(enemycnt.cnt\64=0) {
			n=cnt
			repeat 100
				if eshotf.cnt=0 {
					eshotf.cnt=1
					eshotx.cnt=enemyx.n+((l-8)/2)
					eshoty.cnt=enemyy.n+((l-8)/2)
					smeshotx.cnt=eshotx.cnt<<8
					smeshoty.cnt=eshoty.cnt<<8
					ematan r,playerx+12-eshotx.cnt
						,playery+12-eshoty.cnt
					r=(192-r)&255
					smeshotdx.cnt=6*vcos.r
					smeshotdy.cnt=6*vsin.r
					break
				}
			loop
		}
	loop

	; 敵が爆発中の処理
	repeat 10
		if enemyf.cnt=3 {
			eplcnt.cnt=eplcnt.cnt+1
			k=enekind.cnt
			if (eneclass.k!2)&(eplcnt.cnt=15) { enemyf.cnt=0 }
			if (eneclass.k=2)&(eplcnt.cnt=300) {
				enemyf.cnt=0
				stageno=stageno+1
				if stageno<=3 {
					goto *Stage_Start
				}
				else {
					gosub *Ending
					goto *Game_Start
				}
			}
		}
	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
					k=enekind.cnt
					l=32*(eneclass.k+1)-1
					if ((enemyf.cnt=1)|(enemyf.cnt=2))
						&(x<=(enemyx.cnt+l))
						&((x+3)>=enemyx.cnt)
						&(y<=(enemyy.cnt+l))
						&((y+15)>=enemyy.cnt) {
						f=1
						enemyno=cnt
						gosub *Enemy_Dmg
					}
				loop
				if f=1 { shotf.i.cnt=0 }
			}
		loop
	loop

	; 自機と敵、敵弾の当たり判定
	if playerf=1 { 
		f=0
		repeat 10
			k=enekind.cnt
			l=32*(eneclass.k+1)-1
			if ((enemyf.cnt=1)|(enemyf.cnt=2))&((playerx+15)<=(enemyx.cnt+l))
				&((playerx+16)>=enemyx.cnt)
				&((playery+15)<=(enemyy.cnt+l))
				&((playery+16)>=enemyy.cnt) {
				f=1
				enemyno=cnt
				gosub *Enemy_Dmg
			}
		loop
		repeat 100
			if (eshotf.cnt=1)&((playerx+15)<=(eshotx.cnt+7))
				&((playerx+16)>=eshotx.cnt)
				&((playery+15)<=(eshoty.cnt+7))
				&((playery+16)>=eshoty.cnt) {
				f=1
				eshotf.cnt=0
			}
		loop
		if f=1 {
			playerf=3
			peplcnt=0
		}
	}

	; 敵を描画
	repeat 10
		if (enemyf.cnt=1)|(enemyf.cnt=2) {
			k=enekind.cnt
			gdx=enemyx.cnt:gdy=enemyy.cnt
			i=(enemycnt.cnt/16)\neneanim.k
			if enemyf.cnt=1 {
				gdox=eneanimx.k.i
				gdoy=eneanimy.k.i
			}
			if enemyf.cnt=2 {
				gdox=enedmgx.k.i
				gdoy=enedmgy.k.i
			}
			gdw=32*(eneclass.k+1):gdh=32*(eneclass.k+1)
			gosub *Graphic_Draw
		}
	loop

	; 敵の爆発を描画
	repeat 10
		if enemyf.cnt=3 {
			k=enekind.cnt
			if eneclass.k=0 {
				gdx=enemyx.cnt:gdy=enemyy.cnt
				if eplcnt.cnt<5 { gdox=0 }
				if (eplcnt.cnt>=5)&(eplcnt.cnt<10) { gdox=$20 }
				if eplcnt.cnt>=10 { gdox=$40 }
				gdoy=$20
				gdw=32:gdh=32
				gosub *Graphic_Draw
			}
			if eneclass.k=1 {
				gdx=enemyx.cnt:gdy=enemyy.cnt
				if eplcnt.cnt<5 { gdox=$180:gdoy=$80 }
				if (eplcnt.cnt>=5)&(eplcnt.cnt<10) { gdox=$1C0:gdoy=$80 }
				if eplcnt.cnt>=10 { gdox=$100:gdoy=$C0 }
				gdw=64:gdh=64
				gosub *Graphic_Draw
			}
			if (eneclass.k=2)&(eplcnt.cnt<150) {
				n=cnt
				if eplcnt.cnt\15=0 {
					repeat 5
						rnd r,96
						explosionx.cnt=enemyx.n-32+r
						rnd r,96
						explosiony.cnt=enemyy.n-32+r
					loop
				}
				i=eplcnt.n\15
				repeat 5
					gdx=explosionx.cnt:gdy=explosiony.cnt
					if i<5 { gdox=$180:gdoy=$80 }
					if (i>=5)&(i<10) { gdox=$1C0:gdoy=$80 }
					if i>=10 { gdox=$100:gdoy=$C0 }
					gdw=64:gdh=64
					gosub *Graphic_Draw
				loop
			}
		}
	loop

	; 敵のダメージ処理
*Enemy_Dmg
	; enemyno	: 敵の要素番号

	enemyf.enemyno=2
	dmgcnt.enemyno=0
	enelife.enemyno=enelife.enemyno-1
	if enelife.enemyno=0 {
		enemyf.enemyno=3
		eplcnt.enemyno=0
		kind=enekind.enemyno
		if eneclass.kind=0 { score=score+200 }
		if eneclass.kind=1 { score=score+10000 }
		if eneclass.kind=2 { score=score+30000 }
		if score>hiscore { hiscore=score }
		if score>=oneup {
			nplayer=nplayer+1
			oneup=oneup+100000
		}
	}
	return

	; エンディング
*Ending
	gosub *Clear_Screen
	msx=24:msy=64
	mescont="君の活躍によりアボガドロ軍は撤退した。"
	gosub *wrtmes
	msx=48:msy=96
	mescont="C O N G R A T U L A T I O N S"
	gosub *wrtmes
	msx=64:msy=160
	mescont="Y O U R  S C O R E  "+score
	gosub *wrtmes
	msx=64:msy=192
	mescont="H I G H  S C O R E  "+hiscore
	gosub *wrtmes
	ddredraw
	gosub *In_Key
	repeat
		await 16
		gosub *In_Key
		if (pckey=0)&(ckey=1) { break }
	loop
	return

実行画面
実行画面


[プログラム全体と絵をダウンロード]


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