xsample_gimbal.hsp

sample\d3module\xsample_gimbal.hsp » Plain Format

;============================================================
;                                                 2005/10/--
	title "S.Programs grgr-gimbal 1.01"
;	version 1.01/sample_ver
;                               http://sprocket.babyblue.jp/
;============================================================
/*
・グルグル・ジンバル

光るジンバルをグルグルして遊ぶソフトです。
画面上をマウスでドラッグするとジンバルが動きます。
勢いをつけてマウスボタンを離すとそのまま回転します。

マウスドラッグ : ジンバル回転
↑/↓ : ポリゴン数 増加 / 減少

*/

#include "d3m.hsp"

;============================================================
	vx = 0.023
	vy = 0.0245
	th = 0.0
	ph = 0.0
	vv = 0.0

	d3mkparticle 0, 100, 100, 255
	d3mkparticle 1, 255, 127, 127
	d3mkparticle 2,  80, 255,  80
	d3mkparticle 3, 255, 255, 127

	POLYS = 20



;-----------------------------------------------------------
*mainloop
	ct++

	rr = limitf( 3300 - 2900.0 / (0.05 * ct + 1), 0, 3000 )
	d3setcam 0, rr, 0



	; key inp
	if ct > 10 : stick ka, 1023



	; パラメータ変更
	POLYS += (ka & 2) ! 0
	POLYS -= (ka & 8) ! 0
	POLYS = limit(POLYS, 6, 64)

	LOOPS = POLYS + 1
	dh = 6.2831853 / POLYS



	; ドラッグ
	if ka & 256 {
		vx = 0.002 * (mousex - bmx)
		vy = 0.002 * (mousey - bmy)
		vv = 0.0
	}
	bmx = mousex
	bmy = mousey


	th += vx + vv
	ph += vy

	vv = vv * 0.999 + 0.00001 ; 徐々に増加

	vx *= 0.995
	vy *= 0.995



	redraw 0
	hsvcolor 32, 64, limit(2000 / (1 | bkr), 24, 127) : boxf




	; inner-rotor

	color 127, 127, 255
	r = 800
	pid = 0

	repeat LOOPS
		gosub *default_setup

		d3rotate y1, z1,  y1, z1,  ph
		d3rotate y2, z2,  y2, z2,  ph

		d3rotate x1, y1,  x1, y1,  th
		d3rotate x2, y2,  x2, y2,  th

		gosub *default_draw
	loop




	; outer-rotor

	color 255, 100, 100
	r = 900
	pid = 1

	repeat LOOPS
		gosub *default_setup

		d3rotate  x1, y1,  x1, y1,  th
		d3rotate  x2, y2,  x2, y2,  th

		gosub *default_draw
	loop




	; case

	color 100, 255, 100
	r = 1000
	pid = 2

	repeat LOOPS
		gosub *default_setup
		gosub *default_draw
	loop




	; inner

	gmode 5, , , 20
	color 255, 255, 128

	repeat 7, 3
		r  = rr / 12 * cnt
		h  = rr / 1000 * cnt * cnt

		repeat 3
			y =   r, 0.0,   r, r * 1.25
			x =  -h, 0.0,   h, 0.0
			z = 0.0, 0.0, 0.0, 0.0
			c = cnt

			repeat 4
				dup xc, x(cnt)
				dup yc, y(cnt)
				dup zc, z(cnt)

				d3rotate xc, zc,  xc, zc,  1.04719755 * c
				d3rotate yc, zc,  yc, zc,  ph
				d3rotate xc, yc,  xc, yc,  th

				; mirror
				xa(cnt) = -xc
				ya(cnt) = -yc
				za(cnt) = -zc
			loop


			d3square x, y, z

			; 最終描画時のライト中心距離を保存
			gosub *default_getrr_f
			bkr = f


			d3square xa, ya, za

			gosub *default_getrr_f
			if f < bkr : bkr = f
		loop
	loop


	gmode 5, , , 192
	d3particle 3,  0, 0, 0,  50
	d3particle 3,  0, 0, 0,  200




	redraw
	await 30

	goto *mainloop


;-----------------------------------------------------------
; subroutines


;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
*default_getrr_f

	f = d3dist(dx@d3m - wincx@d3m, dy@d3m - wincy@d3m)
	return


;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
*default_setup
	; set pos

	x1 = sin(dh * cnt) * r
	y1 = 80
	z1 = cos(dh * cnt) * r

	x2 = x1
	y2 = -80
	z2 = z1

	return


;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
*default_draw
	; draw

	if cnt {
		d3initlineto
		d3lineto ox1, oy1, oz1
		d3lineto x1, y1, z1
		d3lineto ox2, oy2, oz2
		d3lineto x2, y2, z2
		d3lineto x1, y1, z1

		gmode 5, , , 128
		x = ox1, ox2, x2, x1
		y = oy1, oy2, y2, y1
		z = oz1, oz2, z2, z1
		d3square x, y, z

		gmode 5, , , 64
		d3particle pid,  x2, y2, z2,  120
		d3particle pid,  x1, y1, z1,  120
	}


	; bklup

	ox1 = x1
	oy1 = y1
	oz1 = z1

	ox2 = x2
	oy2 = y2
	oz2 = z2

	return