sample\d3module\xsample_verge.hsp » Plain Format
;============================================================
; 2006/--/--
title "S.Programs 花火窓 Verge"
; version 1.0/sample_ver
; http://sprocket.babyblue.jp/
;============================================================
/*
・花火窓 Verge
空中移動する視点から打ち上げ花火を見るスクリプトです。
水上花火をさまざまな角度から眺めることができます。
[Enter] : フルスクリーン切り替え
[Esc] : 終了
*/
#include "d3m.hsp"
;============================================================
; main
;============================================================
; 参考数値 : 10 号玉
; h = 300m
; d = 300m
#const INSTMAX 5 ; インスタンス数
#const PTCS_SH 40 ; shooter 粒子数
#const PTCS_FR 200 ; fire, bgstar 粒子数
#const MODELS 6 ; モデル数
#const MDLSFT PTCS_FR / 2 ; モデルシフタ
;------------------------------------------------------------
; init
;------------------------------------------------------------
; mkparticle
arr = 6, 2, 133, 60 ; *over-frame 133%
d3mkparticle 0, 224, 224, 224, arr ; 0 white
d3mkparticle 1, 128, 128, 255, arr ; 1 blue
d3mkparticle 2, 255, 255, 128, arr ; 2 yellow
d3mkparticle 3, 128, 192, 255, arr ; 3 skyblue
;------------------------------------------------------------
; mkinstance
dim s_iph, 16 ; >= INSTMAX
memset s_iph, 1, 64
randomize
;------------------------------------------------------------
*mainloop
;------------------------------------------------------------
; full-screen ctrlr (toggle : Enter)
stick ky_inp
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
}
}
;------------------------------------------------------------
; setup
redraw 0
hsvcolor 112, 128, 32 + lup : boxf
lup = 0
time = d3timer()
;------------------------------------------------------------
; setcam
f = 0.00005 * time
r = sin(f)*300 + 400 ; r-rng : 100 -- 700
z = 70000.0/r - 90 ; z-rng : 600 -- 0
d3setcam cos(f)*r, sin(f)*r, z, 0, 0, z*2/3
;------------------------------------------------------------
; play sequence
repeat INSTMAX
; duplicate
dup iph, s_iph(cnt)
dup it0, s_it0(cnt)
dup it1, s_it1(cnt)
dup icx, s_icx(cnt)
dup icz, s_icz(cnt)
dup imod, s_imod(cnt)
; phase change (phase++)
if it1 <= time {
iph++ ; phase inc
it0 = time ; t_start
it1 = time + 5000 ; t_end (default)
lup |= (iph = 2) * 40 ; thunder (if phase 1 -> 2)
}
; re-setup (phase 3 -> 0)
if iph >= 3 {
iph = 0 ; reset phase
imod = rnd(MODELS) ; model no.
icx = rnd(400) - 200 ; x-pos
icz = rnd(100) + 230 ; height
it1 = time + rnd(7000) ; sleep time
}
; draw (phase : 1-shoot, 2-exp)
if iph {
; setup
ts = 0.001 * (time - it0)
; prms for *starptc
ds_x = icx
ds_z = ts*ts*-5 ; ts*ts*5 = 落下項 (g = 10m/s2; z = (1/2)gt2)
ds_r = logf(ts + 0.9)
ds_stg = 1.0 - ts / 5
; Phase 1 shoot
if iph = 1 {
ds_mode = 2 ; mode shoot
ds_r *= icz
ds_stg /= 2
ds_cnt = PTCS_SH
; Phase 2 explosion
} else {
ds_z += icz
ds_r *= 90
ds_cnt = PTCS_FR
ds_seed = imod * MDLSFT
}
; draw
gosub *starptc
}
loop
;------------------------------------------------------------
; stars
; prms for *starptc
ds_x = 0
ds_z = 0
ds_cnt = PTCS_FR
ds_r = 720
ds_stg = 0.5
gosub *starptc
;------------------------------------------------------------
redraw
await ;10
goto *mainloop
;------------------------------------------------------------
*starptc
; pre-calc
sqstg = sqrt(ds_stg)
; generate vector / draw particles
repeat ds_cnt, ds_seed
; vector -> pos
pid = cnt / PTCS_FR + ds_mode
f = cnt
g = cnt * 1013
; r
; z = 1.0
z = 0.001 * (1000 - cnt\PTCS_FR*(pid=3))
if ds_mode { ; vector : shooter
z /= (cnt + 3)
x = cos(f) / z / 1000
y = sin(g) / z / 1000 * ds_r
} else { ; vector : fire
; pid
; 0 : model O (default) white
; 1 : model O (default) blue
; 2 : model o (r = 0.5) yellow
; 3 : model - (f = 0) skyblue
; fire-shift
z /= (pid = 2) + 1
f *= (pid ! 3)
x = cos(f) * cos(g) * z
y = cos(f) * sin(g) * z * ds_r
z *= sin(f)
}
x = x * ds_r + ds_x
z = z * ds_r + ds_z
z *= (z > 0) ; clip
; draw
gmode 5, , , sqstg * 256
d3particle pid, x, y, z, ds_stg * 4
gmode 5, , , sqstg * 90
d3particlem pid, ds_stg * 7 + 2
gmode 5, , , sqstg * 60
z = -0.9 * z - 4
d3particle pid, x, y, z, ds_stg * 10
loop
; set default
ds_mode = 0 ; fire
ds_seed = 0
return