xsample_Astro.hsp

sample\d3module\xsample_Astro.hsp » Plain Format

;============================================================
;                                                 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