xsample_shiraho.hsp

sample\d3m\xsample_shiraho.hsp » Plain Format

;============================================================
;                                                 2006/--/--
	title "S.Programs Golden Harp"
;	version 1.0/sample_ver
;                               http://sprocket.babyblue.jp/
;============================================================
/*
・金色の海

風になびく金色 (こんじき) の草原を描画する絵描きスクリプトです。
暖かい光の表現にこだわりました。

↑/↓ : 草の数の増減 (デフォルト 500 本、最大 1000 本)
マウスドラッグ : 視点移動 (左ボタン押下中のみ)
[Enter] : フルスクリーン切り替え
[Esc] : 終了

PC によっては動作が重いので、適当に草の数を変えて負荷調整してみてください。

*/

#include "d3m.hsp"

;============================================================
;	main
;============================================================

; 畑半径
#const	FLD_R	1000
#const	FLD_D	FLD_R * 2
#const	FLD_R3	FLD_R * 3
#const	FLD_R4	FLD_R * 4

; 背景色
#const	BG_R 200
#const	BG_G 140
#const	BG_B 80

	;------------------------------------------------------------
	; init basic

	winx = ginfo_winx,  0, 0, winx
	winy = ginfo_winy,  winy, 0, 0

	d3mkparticle 0, 72, 72, 72


	;------------------------------------------------------------
	; init bg-screen

	buffer 4, winx, winy

	color BG_R, BG_G, BG_B
	boxf

	d3setcam 0, 10, 0
	gmode 5, , , 256
	d3particle 0, 0, 0, 0, 16

	gsel


	;------------------------------------------------------------
	; init scene

	num = 640 ; 描画本数 (500 * 円周補正 1.28)
	t_start = d3timer()


;------------------------------------------------------------
*mainloop


	;------------------------------------------------------------
	; full-screen ctrlr (toggle : Enter)

	stick ky_inp, 256
	if ky_inp & 128 : end
	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

	randomize 0
	redraw 0

	; ループタイマー
	time = d3timer()
	div = (time - t_start + 1000) // start-efct divisor

	; up/dn key
	num = limit( num + ((ky_inp=2)-(ky_inp=8)) * 128, 0, 1280) ; n = num / 1.27


	;------------------------------------------------------------
	; background

	gmode , winx, winy
	pos 0, 0
	gcopy 4 ; from bg-screen


	;------------------------------------------------------------
	; setcam

	if ky_inp & 256 {
		f = 1.4 * (mousex*2-winx)/winx
		z = winy - mousey
	} else {
		f = sin(0.0001 * time)
		z = sin(0.0002 * time) * 100 + 200
	}
	d3setcam sin(f)*1400, cos(f)*-1400, z + 400000/div,  0, 0, z + 400000/div


	;------------------------------------------------------------
	; sunlight

	repeat 3, 1
		gmode 5, , , 256
		d3particle 0, 0, 2000 * cnt, 300 * cnt, 1500

		if cnt = 1 { // ...


	; <-<-
	;------------------------------------------------------------
	; main obj


	;------------------------------------------------------------
	; cloud flow

	repeat 40
		x = (rnd(32768) + time/5 & 16383) - 8192
		gmode 6, , , sqrt( 1.0 - absf(x) / 8192 ) * 56
		d3particle 0, x, rnd(8192), 2000, 1000
	loop


	;------------------------------------------------------------
	; kusa

	y_top = winy
	y_btm = 0

	repeat num

		; calc pos
		bpz = 0.0
		bpx = bpz + rnd(FLD_D) - FLD_R
		bpy = bpz + FLD_R - FLD_D * cnt / num

		r = d3dist(bpx, bpy)
		if r > FLD_R : continue

		bpd = 50 + rnd(10)

		dang = 0.08 * ( sin( 0.003 * bpx - 0.00047 * time ) + 1.5)


		; draw
		if bpy > 0 : r = absf(bpx)
		f = 2.2 - r / FLD_R

		color limit(f * BG_R, 0, 255), limit(f * BG_G, 0, 255), limit(f * BG_B, 0, 255)

		d3vpos bpx, bpy, bpz

		if dy@d3m > y_btm : y_btm = dy@d3m ; - softer bottom

		repeat cnt\3+3, 5
			bpz += cos(dang * cnt) * bpd
			bpx += sin(dang * cnt) * bpd
			d3lineto bpx, bpy, bpz
		loop

		if dy@d3m < y_top : y_top = dy@d3m ; - softer top

		gosub *draw_ptc
	loop


	;------------------------------------------------------------
	; softer
	gmode 3, , , 128
	pos 0, y_top
	repeat 2
		gcopy ginfo_sel, cnt=0, y_top + (cnt=1), winx, y_btm-y_top
	loop

;	color
;	boxf , y_top, , y_top
;	boxf , y_btm, , y_btm


	;------------------------------------------------------------
	; ->->


		}
	loop
	;------------------------------------------------------------


	;------------------------------------------------------------
	; particles

	repeat 150
		x = (rnd(32768) + time/17 & 2047) - 1024
		f = sqrt( 1.0 - absf(x) / 1024 )
		if x < 0 : x = 0

		d3vpos rnd(FLD_R4)-FLD_R3 + x*3, (rnd(FLD_D)-FLD_R), x
		gosub *draw_ptc
	loop


	;------------------------------------------------------------
	; f-up

	a = 224000/div - 32
	if a > 0 {
		gmode 5, winx, winy, a
		hsvcolor , , 255
		gsquare -1, winx, winy
	}


	;------------------------------------------------------------
	redraw
	await ;10

	goto *mainloop


;------------------------------------------------------------
*draw_ptc
	gmode 5, , , f * 64
	d3particlem 0, 28
	gmode 5, , , f * 256
	d3particlem 0, 10

	return