自機と敵、敵弾の当たり判定(3/3)

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

	; Ctrl Keyが押されるのを待つ
	gosub *In_Key
*Wait_Ctrl
	await 16
	gosub *In_Key
	if (pckey=1)|(ckey=0) { goto *Wait_Ctrl }

	; ステージスタート時の初期設定
	playerf=1

	; 自機の移動
	if (playerf=1)|(playerf=2) {
		gosub *In_Key
		if ukey=1 { playery=playery-4 }
		if dkey=1 { playery=playery+4 }
		if lkey=1 { playerx=playerx-4 }
		if rkey=1 { playerx=playerx+4 }
		if playerx<0 { playerx=0 }
		if playerx>(xsize-32) { playerx=xsize-32 }
		if playery<0 { playery=0 }
		if playery>(ysize-32) { playery=ysize-32 }
	}

	; 自機弾の射出
	if ((playerf=1)|(playerf=2))&(ckey=1) {
		shotcnt=shotcnt+1
		if shotcnt=4 {
			shotcnt=0
			n=-1
			repeat 4
				if shotf.cnt=0 {
					n=cnt
					break
				}
			loop
			if n!-1 {
				shotx.n=playerx+14
				shoty.n=playery-16
				shotf.n=1
			}
		}
	}

	; 自機と敵、敵弾の当たり判定
	if playerf=1 { 
		f=0
		repeat 10
			if ((enemyf.cnt=1)|(enemyf.cnt=2))&((playerx+15)<=(enemyx.cnt+31))&
				((playerx+16)>=enemyx.cnt)&((playery+15)<=(enemyy.cnt+31))&
				((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
		}
	}

	; 自機爆発中の処理
	if playerf=3 {
		peplcnt=peplcnt+1
		if peplcnt=100 {
			nplayer=nplayer-1
			if nplayer=0 {
				playerf=0
				govercnt=0
			}
			else {
				playerf=2
				revcnt=0
				playerx=xsize/2-16
				playery=ysize-64
			}
		}
	}

	; 自機復活中の処理
	if playerf=2 {
		revcnt=revcnt+1
		if revcnt=200 { playerf=1 }
	}

	; 自機を描画
	if (playerf=1)|((playerf=2)&(revcnt\10<5)) {
		gdx=playerx:gdy=playery
		gdox=0:gdoy=0
		gdw=32:gdh=32
		if (rkey=1)&(lkey=0) { gdox=$20 }
		if (lkey=1)&(rkey=0) { gdox=$40 }
		gosub *Graphic_Draw
	}
	if (playerf=3)&(peplcnt<30) {
		gdx=playerx-16:gdy=playery
		if peplcnt<10 { gdox=0 }
		if (peplcnt>=10)&(peplcnt<20) { gdox=$40 }
		if peplcnt>=20 { gdox=$80 }
		gdoy=$1C0
		gdw=64:gdh=32
		gosub *Graphic_Draw
	}

	; ゲームオーバー処理
	if playerf=0 {
		govercnt=govercnt+1
		if govercnt=500 { goto *Game_Start }
		msx=96:msy=168
		mescont="G A M E  O V E R"
		gosub *wrtmes
	}

	; キー、ジョイパッドの入力
*In_Key
	pckey=ckey
	pukey=ukey
	pdkey=dkey
	plkey=lkey
	prkey=rkey

	ckey=0
	ukey=0
	dkey=0
	lkey=0
	rkey=0

	digetkeystate key,0
	if key&256!0 { ckey=1 }
	if key&1!0 { ukey=1 }
	if key&2!0 { dkey=1 }
	if key&4!0 { lkey=1 }
	if key&8!0 { rkey=1 }

	digetkeystate key,1
	if key&16777216!0 { ukey=1 }
	if key&2!0 { dkey=1 }
	if key&64!0 { lkey=1 }
	if key&1048576!0 { rkey=1 }

	if njoy>0 {
		digetjoystate key,0
		if key&16!0 { ckey=1 }
		if key&1!0 { ukey=1 }
		if key&2!0 { dkey=1 }
		if key&4!0 { lkey=1 }
		if key&8!0 { rkey=1 }
	}

	return

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

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

実行画面
実行画面


[プログラム全体と絵をダウンロード]
※「敵と自機弾の当たり判定」処理も、「敵のダメージ処理」サブルーチンを呼ぶように書き換えています。

ひとくちメモ:
・ドモルガンの法則
 HSPには否定(Not)を行う演算子がありません。「この条件式の否定はなんになるのかなあ」と、自分で考えなければいけません。そこで、知っていると便利なのがドモルガンの法則です。今、条件Aの否定をNot(A)と書くことにします。

ドモルガンの法則
  • Not(A and B) = Not(A) or Not(B)
  • Not(A or B) = Not(A) and Not(B)
 つまり、「Aであり、かつBである」の否定は「Aではないか、またはBではない」です。「AかまたはBである」の否定は、「Aでもなく、Bでもない」です。
 まあ、別に覚えなくても、当たり前と言えば当たり前ですが。
 


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