自機と敵、敵弾の当たり判定(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)と書くことにします。 ドモルガンの法則
まあ、別に覚えなくても、当たり前と言えば当たり前ですが。 |