SPALM Web Interpreter
Cannot use canvas tag.
No.
----
状態:
停止
ソース
'シューティング0101' '矢印キーで上下左右' 'Ctrlキーかスペースキーでビーム発射(押し続けると発射し続けます)' '敵は若干固いので、しばらくビームを当て続ける必要があります' 'また、敵を破壊すると一定範囲が誘爆します' '画面右上のレベル表示は、出現する敵の数と速度の目安になります' 'また、スタート画面でしばらく待つとデモになります' '(2016-6-19)(2016-6-21)(2016-7-4)(2016-7-8)(2016-9-17)' '(2016-10-2)(2016-11-16)(2017-3-2)(2017-8-6)(2017-8-17)' '(2018-3-17)(2018-4-20)(2018-7-17)' 'プログラム初期化' WAIT=30 setfont("T") pratio=(devpixratio>1.08)+1 // 高解像度対応 setscsize(300*pratio,300*pratio,300,300) scale(pratio,pratio) wd=width\pratio ht=height\pratio sw=stwide("0") sh=sthigh soft2("end") hs=load() 'ゲーム開始初期化' label 1000 tc=tc0=tc1=0;ts=tm=-1 mr=1;mmr=10;mmmr=30 glb sc ssc=0 k=0 glb k0 maxx=wd-1 maxy=ht-1 glb firstflag glb demoflag demopara1=6*6*sw*sw demopara2=50 demorr1=demorr2=demopri=0 demorx1=demorx2=0 demobeam=0 starttime=0 '(背景)' bgcol=0x000050 '(自機)' x=maxx\2 y=maxy*4\5 @(mst1," A ","HOH") @(mst2," @ ","@@@") x1=y1=x2=y2=0 vx1=vx2=0 waku=2 mhit=0 '(ビーム)' beam=bc=by=0 txtmake(bst,0,maxy\sh," ",1) txtline(bst,0,maxy\sh,0,0,0,maxy\sh,"c ") '(敵)' rnum=mmmr for (i=0;i<rnum;i++) { rf[i]=0 mismake(0,i,rf[i],rxd[i],ryd[i],rdg[i],rsp[i],rch,0,maxx,0,maxy,1,1) rpw[i]=0 } @(rst," === ","=RRR="," === ") '(弾)' tnum=mmmr for (i=0;i<tnum;i++) { tf[i]=0 mismake(1,i,tf[i],txd[i],tyd[i],tdg[i],tsp[i],tch,0,maxx,0,maxy,1,1) } @(tst,"i","i","V") '(爆風)' bsize=120 bsize2=bsize*bsize rdiff2=0 'ここからメインループ' '開始処理等' label 1001 if (!firstflag) { firstflag=1 keyinputsub(0) if (!demoflag) { sc=0 } } if (starttime<60000) { starttime+=WAIT } if (!demoflag) { sc++ } if (sc>1000000) { sc=1000000 } if (sc>hs) { hs=sc } ssc++ if (ssc>1000000) { ssc=1 } if (ssc%50==0) { mr++ if (mr>mmr) { mr=0 mmr=min(mmr+2,mmmr) } } '敵移動' if (ssc%6==0) { i=misfreeno(0,0,mr-1) if (i>=0) { rf[i]=1 rxd[i]=randint(0,maxx)*100 ryd[i]=0 rdg[i]=randint(60,120) rsp[i]=min(4+(mmr-10),10)*100 rpw[i]=5 } } mismove(0) '弾移動' if (ssc%6==0&&randint(0,100)<50&&starttime>=1500) { i=randint(0,max(mr-1,0)) if (rf[i]==1&&(ryd[i]\100<maxy\4)) { j=misfreeno(1,0,mr-1) if (j>=0) { tf[j]=1 txd[j]=rxd[i] tyd[j]=ryd[i] tdg[j]=atan2(y-tyd[j]\100,x-txd[j]\100) tsp[j]=min(6+(mmr-10),14)*100 } } } mismove(1) '自機移動' k=scan if (k0) { 'スタート時キー入力無効化' if (k&k0) { k=k^k0 } else { k0=0 } if (starttime>=1000) { k0=0 } } if (!demoflag) { 'キー操作' x+=(((k&16384)&&1)-((k&8192)&&1))*6 y+=(((k&32768)&&1)-((k&4096)&&1))*6 beam=(k&65536)?1:0 } else { 'デモのとき' if (keydowncode&&!(k&262144)) { demoflag=0 firstflag=0 goto 1000 } '自機の移動' '(優先行動でないときは、自機の振動を抑制する)' vx1=demo_move(x,y) if (!demopri&&vx1) { vx2=demo_move(x+vx1,y) if (vx1==-vx2) { vx1=0 } } x+=vx1 '自機ビーム発射' for (i=0;i<rnum;i++) { if (rf[i]==1) { if ((x>=rxd[i]\100-2*sw)&&(x<=rxd[i]\100+2*sw)) { demobeam=5 } } } if (demobeam>0) { beam=1 demobeam-- } else { beam=0 } } x=clamp(x,sw*1.5,maxx-sw*1.5) y=clamp(y,sh ,maxy-sh*2 ) 'ビーム処理' if (beam) { x1=x-sw*0.5+waku y1=0 +waku x2=x+sw*0.5-waku y2=y -waku by=0 j=-1 for (i=0;i<rnum;i++) { if (rf[i]==1&&(ryd[i]\100>by)) { if (txtbchk2(rst,0,2,x1,y1,x2,y2,"R",sw,sh,rxd[i]\100,ryd[i]\100,1)) { j=i by=ryd[i]\100 } } } if (j>=0) { rpw[j]-- if (rpw[j]<=0) { rf[j]=1000 rsp[j]=0 if (!demoflag) { sc+=100 } } } bc=max((y-by)\sh-1,1) } '爆風処理' for (i=0;i<rnum;i++) { if (rf[i]>=1000) { rf[i]++ if (rf[i]>=1010) { rf[i]=0 } else { for (j=0;j<rnum;j++) { if (rf[j]==1) { rdiff2=((rxd[j]-rxd[i])*(rxd[j]-rxd[i])+(ryd[j]-ryd[i])*(ryd[j]-ryd[i]))\10000 if (rdiff2 < bsize2) { rpw[j]-- if (rpw[j]<=0) { rf[j]=1000 rsp[j]=0 if (!demoflag) { sc+=200 } } } } } } } } '画面表示' showscrn() '実行時間測定' tc1=tick;tc=tc1-tc0;tc0=tc1 ts=(ts>=0)?min(ts,tc):10000 tm=(tm>=0)?max(tm,tc):0 col(0x00FF00) text(tc." ".ts."/".tm,0,sh*8,0) '衝突判定' mhit=0 x1=x-sw*1.3+waku y1=y+sh +waku x2=x+sw*1.3-waku y2=y+sh*2 -waku for (i=0;i<rnum;i++) { if (rf[i]==1) { if (txtbchk2(rst,0,2,x1,y1,x2,y2,"R",sw,sh,rxd[i]\100,ryd[i]\100,1)) { mhit=1 } } } for (i=0;i<tnum;i++) { if (tf[i]==1) { if (txtbchk2(tst,0,2,x1,y1,x2,y2,"V",sw,sh,txd[i]\100,tyd[i]\100,1)) { mhit=1 } } } if (mhit==1) { col(0xFF0000) txtdraw(mst2,0,1,x,y,1) if (!demoflag) { save(hs) } keyinputsub(1) goto 1000 } '終了処理' if (input(0)==262144) { endsub() } 'ウェイト' sleepsync(WAIT) goto 1001 'ここからサブルーチン' '文字表示(Sサイズ)' func textS(txt,x,y,anc) { setfont("S") text(txt,x,y,anc) setfont("T") } '画面表示' func showscrn() { '背景' col(bgcol) frect(0,0,wd,ht) 'スコア等' col(0xFFFF00) text("SCORE:".sc,0,0,0) col(0xFFA040) text("HI-SCORE:".hs,(wd\sw>40)?wd\2:sw*14,0,(wd\sw>40)) col(0xFFFF00) text("Lv.".mr."/".mmr." ",wd,0,8) 'デモのとき' if (demoflag) { col(0xFFFFFF) textS("== DEMO ==",wd/2,sh*10,1) } '敵表示' col(0xFFFFFF) for (i=0;i<rnum;i++) { if (rf[i]>0) { txtdraw(rst,0,2,rxd[i]\100,ryd[i]\100,1) } } '弾表示' for (i=0;i<tnum;i++) { if (tf[i]==1) { txtdraw(tst,0,2,txd[i]\100,tyd[i]\100,1) } } '自機表示' col(0xFFFF00) txtdraw(mst1,0,1,x,y,1) 'ビーム表示' if (beam) { txtdraw(bst,0,bc-1,x,y-bc*sh,1) } '爆風表示' colalpha(0xFFFF00,128) for (i=0;i<rnum;i++) { if (rf[i]>=1000) { '表示は半分のサイズにする' //farc(rxd[i]\100-bsize,ryd[i]\100-bsize+sh*1.5,bsize*2,bsize*2) farc(rxd[i]\100-bsize\2,ryd[i]\100-bsize\2+sh*1.5,bsize,bsize) } } } 'キー入力待ち' func keyinputsub(mode) { loc t '表示' if (!demoflag) { if (mode==0) { showscrn() col(0xFFFFFF) textS("== SHOOTING ==",wd/2,sh*10,1) } else { col(0xFFA040) textS("== GAME OVER ==",wd/2,sh*10,1) firstflag=0 sleep(1500) } col(bgcol) frect((wd-sw*15)/2,sh*13,sw*15,sh) col(0xFFFF00) text("HIT ANY KEY!",wd/2,sh*13,1) } 'キー入力' while (keydowncode) { sleep(100) } t=0 while (!keydowncode) { sleep(100) if (t<60000) { t+=100 } if (!demoflag) { if (mode==0) { if (t>=5000) { demoflag=1 break } } } else { if (t>=1600) { break } } } k0=scan if (k0&262144) { endsub() } if (keydowncode&&demoflag&&mode) { demoflag=0 firstflag=0 } clearkey() } '終了処理' func endsub() { col(bgcol) frect((wd-sw*15)/2,sh*13,sw*15,sh) col(0xFFFF00) text("=== END ===",wd/2,sh*13,1) end } '一番近い敵/弾を探す(デモ用)' func get_nearest(x,y) { loc demorr0 demorr1=demorr2=1000000 demorx1=demorx2=-1 for (i=0;i<rnum;i++) { if (rf[i]==1) { demorr0=(rxd[i]\100-x)*(rxd[i]\100-x)+(ryd[i]\100-y)*(ryd[i]\100-y) if (demorr0<demorr1) { demorr1=demorr0 demorx1=rxd[i]\100 } } } demorr2=demorr1 demorx2=demorx1 for (i=0;i<tnum;i++) { if (tf[i]==1) { demorr0=(txd[i]\100-x)*(txd[i]\100-x)+(tyd[i]\100-y)*(tyd[i]\100-y) if (demorr0<demorr1) { demorr1=demorr0 demorx1=txd[i]\100 } } } } '自機移動処理(デモ用)' func demo_move(x,y) { loc vx=0 get_nearest(x,y) demopri=0 '一番近い敵/弾を避ける(優先行動)' if (demorr1<=demopara1) { vx=sign2(demorx1-x)*-6 demopri=1 '一番近い敵に近づく' } elsif ((demorr2>demopara1*25)&&(demorx2>=0)&&(demorx2<=maxx)) { vx=sign(demorx2-x)*6 '中央に戻る' } elsif ((randint(1,100)<=demopara2)&&(abs(maxx\2-x)>=6)) { vx=sign(maxx\2-x)*6 } return vx }
詳細表示