;=========================================================== ; 2007/04/07 ; 戦車vs●.U Var.0.10.0 ; GAM-22 ;=========================================================== #packopt name "tank.exe" #uselib "winmm.dll" #cfunc timeGetTime "timeGetTime" title "画面は開発中のものです。";title "戦車vs●.U" ;----------------------------------------------------------- ; 定数 ;----------------------------------------------------------- ; 数学計算系 #define π2 1.57079632; 1/2π #define π 3.14159265; π #define zero 0.0; 0.0 if 0{ ; 0→-1, 1→1 #defcfunc pm int p1 return -1+p1*2 ;----------------------------------------------------------- ; 標準命令の改良系 ;----------------------------------------------------------- ; コサイン改 #defcfunc cos2 double p1 return cos(p1-1.57079632) ; サイン改 #defcfunc sin2 double p1 return sin(p1-1.57079632) ; アークタンジェント改 #defcfunc atan2 double p1, double p2 return atan(p1,p2)+1.57079632 ; 内積 #defcfunc inner double x1, double y1, double x2, double y2 return x1*x2+y1*y2 ; 外積 #defcfunc cross double x1, double y1, double x2, double y2 return x1*y2-x2*y1 #module mo #defcfunc chk_line double ax1, double ay1, double ax2, double ay2, double bx1, double by1, double bx2, double by2 ;------------------------------------------------------- ; 線分同士の交差判定 ;------------------------------------------------------- ; ; p1,p2 : x1,y1(A) ; p3,p4 : x2,y2(A) ; p5,p6 : x1,y1(A) ; p7,p8 : x2,y2(A) ;------------------------------------------------------- ; ax2-ax1, ay2-ay1 の法線 m1 = -(ay2-ay1) : m2 = ax2-ax1 ; 正規化(長さを1.0にする) m3 = sqrt(m1*m1 + m2*m2) if m3>0 : m3 = 1.0/m3 m1 *= m3 m2 *= m3 ; var d = -(ax * nx + ay * ny); ; var t = -(nx * x + ny * y + d) / (nx * dx + ny * dy); if (m1*(bx2-bx1) + m2*(by2-by1))!0{ m4 = -(m1*bx1 + m2*by1 - (ax1*m1 + ay1*m2)) / (m1*(bx2-bx1) + m2*(by2-by1)) }else{ return 0 } ; cx = x + dx * t; ; cy = y + dy * t; if m4>0 & m4<=1{ stat1@ = bx1+(bx2-bx1)*m4 stat2@ = by1+(by2-by1)*m4 return inner(ax1-stat1@, ay1-stat2@, ax2-stat1@, ay2-stat2@) < 0 }else{ return 0 } #deffunc grotate2 int x, int y, int win_id, int gpx, int gpy, int gsx, int gsy, double r, double sx, double sy, int copy_mode ;------------------------------------------------------- ; grotateの改良 ;------------------------------------------------------- ; ; p1,p2 : カレントポジションのX,Y座標 ; p3 : コピー元のウィンドウID ; p4,p5 : コピー元の左上X,Y座標 ; p6,p7 : コピー元のX,Yサイズ ; p8 : 回転角度(単位はラジアン) ; p9,p10 : X,Yサイズ ; p11 : コピーモード ;------------------------------------------------------- m1 = x-lx@ m2 = y-ly@ if sx>=sy{ m3 = sx }else{ m3 = sy } m3 *= 0.707106781186548 if ((m1+m3)<=0) | ((m1-m3)>=640) | ((m2+m3)<=0) | ((m2-m3)>=448) : return 0 pos m1, m2 gmode copy_mode, gsx,gsy grotate win_id, gpx,gpy, r, sx,sy return 1 #global #deffunc draw_cat int id, int x, int y, double r, int left, int right ;------------------------------------------------------- ; キャタピラ ;------------------------------------------------------- ; ; p1 : id ; p2,p3 : x,y ; p4 : 角度 ; p5,p6 : 左右キャタピラの値 ;------------------------------------------------------- repeat 2 ; 左右 rcnt = cnt if cnt{ m1 = right\cat_gsy(id) }else{ m1 = left\cat_gsy(id) } m2 = cos2(r +cat_gr(id)*pm(cnt)) *cat_grs(id) m3 = sin2(r +cat_gr(id)*pm(cnt)) *cat_grs(id) repeat 12 +(m1!0) ; 本体 m4 = cat_gsy(id) m5 = m1 if cnt=0{ m4 -= m1 m5 /= 2 } if cnt=12{ m4 = m1 m5 = cat_gsy(id) } grotate2 x+m2+ (cos2(r) *m5) -(cos2(r) *cat_gsy(id) *cnt), y+m3+(sin2(r) *m5) -(sin2(r) *cat_gsy(id) *cnt), 2, cat_gpx(id),cat_gpy(id), cat_gsx(id),cat_gsy(id), r, cat_gsx(id), m4, 2 loop loop return #deffunc draw_arm int id, int x, int y, double r ;------------------------------------------------------- ; 装甲 ;------------------------------------------------------- ; ; p1 : id ; p2,p3 : x,y ; p4 : 角度 ;------------------------------------------------------- grotate2 x,y, 3, arm_gpx(id),arm_gpy(id), arm_gsx(id),arm_gsy(id), r, arm_gsx(id),arm_gsy(id), 2 return #deffunc draw_coa int id, int x, int y, double r ;------------------------------------------------------- ; コア ;------------------------------------------------------- ; ; p1 : id ; p2,p3 : x,y ; p4 : 角度 ;------------------------------------------------------- grotate2 x,y, 1, coa_gpx(id),coa_gpy(id), coa_gsx(id),coa_gsy(id), r, coa_gsx(id),coa_gsy(id), 2 return #deffunc draw_gun int id, int x, int y, double r ;------------------------------------------------------- ; 大砲 ;------------------------------------------------------- ; ; p1 : id ; p2,p3 : x,y ; p4 : 角度 ;------------------------------------------------------- repeat gun_mut(id) m1 = gun_max*cnt+id m2 = gun_gun(m1) grotate2 x+cos2(r+gun_pr(m1))*gun_prs(m1), y+sin2(r+gun_pr(m1))*gun_prs(m1), 4, gund_gpx(m2),gund_gpy(m2), gund_gsx(m2),gund_gsy(m2), r, gund_gsx(m2),gund_gsy(m2), 2 loop return #deffunc draw_obj int id, int x, int y, double r ;------------------------------------------------------- ; 物体 ;------------------------------------------------------- ; ; p1 : id ; p2,p3 : x,y ; p4 : 角度 ;------------------------------------------------------- grotate2 x,y, 6, objd_gpx(id),objd_gpy(id), objd_gsx(id),objd_gsy(id), r, objd_gsx(id),objd_gsy(id), 2 return #deffunc draw_bullet int id, int x, int y, double r ;------------------------------------------------------- ; 弾 ;------------------------------------------------------- ; ; p1 : id ; p2,p3 : x,y ; p4 : 角度 ;------------------------------------------------------- ; 範囲内チック m1 = x-lx m2 = y-ly if (m1+buld_gsx(id)<=0) | (m1>=640) | (m2+buld_gsy(id)<=0) | (m2>=448) : return gsel 8 color buld_gcr(id), buld_gcg(id), buld_gcb(id) : boxf 0,0, buld_gsx(id),buld_gsy(id) pos buld_gsx(id),0 : gcopy 7, buld_gpx(id),buld_gpy(id), buld_gsx(id),buld_gsy(id) gsel 0 gmode 7 pos x-lx-buld_gsx(id)/2,y-ly-buld_gsy(id)/2 gcopy 8, 0,0, buld_gsx(id),buld_gsy(id) return #defcfunc chk_polygon int aid, int ax, int ay, double ar, int bid, int bx, int by, double br ;------------------------------------------------------- ; 多角形同士の判定 ;------------------------------------------------------- ; ; p1 : id(A) ; p2,p3 : x,y(A) ; p4 : 角度(A) ; p5 : id(A) ; p6,p7 : x,y(A) ; p8 : 角度(A) ;------------------------------------------------------- /* color 255 circle ax-chk_size(aid)-lx, ay-chk_size(aid)-ly, ax+chk_size(aid)-lx, ay+chk_size(aid)-ly, 0 circle bx-chk_size(bid)-lx, by-chk_size(bid)-ly, bx+chk_size(bid)-lx, by+chk_size(bid)-ly, 0 */ ; 簡易判定 if abs((bx-ax)*(bx-ax)+(by-ay)*(by-ay)) >= (chk_size(aid)+chk_size(bid))*(chk_size(aid)+chk_size(bid)){ return 0; 少なくとも当たってない } dim m3 dim m1 dim m2 repeat chk_cmax(aid) mrcnt = cnt if (cnt+1)!chk_cmax(aid){ m1++ }else{ m1 = 0 } repeat chk_cmax(bid) if (cnt+1)!chk_cmax(bid){ m2++ }else{ m2 = 0 } /* m4 = ax+cos2(chk_r(mrcnt*chk_max+aid)+ar)*chk_rs(mrcnt*chk_max+aid) m5 = ay+sin2(chk_r(mrcnt*chk_max+aid)+ar)*chk_rs(mrcnt*chk_max+aid) m6 = ax+cos2(chk_r(m1*chk_max+aid)+ar)*chk_rs(m1*chk_max+aid) m7 = ay+sin2(chk_r(m1*chk_max+aid)+ar)*chk_rs(m1*chk_max+aid) m8 = bx+cos2(chk_r(cnt*chk_max+bid)+br)*chk_rs(cnt*chk_max+bid) m9 = by+sin2(chk_r(cnt*chk_max+bid)+br)*chk_rs(cnt*chk_max+bid) m10 = bx+cos2(chk_r(m2*chk_max+bid)+br)*chk_rs(m2*chk_max+bid) m11 = by+sin2(chk_r(m2*chk_max+bid)+br)*chk_rs(m2*chk_max+bid) m3 += chk_line(m4, m5, m6, m7, m8, m9, m10, m11 ) color 255 line m4-lx, m5-ly, m6-lx, m7-ly line m8-lx, m9-ly, m10-lx, m11-ly pos m8-lx, m9-ly mes cnt+1 */ m3 += chk_line(ax+cos2(chk_r(mrcnt*chk_max+aid)+ar)*chk_rs(mrcnt*chk_max+aid), ay+sin2(chk_r(mrcnt*chk_max+aid)+ar)*chk_rs(mrcnt*chk_max+aid), ax+cos2(chk_r(m1*chk_max+aid)+ar)*chk_rs(m1*chk_max+aid), ay+sin2(chk_r(m1*chk_max+aid)+ar)*chk_rs(m1*chk_max+aid), bx+cos2(chk_r(cnt*chk_max+bid)+br)*chk_rs(cnt*chk_max+bid), by+sin2(chk_r(cnt*chk_max+bid)+br)*chk_rs(cnt*chk_max+bid), bx+cos2(chk_r(m2*chk_max+bid)+br)*chk_rs(m2*chk_max+bid), by+sin2(chk_r(m2*chk_max+bid)+br)*chk_rs(m2*chk_max+bid) ) loop loop return m3!0 #defcfunc chk_polygon_line int aid, int ax, int ay, double ar, int bx1, int by1, int bx2, int by2, int bsize ;------------------------------------------------------- ; 多角形と線分の判定 ;------------------------------------------------------- ; ; p1 : id(A) ; p2,p3 : x,y(A) ; p4 : 角度(A) ; p5,p6 : x1,y1(B) ; p7,p8 : x2,y2(B) ; p9 : 半径(B) ;------------------------------------------------------- ;circle bx1-bsize-lx, by1-bsize-ly, bx1+bsize-lx, by1+bsize-ly, 0 if abs((bx1-ax)*(bx1-ax)+(by1-ay)*(by1-ay)) >= (chk_size(aid)+bsize)*(chk_size(aid)+bsize){ return 0; 少なくとも当たってない } dim m1 dim m2 ;line bx1-lx, by1-ly, bx2-lx, by2-ly repeat chk_cmax(aid) if (cnt+1)!chk_cmax(aid){ m1++ }else{ m1 = 0 } m2 += chk_line(ax+cos2(chk_r(cnt*chk_max+aid)+ar)*chk_rs(cnt*chk_max+aid), ay+sin2(chk_r(cnt*chk_max+aid)+ar)*chk_rs(cnt*chk_max+aid), ax+cos2(chk_r(m1*chk_max+aid)+ar)*chk_rs(m1*chk_max+aid), ay+sin2(chk_r(m1*chk_max+aid)+ar)*chk_rs(m1*chk_max+aid), bx1, by1, bx2, by2) loop return m2!0 /* #defcfunc chk_box2 int ax, int ay, int asx, int asy, int bx, int by, int bsx, int bsy ;------------------------------------------------------- ; 回転しない矩形同士の衝突判定 ;------------------------------------------------------- ; ; p1,p2 : x,y(A) ; p3,p4 : x,y サイズ(A) ; p5,p6 : x,y(B) ; p7,p8 : x,y サイズ(B) ;------------------------------------------------------- return (ax+asx>=bx) & (bx+bsx>=ax) & (ay+asy>=by) & (by+bsy>=ay)*/ } ;----------------------------------------------------------- ; 画像ロード ;----------------------------------------------------------- chdir "image" ; コア buffer 1 picload "coa_001.GIF" ; エンジン(キャタピラ) buffer 2 picload "caterpillar_001.GIF" ; 装甲 buffer 3 picload "armor_001.GIF" ; 大砲 buffer 4 picload "gun_001.GIF" ; マップチップ buffer 5 picload "map_002.bmp" ; 物体 buffer 6 picload "objct_001.bmp" ; 弾 アルファ buffer 7 picload "bullet_002.bmp" ; αコピー用 バッファ buffer 8 ; 爆風 buffer 9 picload "bom_002.bmp" ; 爆風 buffer 10 picload "bom_002a.bmp" screen 0, 640, 448 ;----------------------------------------------------------- ; マップデータロード ;----------------------------------------------------------- chdir "../map" mapx = 20 mapy = 100 dim map, mapx, mapy map(0,0) = 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 map(0,1) = 00,01,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 map(0,2) = 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 map(0,3) = 00,00,01,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 map(0,4) = 00,00,00,00,00,01,00,00,00,00,00,00,00,00,00,00,00,00,00,00 map(0,5) = 00,00,00,00,00,00,00,02,03,04,00,00,00,00,00,00,00,00,00,00 map(0,6) = 00,00,00,00,00,00,02,06,06,07,00,00,00,00,00,00,00,00,00,00 map(0,7) = 00,00,02,03,04,00,05,06,10,00,00,00,00,00,00,00,00,00,00,00 map(0,8) = 00,00,05,06,07,00,05,06,05,04,00,00,00,02,00,00,00,00,00,00 map(0,9) = 00,00,08,09,10,00,08,06,06,10,00,01,08,05,04,00,00,00,00,00 map(0,10) = 00,00,00,00,00,00,00,00,00,00,00,00,00,10,00,00,00,00,00,00 map(0,11) = 00,00,00,00,00,00,00,02,04,00,00,00,00,00,00,00,00,00,00,00 map(0,12) = 00,00,00,00,00,01,02,06,10,00,00,00,00,00,00,00,00,00,00,00 map(0,13) = 00,00,00,00,00,00,08,10,00,00,00,00,00,00,00,00,00,00,00,00 map(0,14) = 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 map(0,15) = 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 ;----------------------------------------------------------- ; 戦車の情報(パーツごと ;----------------------------------------------------------- ; 戦車 /*tank_max = 2 my = 1 tank_coa(0) = 0, 0 tank_cat(0) = 0, 0 tank_arm(0) = 0, 0 tank_gun(0) = 0, 1 tank_x(0) = 600.0, 400.0 tank_y(0) = 900.0, 700.0*/ tank_max = 10 my = 1 repeat tank_max tank_coa(cnt) = 0 tank_cat(cnt) = 0 tank_arm(cnt) = 0 tank_gun(cnt) = rnd(2) tank_x(cnt) = 0.0+rnd(600) tank_y(cnt) = 0.0+rnd(600) loop ddim tank_r, tank_max ddim tank_gunr, tank_max ddim cat_l, tank_max ddim cat_r, tank_max ; シャープ ; 普通、rが半径で、角度はangleだけど、気にしない。 chk_max = 3 chk_size(0) = 37, 46, 64; 簡易判定用(半径) chk_cmax(0) = 4, 4, 10 chk_r(0) = 2.553590, 2.356194, zero; 1点目 chk_rs(0) = 36.055513, 45.254834, 64.0 chk_r(chk_max) = -2.553590, -2.356194, 0.628319; 2点目 chk_rs(chk_max) = 36.055513, 45.254834, 25.0 chk_r(chk_max*2) = 5.695183, 5.497787, 1.256637; 3点目 chk_rs(chk_max*2) = 36.055513, 45.254834, 64.0 chk_r(chk_max*3) = 0.588003, 0.785398, 1.884956; 4点目 chk_rs(chk_max*3) = 36.055513, 45.254834, 25.0 chk_r(chk_max*4) = zero, zero, 2.513274; 5点目 chk_rs(chk_max*4) = zero, zero, 64.0 chk_r(chk_max*5) = zero, zero, 3.141593; 6点目 chk_rs(chk_max*5) = zero, zero, 25.0 chk_r(chk_max*6) = zero, zero, 3.769911; 7点目 chk_rs(chk_max*6) = zero, zero, 64.0 chk_r(chk_max*7) = zero, zero, 4.398230; 8点目 chk_rs(chk_max*7) = zero, zero, 25.0 chk_r(chk_max*8) = zero, zero, 5.026548; 9点目 chk_rs(chk_max*8) = zero, zero, 64.0 chk_r(chk_max*9) = zero, zero, 5.654867; 10点目 chk_rs(chk_max*9) = zero, zero, 25.0 ; コア coa_hp(0) = 100.0 coa_gpx(0) = 0 coa_gpy(0) = 0 coa_gsx(0) = 32 coa_gsy(0) = 32 coa_gr(0) = 0.0 coa_grs(0) = 0 coa_exp(0) = "標準装備" ; キャタピラ cat_sp(0) = 4.0 cat_gpx(0) = 0 cat_gpy(0) = 0 cat_gsx(0) = 12 cat_gsy(0) = 6 cat_gr(0) = 0.549779 cat_grs(0) = 39 ; 装甲 arm_max = 1 arm_df(0) = 100.0 arm_gpx(0) = 0 arm_gpy(0) = 0 arm_gsx(0) = 40 arm_gsy(0) = 60 arm_gr(0) = 0.0 arm_grs(0) = 0 arm_chk(0) = 0, 0 ; 大砲 gund_gpx(0) = 0, 0 gund_gpy(0) = 0, 10 gund_gsx(0) = 10, 8 gund_gsy(0) = 32, 20 gund_fr(0) = 0.0, 0.0 gund_frs(0) = 16.0, 10.0 ; 弾丸 buld_gpx(0) = 0 buld_gpy(0) = 0 buld_gsx(0) = 16 buld_gsy(0) = 16 buld_gcr(0) = 255 buld_gcg(0) = 150 buld_gcb(0) = 0 buld_life(0) = 100 buld_size(0) = 6 buld_length(0) = 16 ; 大砲セット = 'Z', 'X', 'C', 'V', 'B', 'N', 'M', 44, 46, 47, 92 gun_max = 2 gun_mut(0) = 1, 2 ; 1 gun_at(0) = 10, 8 gun_sp(0) = 10, 20 gun_wait(0) = 4, 5 gun_gun(0) = 0, 1 gun_bul(0) = 0, 0 gun_key(0) = 'Z', 'Z' gun_pr(0) = 0.0, -0.45 gun_prs(0) = 24, 23 ; 2 gun_at(gun_max) = 0, 8 gun_sp(gun_max) = 0, 20 gun_wait(gun_max)= 0, 5 gun_gun(gun_max) = 0, 1 gun_bul(gun_max) = 0, 0 gun_key(gun_max) = 0, 'Z' gun_pr(gun_max) = 0.0, 0.45 gun_prs(gun_max) = 0, 23 dim fire_wait, length(gun_at) ; マップ map_gpx(0) = 0, 64, 00, 64, 128, 000, 064, 128, 000, 064, 128 map_gpy(0) = 0, 00, 64, 64, 064, 128, 128, 128, 192, 192, 192 map_pas(0) = 1.0, 0.8, 0.5, 0.5, 0.5, 0.5, 0.2, 0.5, 0.5, 0.5, 0.5 ;物体 objd_max = 2 objd_hp(0) = 100, 777 objd_gpx(0) = 0, 0 objd_gpy(0) = 0, 64 objd_gsx(0) = 64, 128 objd_gsy(0) = 64, 128 objd_pas(0) = 1, 1 objd_chk(0) = 1, 2 ;物体配置 obj_max = 10 obj_id(0) = 0, 0, 0, 0, 1, 1, 1, 1, 1, 1 obj_x(0) = 400, 300 obj_y(0) = 850, 800 obj_r(0) = 0.0, 0.0 repeat 10 obj_id(cnt) = rnd(2) obj_x(cnt) = rnd(640) obj_y(cnt) = rnd(640) obj_r(cnt) = 0.1*cnt loop tank_r(1)=3.048000 tank_x(1)=100.912315 tank_y(1)=332.923333 tank_gunr(1)=1.9 *main /* v1 = timeGetTime() repeat 1000 ;if chk_line(100,100,200,200, 200,100,100,200);chk_polygon(100,100,200,200, 200,100,100,200) loop dialog timeGetTime()-v1 end */ ;----------------------------------------------------------- ; メインプログラム ;----------------------------------------------------------- redraw 0 ;------------------------------------------------------- ; 背景を描く ;------------------------------------------------------- gmode 0 v1 = lx\64 v2 = ly\64 boxf repeat 7 + (v2!0) rcnt = cnt repeat 10 + (v1!0) pos cnt*64-v1, rcnt*64-v2 v3 = map(lx/64+cnt, ly/64+rcnt) gcopy 5, map_gpx(v3), map_gpy(v3), 64, 64 loop loop ;------------------------------------------------------- ; 戦車 ;------------------------------------------------------- repeat tank_max draw_cat tank_cat(cnt), tank_x(cnt), tank_y(cnt), tank_r(cnt), cat_l(cnt), cat_r(cnt) loop repeat tank_max draw_arm tank_arm(cnt), tank_x(cnt), tank_y(cnt), tank_r(cnt) loop repeat tank_max draw_coa tank_coa(cnt), tank_x(cnt), tank_y(cnt), tank_gunr(cnt) loop ;------------------------------------------------------- ; オブジェクト(障害物) ;------------------------------------------------------- repeat obj_max draw_obj obj_id(cnt), obj_x(cnt), obj_y(cnt), obj_r(cnt) loop ;------------------------------------------------------- ; 大砲は最後 ;------------------------------------------------------- repeat tank_max draw_gun tank_gun(cnt), tank_x(cnt), tank_y(cnt), tank_gunr(cnt) loop ;------------------------------------------------------- ; 弾 ;------------------------------------------------------- repeat bul_max if bul_life(cnt)!0{ draw_bullet bul_id(cnt), bul_x(cnt), bul_y(cnt), bul_r(cnt) bul_x(cnt) += cos2(bul_r(cnt))*gun_sp(bul_id(cnt)) bul_y(cnt) += sin2(bul_r(cnt))*gun_sp(bul_id(cnt)) bul_life(cnt)-- } loop ;------------------------------------------------------- ; 爆発 ;------------------------------------------------------- gmode 7;2 repeat bom_max if bom_life(cnt)!0{ v1 = 16-bom_life(cnt) /*pos bom_x(cnt)-16-lx,bom_y(cnt)-16-ly gcopy 9, (v1\8)*32,(v1/8)*32, 32,32*/ gsel 8 pos 0,0 : gcopy 9, (v1\8)*32,(v1/8)*32, 32,32 pos 32,0 : gcopy 10, (v1\8)*32,(v1/8)*32, 32,32 gsel 0 pos bom_x(cnt)-16-lx,bom_y(cnt)-16-ly gcopy 8, 0,0, 32,32 bom_life(cnt)-- } loop ;------------------------------------------------------- ; redraw ;------------------------------------------------------- if draw_mode{ pos 0,0 gzoom 320,224, 0, 0,0, 640,448, 1 } redraw 1 await 75 ddim tank_move_x, tank_max ddim tank_move_y, tank_max ddim tank_move_r, tank_max ddim tank_move_gunr, tank_max ddim cat_move_l, tank_max ddim cat_move_r, tank_max ;------------------------------------------------------- ; キー入力 ;------------------------------------------------------- stick key, 15 if key&16 : my++ if my>=tank_max : dim my if key&64{ draw_mode^1 if draw_mode{ width 640/2,448/2 }else{ width 640,448 } } getkey v1, 16 ; マップとの判定 v2 = map_pas(map(0+tank_x(my)/64, 0+tank_y(my)/64)) v3 = 1;0.5 *cat_sp(tank_cat(my)); *v2 v4 = 0.02 *cat_sp(tank_cat(my)) *v2 if v1=0{ ; Shift if key&1{ ; ← tank_move_r(my) = -v4 tank_move_gunr(my) = -v4 cat_l(my)--; -= v3 cat_r(my)++; += v3 } if key&4{ ; → tank_move_r(my) = v4 tank_move_gunr(my) = v4 cat_l(my)++; += v3 cat_r(my)--; -= v3 } }else{ if key&1{ ; ← tank_move_gunr(my) = -0.1;-v4 } if key&4{ ; → tank_move_gunr(my) = 0.1;v4 } } if key&2{ ; ↑ tank_move_x(my) = cos2(tank_r(my)) *cat_sp(tank_cat(my)) *v2 tank_move_y(my) = sin2(tank_r(my)) *cat_sp(tank_cat(my)) *v2 cat_l(my) += v3 cat_r(my) += v3 } if key&8{ ; ↓ tank_move_x(my) = -cos2(tank_r(my)) *cat_sp(tank_cat(my)) *v2 tank_move_y(my) = -sin2(tank_r(my)) *cat_sp(tank_cat(my)) *v2 cat_l(my) -= v3 cat_r(my) -= v3 } ; 発射 repeat gun_mut(tank_gun(my)) v2 = gun_max*cnt+tank_gun(my) getkey v1, gun_key(v2) if fire_wait(v2)!0 : fire_wait(v2)-- if v1&(fire_wait(v2)=0){ bul_id(bul_index) = gun_bul(v2) bul_life(bul_index) = buld_life(bul_id(bul_index)) bul_x(bul_index) = tank_x(my) +cos2(gun_pr(v2)+tank_gunr(my))*gun_prs(v2) +cos2(gund_fr(gun_gun(v2))+tank_gunr(my))*gund_frs(gun_gun(v2)) bul_y(bul_index) = tank_y(my) +sin2(gun_pr(v2)+tank_gunr(my))*gun_prs(v2) +sin2(gund_fr(gun_gun(v2))+tank_gunr(my))*gund_frs(gun_gun(v2)) bul_r(bul_index) = tank_gunr(my) if bul_max<=128 : bul_max++ if bul_index!128{ bul_index++ }else{ dim bul_index } fire_wait(v2) = gun_wait(v2) } loop ;------------------------------------------------------- ; タンクの座標処理 ;------------------------------------------------------- repeat tank_max tank_r(cnt) += tank_move_r(cnt) tank_gunr(cnt) += tank_move_gunr(cnt) tank_x(cnt) += tank_move_x(cnt) tank_y(cnt) += tank_move_y(cnt) if cat_l(cnt)<0 : cat_l(cnt)=50.0*cat_gsy(tank_cat(cnt)) if cat_r(cnt)<0 : cat_r(cnt)=50.0*cat_gsy(tank_cat(cnt)) tank_x(cnt) = limitf(tank_x(cnt), 0, 64*mapx) tank_y(cnt) = limitf(tank_y(cnt), 0, 64*mapy) loop ;------------------------------------------------------- ; 衝突判定 ;------------------------------------------------------- repeat tank_max rcnt = cnt v1 = arm_chk(tank_arm(cnt)) repeat tank_max if rcnt!cnt{ ; タンク同士の衝突判定 if chk_polygon(v1, tank_x(rcnt), tank_y(rcnt), tank_r(rcnt), arm_chk(tank_arm(cnt)), tank_x(cnt), tank_y(cnt), tank_r(cnt) ){ gosub*back_tank } } loop repeat obj_max ; タンクと物体との判定 if chk_polygon(v1, tank_x(rcnt), tank_y(rcnt), tank_r(rcnt), objd_chk(obj_id(cnt)), obj_x(cnt), obj_y(cnt), obj_r(cnt) ){ gosub*back_tank } loop loop repeat bul_max if bul_life(cnt)!0{ rcnt = cnt v1 = bul_x(cnt) +cos2(bul_r(cnt))*buld_size(bul_id(cnt)) v2 = bul_y(cnt) +sin2(bul_r(cnt))*buld_size(bul_id(cnt)) v3 = bul_x(cnt) -cos2(bul_r(cnt))*buld_length(bul_id(cnt)) v4 = bul_y(cnt) -sin2(bul_r(cnt))*buld_length(bul_id(cnt)) v5 = buld_length(bul_id(cnt)) repeat obj_max ; 弾丸と物体の衝突判定 if chk_polygon_line(objd_chk(obj_id(cnt)), obj_x(cnt), obj_y(cnt), obj_r(cnt), v1, v2, v3, v4, v5){ bom_x(bom_max) = stat1 bom_y(bom_max) = stat2 bom_life(bom_max) = 16 bom_max++ bul_life(rcnt) = 0 } loop } loop ;スクロール値 lx = limit(tank_x(my)-320, 0, 64*mapx-640) ly = limit(tank_y(my)-224, 0, 64*mapy-448) mcnt++ goto*main *back_tank tank_r(rcnt) -= tank_move_r(rcnt) tank_gunr(rcnt) -= tank_move_gunr(rcnt) tank_x(rcnt) -= tank_move_x(rcnt) tank_y(rcnt) -= tank_move_y(rcnt) return