敵の処理を改良する(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
実行画面