;=========================================================== ; 2008/08/17 ; 蟲 0.4 ; GAM-22 ;=========================================================== /*---------------------------------------------------------- ; log ;----------------------------------------------------------- [0.1] 蟲がマウスに集まる [0.2] 配色変更、仲間同士で距離を保つように [0.3] 脚の追加 [0.4] 蟲の変数管理を、var(個体, 長さ)→ var(節) に変更 クリックで蟲回避、右クリックで蟲ランダム破壊 r) 将来、蟲の間接破壊を想定 m) AXsize マイナス、2次元配列の Error7 から解放 d) 処理速度が低下(重大) ;----------------------------------------------------------- ; パラメータ省略 ;----------------------------------------------------------- 1. color 0,0,0 → color 2. var(2,0) → var(2) ;----------------------------------------------------------- ; 数学計算メモ ;----------------------------------------------------------- 1. 内積 = ax*bx + ay*by 2. ベクトル(x,y) +1/2π = (-y,x) ;---------------------------------------------------------*/ ;----------------------------------------------------------- ; 定数 ;----------------------------------------------------------- ; ファイル名 #packopt name "worms" ; 蟲の長さ #const body_len 10 ; 蟲の最大数 #const i_head_max 50 ; 画像バッファ #const buf_win 1 ; 円周率 (無駄に桁が多い) π = 3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117068 ; 円周率/2 πh = 1.570796326794896619231321691639751442098584699687552910487472296153908203143104499314017412671058534 ; デバックモード #define debug 0 ; キートリガー #define trigger 256 ;----------------------------------------------------------- ; 初期化 ;----------------------------------------------------------- randomize ;----------------------------------------------------------- ; 部品描画 ;----------------------------------------------------------- buffer buf_win color : boxf color 48,48,48 ;------------------------------------------------------- ; Aパーツ(頭 胸 足) ;------------------------------------------------------- // 形状生成 circle 1,3, 12,32 circle 20,3, 31,32 circle 0,0, 32,30 // グラデーション加工 color repeat 16 gmode 5, 32,32, cnt*cnt+20 pos 47+cnt/4, 16+cnt/4 grotate buf_win, 0,0, 0, 32-cnt,32-cnt loop ;bmpsave "hoge.bmp" ;------------------------------------------------------- ; Bパーツ ;------------------------------------------------------- /*v1 = 125,125,150,100 v2 = 0,0,100,100 gsquare -12, v1, v2*/ gsel 0, 1 *main ;----------------------------------------------------------- ; main start ;----------------------------------------------------------- stick key, trigger // draw start redraw 0 // 背景 color : boxf // 蟲ループ repeat i_max rcnt = cnt ;----------------------------------------------------------- ; AI ;----------------------------------------------------------- if i_type.rcnt { // 頭移動 i_body_r.cnt += i_snake.cnt i_body_x.cnt += 1.75 *cos(i_body_r(cnt)-πh) i_body_y.cnt += 1.75 *sin(i_body_r(cnt)-πh) // ターゲット(マウス)接近,クリック時回避 i_target.cnt = atan(i_body_y(cnt)-mousey, i_body_x(cnt)-mousex) -πh +π*((key&256)!0) repeat i_max // 仲間から100dot以内なら、回避 if rcnt!cnt & i_type.cnt { x = i_body_x(cnt) -i_body_x(rcnt) y = i_body_y(cnt) -i_body_y(rcnt) #if debug color 0,0,255 #endif if x*x+y*y<=1000 { i_target.rcnt = atan(y,x) -πh #if debug color 255 #endif } } loop // 目標追従 if cos(i_body_r.cnt)*cos(i_target.cnt)+sin(i_body_r.cnt)*sin(i_target.cnt) <= 0.5 {; 蛇行タイミング i_snake.cnt = -0.05 + 0.1*(-sin(i_body_r.cnt)*cos(i_target.cnt) + cos(i_body_r.cnt)*sin(i_target.cnt)>=0); 蛇行角度 } } else { // 体移動(っていうか引っ張る) i_body_r.cnt = atan( i_body_y(cnt)-i_body_y(cnt-1), i_body_x(cnt)-i_body_x(cnt-1) ) -πh i_body_x.cnt = i_body_x(cnt-1) + cos(i_body_r(cnt)+πh)*8 i_body_y.cnt = i_body_y(cnt-1) + sin(i_body_r(cnt)+πh)*8 } #if debug line i_body_x(rcnt),i_body_y(rcnt), i_body_x(rcnt)+cos(i_target(rcnt)-πh)*50, i_body_y(rcnt)+sin(i_target(rcnt)-πh)*50 #endif ;----------------------------------------------------------- ; draw ;----------------------------------------------------------- // 蟲 x = i_body_x.cnt y = i_body_y.cnt r = i_body_r.cnt // 脚 (下書き無しです) v1 = r +sin (πh *(mcnt+cnt*2)/5) /2 v2 = 9 +0.15*i_body_h(cnt) color 255,255,255 line x,y, x+cos(v1)*v2, y+sin(v1)*v2 color 128,128,128 line x,y, x+cos(v1+π)*v2, y+sin(v1+π)*v2 // 体 w = 17 +0.2*i_body_h(cnt) h = 9 gosub *draw_A // 蟲ループ終了 loop ;----------------------------------------------------------- ; main - end ;----------------------------------------------------------- // redraw end redraw // wait await 30 // var mcnt++ if (mcnt\20) :else: gosub*i_born if key&512 { i_type.rnd(i_max) = 1 } // back goto *main *draw_A gmode 2, 32,32 pos x,y grotate buf_win, 32,0, r, w,h return *i_born // 虫生成 if i_max >= i_head_max*body_len : return repeat body_len i_type.i_max = (i_max\body_len)=0 i_snake.i_max = πh i_target.i_max = πh i_body_h.i_max = (3-cnt)*(cnt-4) i_body_x.i_max = 1.0*rnd(640) i_body_y.i_max = 540.0*rnd(2) -30 i_body_r.i_max = πh i_max++ loop return