風呂STG
風呂につかって考えた。
本来ノベルゲーム目的に作られたNScripterがCPU占有率100%なんてことをすることはない。それは異常な事態なんだ。ならば、本来の動作を思い出させてやればいい。
ノベル系の、実害のない命令をはさんでやれば……と思って風呂を出ると、http://d.hatena.ne.jp/eiji8pou/20051016/1129471721#c1129559501で而さんから同様のアドバイスが。しこうさんと読むのかな? ありがとうございます。
追加要素
- 移動する方向に弾が飛ぶようにした。
- 敵はやられると爆発に変わる。爆発「*」は一定時間画面残り、そこに敵がつっこむとさらに誘爆する。
- 数字は上から「自分の弾で倒した敵数」「誘爆で倒した敵数」「出現した敵数」「倒した敵合計/出現敵数のパーセンテージ」
- 敵が弾をうつようになった。現時点で敵の弾を排除する方法はない。
- くらい判定を作った。命は一機だけ。
スクリプト
*define numalias hp,100 ; その存在のHP。0以下になると爆発する。 numalias x,101 ; その存在の位置 numalias y,102 numalias dx,103 ; その存在のx方向移動量 numalias dy,104 numalias sp,105 ; その存在のスプライト種類 numalias mv,106 ; その存在の動き方 numalias ct,107 ; その存在で汎用的に使うカウンタ numalias on,108 ; その存在が使われているかどうかのフラグ numalias rd,109 ; 角度とか numalias score,190 numalias score2,191 numalias enemy,192 for %0=100 to 109 dim ?%0[201] next defsub abs game *start saveoff ; グラフィックの設定 lsph 0,":s/32,32,0;#0000FF▲",0,0 lsph 1,":s/32,32,0;#FF0000■",0,0 lsph 2,":s/32,32,0;#FFFFFF△",0,0 lsph 3,":s/64,64,0;#FFFFFF*",0,0 lsph 4,":s/32,32,0;#FF0000・",0,0 lsph 5,":s/32,32,0;#FFFFFF●",0,0 lsph 6,":s/32,32,0;#FFFFFF▽",0,0 for %0=100 to 109 for %1=0 to 201 mov ?%0[%1],0 next next mov %5,1 ; 自分の設定 mov ?x[0],320 mov ?y[0],320 mov ?on[0],1 mov ?sp[0],0 mov ?hp[0],100 mov ?mv[201],3 *main resettimer *main_my ; 自分の位置を決定 getmousepos %0,%1 mov ?dx[0],%0-?x[0] mov ?dy[0],%1-?y[0] mov ?x[0],?x[0]+?dx[0]/5 mov ?y[0],?y[0]+?dy[0]/5 if ?x[0]<0 mov ?x[0],0 if ?x[0]>639 mov ?x[0],639 if ?y[0]<0 mov ?y[0],0 if ?y[0]>479 mov ?y[0],479 ; 射撃中かどうか決定 isdown %0 if %0=0 goto *main_brid_move mov %50,1 ; 弾番号 *main_brid inc %50 if %50>51 goto *main_brid_move if ?on[%50]=1 goto *main_brid mov ?on[%50],1 mov ?hp[%50],1 mov ?x[%50],?x[0] mov ?y[%50],?y[0] mov ?sp[%50],1 mov ?dx[%50],?dx[0] mov ?dy[%50],?dy[0] if ?dx[0]=0 && ?dy[0]=0 mov ?dy[%50],0-32 ; 弾の移動 *main_brid_move for %50=2 to 51 if ?on[%50]=0 goto *main_brid_move_next mov ?x[%50],?x[%50]+?dx[%50] mov ?y[%50],?y[%50]+?dy[%50] if ?x[%50]<0 mov ?on[%50],0 if ?x[%50]>639 mov ?on[%50],0 if ?y[%50]<0 mov ?on[%50],0 if ?y[%50]>479 mov ?on[%50],0 *main_brid_move_next next *main_enemy ; 敵の発生 for %50=52 to 101 if ?on[%50]=1 goto *main_enemy_next rnd2 %0,1,100 if %0>1 goto *main_enemy_next inc %enemy mov ?on[%50],1 rnd2 %0,1,10 mov ?mv[%50],%0 mov ?dx[%50],0 mov ?dy[%50],0 mov ?rd[%50],0 mov ?sp[%50],2 if %0=1 rnd2 %1,0,319:mov ?x[%50],%1:mov ?y[%50],0:mov ?ct[%50],0 if %0=2 rnd2 %1,320,639:mov ?x[%50],%1:mov ?y[%50],0:mov ?ct[%50],0:mov ?sp[%50],6 if %0=3 rnd2 %1,0,639:mov ?x[%50],%1:mov ?y[%50],0:rnd2 %1,1,10:mov ?dy[%50],%1:mov ?rd[%50],180 if %0=4 rnd2 %1,0,639:mov ?x[%50],%1:mov ?y[%50],479:rnd2 %1,-10,-1:mov ?dy[%50],%1:mov ?rd[%50],0 if %0=5 rnd2 %1,0,479:mov ?x[%50],0:mov ?y[%50],%1:rnd2 %1,1,10:mov ?dx[%50],%1:mov ?rd[%50],270 if %0=6 rnd2 %1,0,479:mov ?x[%50],639:mov ?y[%50],%1:rnd2 %1,-10,-1:mov ?dx[%50],%1:mov ?rd[%50],90 if %0=7 rnd2 %1,0,639:mov ?x[%50],%1:mov ?y[%50],0:mov ?dx[%50],(?x[0]-?x[%50])/50:mov ?dy[%50],(?y[0]-?y[%50])/50:mov ?sp[%50],5 if %0=8 rnd2 %1,0,639:mov ?x[%50],%1:mov ?y[%50],479:mov ?dx[%50],(?x[0]-?x[%50])/50:mov ?dy[%50],(?y[0]-?y[%50])/50:mov ?sp[%50],5 if %0=9 rnd2 %1,0,479:mov ?x[%50],0:mov ?y[%50],%1:mov ?dx[%50],(?x[0]-?x[%50])/50:mov ?dy[%50],(?y[0]-?y[%50])/50:mov ?sp[%50],5 if %0=10 rnd2 %1,0,479:mov ?x[%50],639:mov ?y[%50],%1:mov ?dx[%50],(?x[0]-?x[%50])/50:mov ?dy[%50],(?y[0]-?y[%50])/50:mov ?sp[%50],5 *main_enemy_next next ; 敵の移動 *main_enemy_move for %50=52 to 101 if ?on[%50]=0 goto *main_enemy_move_next if ?mv[%50]>2 goto *main_enemy_move_next2 mov ?rd[%50],180 if ?ct[%50]<50 mov ?dx[%50],0:mov ?dy[%50],4:goto *main_enemy_move2 if ?ct[%50]<130 mov ?dx[%50],4:mov ?dy[%50],0:mov ?rd[%50],270:goto *main_enemy_move2 if ?ct[%50]<180 mov ?dx[%50],0:mov ?dy[%50],4:goto *main_enemy_move2 mov ?dx[%50],0-4:mov ?dy[%50],0:mov ?rd[%50],90 *main_enemy_move2 if ?mv[%50]=2 mov ?dx[%50],?dx[%50]*(0-1):mov ?rd[%50],?rd[%50]+180 mov ?ct[%50],?ct[%50]+1:if ?ct[%50]>259 mov ?ct[%50],0 *main_enemy_move_next2 mov ?x[%50],?x[%50]+?dx[%50]:mov ?y[%50],?y[%50]+?dy[%50] if ?x[%50]<0 mov?on[%50],0 if ?x[%50]>639 mov?on[%50],0 if ?y[%50]<0 mov?on[%50],0 if ?y[%50]>479 mov?on[%50],0 *main_enemy_move_next next ; 敵弾の発生 for %50 = 52 to 101 if ?on[%50]=0 goto *main_enemy_brid_next rnd2 %0,0,1000 if %0>1 goto *main_enemy_brid_next mov %51,101 *main_enemy_brid_next2 inc %51 if %51>151 goto *main_enemy_brid_next if ?on[%51]=1 goto *main_enemy_brid_next2 mov ?on[%51],1 mov ?sp[%51],4 mov ?x[%51],?x[%50] mov ?y[%51],?y[%50] rnd2 %0,40,60 mov ?dx[%51],(?x[0]-?x[%51])/%0 mov ?dy[%51],(?y[0]-?y[%51])/%0 *main_enemy_brid_next next ; 敵弾の移動 *main_enemybrid_move for %50=102 to 151 if ?on[%50]=0 goto *main_enemybrid_move_next mov ?x[%50],?x[%50]+?dx[%50]:mov ?y[%50],?y[%50]+?dy[%50] if ?x[%50]<0 mov?on[%50],0 if ?x[%50]>639 mov?on[%50],0 if ?y[%50]<0 mov?on[%50],0 if ?y[%50]>479 mov?on[%50],0 *main_enemybrid_move_next next ; 爆発の移動と消滅 for %50=152 to 201 if ?on[%50]=0 goto *main_bomb if ?ct[%50]<0 mov ?on[%50],0 mov ?x[%50],?x[%50]+?dx[%50] mov ?y[%50],?y[%50]+?dy[%50] mov ?ct[%50],?ct[%50]-1 *main_bomb next ; 自分の弾と敵の接触判定 *main_brid_enemy for %50=2 to 51 if ?on[%50]=0 goto *main_brid_enemy_1 for %51 = 52 to 101 if ?on[%51]=0 goto *main_brid_enemy_2 abs %0,?x[%50]-?x[%51] if %0>32 goto *main_brid_enemy_2 abs %0,?y[%50]-?y[%51] if %0>32 goto *main_brid_enemy_2 mov ?on[%50],0 mov ?on[%51],0 mov ?on[%51+100],1 mov ?x[%51+100],?x[%51] mov ?y[%51+100],?y[%51] mov ?dx[%51+100],?dx[%51] mov ?dy[%51+100],?dy[%51] mov ?sp[%51+100],3 mov ?ct[%51+100],10 inc %score break *main_brid_enemy_2 next *main_brid_enemy_1 next ; 爆発と敵の接触判定 *main_bomb_enemy for %50=152 to 201 if ?on[%50]=0 goto *main_bomb_enemy_1 for %51 = 52 to 101 if ?on[%51]=0 goto *main_bomb_enemy_2 abs %0,?x[%50]-?x[%51] if %0>32 goto *main_bomb_enemy_2 abs %0,?y[%50]-?y[%51] if %0>32 goto *main_bomb_enemy_2 mov ?on[%50],0 mov ?on[%51],0 mov ?on[%51+100],1 mov ?x[%51+100],?x[%51] mov ?y[%51+100],?y[%51] mov ?dx[%51+100],?dx[%51] mov ?dy[%51+100],?dy[%51] mov ?sp[%51+100],3 mov ?ct[%51+100],10 inc %score2 break *main_bomb_enemy_2 next *main_bomb_enemy_1 next ; 敵と自分の接触判定 for %50=52 to 151 if ?on[%50]=0 goto *main_enemy_my mov %0,?x[0]-?x[%50]:mov %0,%0*%0 mov %1,?y[0]-?y[%50]:mov %1,%1*%1 mov %2,%0+%1 if %2<145 mov ?sp[0],3:break *main_enemy_my next ; 全体の表示 *main_print drawclear for %50=0 to 201 if ?on[%50]>0 drawsp2 ?sp[%50],0,255,?x[%50],?y[%50],100,100,?rd[%50] next draw if ?sp[0]=3 goto *bomb if %enemy>1 mov %5,(%score+%score2)*100/%enemy prnum 0,%score,10,10,26,26,#FFFFFF prnum 1,%score2,10,36,26,26,#FFFFFF prnum 2,%enemy,10,62,26,26,#FF0000 prnum 3,%5,10,88,26,26,#FF00FF print 1 gettimer %0 mov %1,100-%0 if %1<1 mov %1,1 wait %1 goto *main *bomb br br br br GAME OVER selnum %0,"RESTART","END" if %0=1 end reset *abs getparam i%150,%151 if %151<0 mul %151,(-1) mov %%150,%151 return
まとめ
しかし、動きが悪くなったなー。
やっぱ無理があるのか。
まあ、STGは息抜きなのでこの辺で。