;============================================================ ; 2008/--/-- ; title "S.Programs Astro Balloon" ; version 1.0/sample_ver ; http://sprocket.babyblue.jp/ ;============================================================ /* サンプルゲーム アストロ・バルーン キー操作 [Space] … メインエンジン噴射 (加速) ←↑↓→ … 姿勢制御 (ピッチ・ロール) [Esc] … ゲーム再トライ [Enter] … フルスクリーン切り替え ストーリー あなたは宇宙船競技の種目「アストロ・バルーン」に出場することに なりました。これは、宇宙船を手動操縦して、宙域に浮かぶ 8 つの バルーンすべてを体当たりで破壊するまでのタイムを競う競技です。 競技を終える前に宇宙を漂流するようなことになれば笑い者ですよ! ルール ・宇宙船を操縦し、すべてのバルーンを体当たりで破壊する。 ・最初にメインエンジンを噴射した時点をゲームスタートとする。 ・バルーンに体当たりすると一定の推進剤が補給される。 HUD ・機体の機首方向を示すマーカー : -w- ・機体の進行方向を示すマーカー : -○- ・レーダー : 赤円 */ #include "d3m.hsp" ;============================================================ ; init d3mkparticle 0, 255, 255, 255 ; keymap #define xmm 37 #define xpp 39 #define ymm 40 #define ypp 38 #define trg 32 f0 = refdval ; = 0.0 foname = "MS Pゴシック" ;------------------------------------------------------------ ; ゲーム初期化 *init ; 位置 (m) px = f0 : py = f0 : pz = f0 ; 速度 (m/s) vx = f0 : vy = f0 : vz = f0 ; 姿勢 matrix pm00 = 1 : pm01 = 0 : pm02 = 0 ; 前方ベクトル pm10 = 0 : pm11 = 1 : pm12 = 0 ; 左方ベクトル pm20 = 0 : pm21 = 0 : pm22 = 1 ; 上方ベクトル ; 姿勢角速度 ロール, ピッチ のみ (rad/s) vm_r = f0 : vm_p = f0 ; 機体スペック #const MACHM 2000 ; 機体質量 (kg) #const FORCE 200000 ; 推力 (N) #const FCOST 66 ; 燃費 (kg/sec) #const FUEL_MAX 1000 ; 推進剤最大 (kg) //onst FORCE_YP 19600 ; 姿勢制御用 推力 (N) #const FCOST_YP 5 ; 姿勢制御用 燃費 (kg/sec) ; ゲーム設定 #const BALLS 8 #const BALL_R 125 ; (m) #const FUEL_ADD 500 ; バルーンが持っている推進剤 (kg) fuelm = 250 ; 初期推進剤質量 (kg) ; バルーン存在フラグ ball_acts = BALLS repeat BALLS ball_act(cnt) = 1 loop time_s = 0 time_e = 0 ; effect cv = 88 ;------------------------------------------------------------ ; ゲームループ *mainloop await a = sec sec = 0.001 * d3timer() dt = limitf(sec - a, 0, 1) ;------------------------------------------------------------ ; ctrl default am_v = 0 am_r = 0 am_p = 0 ;------------------------------------------------------------ ; ctrl if ginfo_act >= 0 { getkey k, 27 if k : goto *init ; [Esc] to Reset ;------------------------------------------------------------ ; full-screen ctrlr (toggle : Enter) stick ky_inp if ky_inp & 32 { mode_fsc ^= 1 chgdisp mode_fsc ; (default : 640, 480) if mode_fsc { bgscr 2 gsel 2, 2 mouse -1 } else { gsel 2, -1 gsel mouse } } ;------------------------------------------------------------ ; ctrl if fuelm > 0 { ; thrust getkey am_v, trg ; roll getkey am_r, xpp getkey k, xmm : am_r -= k ; pitch getkey am_p, ypp getkey k, ymm : am_p -= k } } ;------------------------------------------------------------ ; v-move totalm = fuelm + MACHM ; 全質量 totalm = 構造質量 + 推進剤質量 ; 加速 if am_v { ; 加速 a = dt * FORCE / totalm vx += pm00 * a vy += pm01 * a vz += pm02 * a ; game start if time_s = 0 : time_s = sec if cv < 88 : cv += dt * 100 ; effect } v_abs = sqrt(vx*vx + vy*vy + vz*vz) ; ヨー・ピッチ角加速 / エンジン振動 (慣性モーメントを考慮しない) vm_r += dt * (sin(sec * 11) * 2 * am_v + am_r) * 2 vm_p += dt * (sin(sec * 25) * 2 * am_v + am_p) * 2 ; 推進剤減少 fuelm = limitf(fuelm - dt * (FCOST * am_v + FCOST_YP * (am_r*am_r + am_p*am_p)), 0, FUEL_MAX) ;------------------------------------------------------------ ; p-move ; roll d3vrotate pm10,pm11,pm12, pm10,pm11,pm12, pm00,pm01,pm02, dt * vm_r d3vrotate pm20,pm21,pm22, pm20,pm21,pm22, pm00,pm01,pm02, dt * vm_r ; pitch d3vrotate pm00,pm01,pm02, pm00,pm01,pm02, pm10,pm11,pm12, dt * vm_p d3vrotate pm20,pm21,pm22, pm20,pm21,pm22, pm10,pm11,pm12, dt * vm_p ; move px += vx * dt py += vy * dt pz += vz * dt ;------------------------------------------------------------ ; setcam d3setcam -1, 0, 0 ; 機体姿勢行列の転置 d3setlocal -(pm00*px+pm01*py+pm02*pz),-(pm10*px+pm11*py+pm12*pz),-(pm20*px+pm21*py+pm22*pz), pm00,pm01,pm02, pm10,pm11,pm12, pm20,pm21,pm22 ;------------------------------------------------------------ ; static obj redraw 0 randomize 1 font foname, 15 ; HUD 用フォント ; background color (fuelm=0) * 64, cv, cv * cv / 48 cv = limitf(cv - dt * 20, 48, 255) boxf ; Star-Ring repeat 642 gmode 5, , , 64 + rnd(192) d3particle 0, cos(cnt)*1300000, sin(cnt)*1300000, (rnd(1024)-512)*rnd(64)*rnd(64), 5000 gmode 5, , , 16 d3particlem , 20000 loop gmode 5, , , 72 repeat 5 d3particlem , 50000 * cnt loop ; balloons repeat BALLS if ball_act(cnt) { ; position goal_x = (9 - cnt) * 5000 goal_y = cos(64 * cnt) * 10000 goal_z = sin(64 * cnt) * 5000 goal_d = sqrt((px-goal_x)*(px-goal_x)+(py-goal_y)*(py-goal_y)+(pz-goal_z)*(pz-goal_z)) /* x = px - goal_x y = py - goal_y z = pz - goal_z goal_d = d3dist(x, y, z) vcos = (vx*x + vy*y + vz*z) / (v_abs * goal_d) */ ; draw balloon hsvcolor cnt * 37, 192, 192 d3circle goal_x, goal_y, goal_z, BALL_R, 1 gmode 5, , , 96 d3particlem , 300 ; レーダー射程距離内なら HUD に表示 if goal_d <= 30000 { ; HUD ; ターゲットマーカー color 222, cv repeat 2 d3circle goal_x, goal_y, goal_z, 1000<<(cnt*2) loop if df@d3m { if goal_d <= 13000 : line dx@d3m, dy@d3m, d3wincx, d3wincy pos dx@d3m, dy@d3m-30 mes 0 + goal_d } } ; 当たり処理 if goal_d <= BALL_R { ; バルーン消滅 ball_act(cnt)-- ; = 0 ball_acts-- ; 推進剤補給 fuelm += FUEL_ADD ; 運動量の減少 r = totalm / (totalm + FUEL_ADD) vx *= r vy *= r vz *= r ; vm_r *= r ; vm_p *= r vm_r /= 3 ; オーバーアクション分を補給 vm_p /= 3 ; game over if ball_acts = 0 : time_e = sec cv = 116 ; up effect } } loop ;------------------------------------------------------------ ; HUD color 222, 222 t = d3timer() / 250 \ 2 ; 点滅信号 ; センター (燃焼時 推進剤時計) repeat 60 p = 0.10471975511966 * cnt r0 = 160 + (am_v * ((fuelm/5)>cnt) * 60) r1 = 155 - ((cnt\15=0) * 125) line cos(p) * r1 + d3wincx, sin(p) * r1 + d3wincy, cos(p) * r0 + d3wincx, sin(p) * r0 + d3wincy loop ; ウィスキーマーク pos d3wincx-13, d3wincy-8 mes "-w-" ; ベロシティベクトル repeat 2 sign = 1 - cnt * 2 vs = sign * 10 f = v_abs * 10 repeat 6 d3circle px+vx*vs, py+vy*vs, pz+vz*vs, f f = 200 << (cnt * 2) loop if df@d3m { if sign = 1 { line dx@d3m, dy@d3m, d3wincx, d3wincy } pos dx@d3m-14, dy@d3m-8 mes "-○-\n " + (sign * v_abs) + " m/s" } loop ; 数値情報 pos 50, 40 mes "VEL. " + (0 + v_abs) + " m/s\nFUEL " + (0 + fuelm) + " kg" if (fuelm = 0) & t : mes "EMPTY 推進剤切れ" ; グラフ ; V-ROLL ; boxf d3wincx, 160, vm_r*30 + d3wincx-1, 163 ; V-PITCH ; boxf 240, d3wincy, 243, vm_p*60 + d3wincy-1 ; FUEL boxf 160, 59, 160 + fuelm*((fuelm>=100)|t)/3, 66 ;------------------------------------------------------------ ; game telop hsvcolor , , 222 pos 50, d3wincy + 110 font foname, 25 + (ball_acts=0) * 20, 1 if ball_acts { mes "残りバルーン " + ball_acts + " 個" } else { mes "ゲーム終了!" } mes strf("タイム %.3f 秒", (sec*(time_s!0)*(time_e=0) + time_e - time_s)) font foname, 20 mes ""+d3getfps()+" fps" ;------------------------------------------------------------ redraw goto *mainloop