;=========================================================== ; 2007/04/05 ; 戦車vs●.U var.001.b9 ; 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 #deffunc pos2 int x, int y v1_ = x-lx v2_ = y-ly pos v1_, v2_ return (v1_>=-64) & (v1_<=704) & (v2_>=-64) & (v2_<=512); ウィンドウ内かチエック ;----------------------------------------------------------- ; 標準命令の改良系 ;----------------------------------------------------------- ; コサイン改 #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 #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 ;------------------------------------------------------- ; grotateの改良 ;------------------------------------------------------- ; ; p1,p2 : カレントポジションのX,Y座標 ; p3 : コピー元のウィンドウID ; p4,p5 : コピー元の左上X,Y座標 ; p6,p7 : コピー元のX,Yサイズ ; p8 : 回転角度(単位はラジアン) ; p9,p10 : X,Yサイズ ;------------------------------------------------------- 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)>=480) : return 0 pos m1, m2 gmode 2, 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 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) 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) 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 grotate2 x+cos2(r+gun_gr(id+m1))*gun_grs(id+m1), y+sin2(r+gun_gr(id+m1))*gun_grs(id+m1), 4, gun_gpx(id+m1),gun_gpy(id+m1), gun_gsx(id+m1),gun_gsy(id+m1), r, gun_gsx(id+m1),gun_gsy(id+m1) 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) 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_box2 double ax, double ay, int asx, int asy, double bx, double 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" screen 0, 640, 448 ;----------------------------------------------------------- ; マップデータロード ;----------------------------------------------------------- chdir "../map" /* exist "001.map" if strsize>=0{ sdim v1, strsize bload "001.map", v1 mapx = peek(v1,0) mapy = peek(v1,1) dim map, mapx, mapy memcpy map, v1, strsize-2, 2, 0 }*/ 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 ddim tank_r, tank_max ddim tank_gunr, tank_max ddim cat_l, tank_max ddim cat_r, tank_max ; シャープ 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 /* screen 0,128,128 color 160,160,164 : boxf color 128, 128, 128 repeat 10 a=chk_r(cnt*3+2) b=chk_rs(cnt*3+2) p=0.8*b if cnt=9{ c=chk_r(2) d=chk_rs(2) l=0.8*d }else{ c=chk_r((cnt+1)*3+2) d=chk_rs((cnt+1)*3+2) l=0.8*d } line 64,64, 64+cos2(a)*p,64+sin2(a)*p line 64+cos2(a)*b,64+sin2(a)*b, 64+cos2(c)*d,64+sin2(c)*d line 64+cos2(a)*p,64+sin2(a)*p, 64+cos2(c)*l,64+sin2(c)*l loop bmpsave "../image/test.bmp" stop*/ ; コア 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 ; 大砲 gun_max = 2 gun_mut(0) = 1, 2 ; 2 gun_at(0) = 10.0, 5.0 gun_gpx(0) = 0, 10 gun_gpy(0) = 0, 0 gun_gsx(0) = 10, 8 gun_gsy(0) = 32, 20 gun_gr(0) = 0.0, -0.45 gun_grs(0) = 24, 23 ; 1 gun_at(gun_max) = 0.0, 5.0 gun_gpx(gun_max) = 0, 10 gun_gpy(gun_max) = 0, 0 gun_gsx(gun_max) = 0, 8 gun_gsy(gun_max) = 0, 20 gun_gr(gun_max) = 0.0, 0.45 gun_grs(gun_max) = 0, 23 ; マップ 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 ;------------------------------------------------------- ; 背景を描く ;------------------------------------------------------- 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 tank_max draw_gun tank_gun(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 ;------------------------------------------------------- ; redraw ;------------------------------------------------------- redraw 1 await 50 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^=1 getkey v1, 16 ; マップとの判定 v2 = map_pas(map(0+tank_x(my)/64, 0+tank_y(my)/64)) v3 = 0.35 *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 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 ;スクロール値 lx = limit(tank_x(my)-320, 0, 64*mapx-640) ly = limit(tank_y(my)-224, 0, 64*mapy-448) 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