2008年07月16日
花火作ってみようかな(その7)
暫くずっと 調整していたのだが ようやく 少し納得できる設定ができた w
-----
結局 最初の版 と 2.0 を組み合わせるのが良さそうだ(っていうか 両方置いて 起動してね と w)
-----
-----
2.0 はこんな感じ
-----
この後 連続発射のときは色を同じにしよう とか頭で考えてしまったんだが
-----
この写真を見直し 元に戻した w
-----
頭で考えることは大抵間違えている
-----
-----
カラフルがいい
-----
-----
最初の版の質感も捨てがたい
-----
-----
組み合わさると悪くない
-----
-----
というわけで 2.0 のリストも上げておきます
-----
まずは 弾の方から(HSVtoRGB の部分は省いてあります)
-----
次に筒の方(HSVtoRGB の部分は省いてあります)
-----
get_delay_time は連続発射するよう改造した
-----
後は ちらばらせるようにしたぐらいか...
-----
結局 最初の版 と 2.0 を組み合わせるのが良さそうだ(っていうか 両方置いて 起動してね と w)
-----
-----
2.0 はこんな感じ
-----
この後 連続発射のときは色を同じにしよう とか頭で考えてしまったんだが
-----
この写真を見直し 元に戻した w
-----
頭で考えることは大抵間違えている
-----
-----
カラフルがいい
-----
-----
最初の版の質感も捨てがたい
-----
-----
組み合わさると悪くない
-----
-----
というわけで 2.0 のリストも上げておきます
-----
まずは 弾の方から(HSVtoRGB の部分は省いてあります)
vector int2vector(integer i) {パーティクルの設定と高度の設定が少し変わっているぐらい...
vector v;
v.x = (float)(i / 10000) / 10.0;
integer tmp = i % 10000;
v.y = (float)(tmp / 100) / 10.0;
v.z = (float)(tmp % 100) / 10.0;
return v;
}
vector pos;
float z_pos;
float prev_z_pos = 0.0;
float org_z_pos;
vector color;
float scale;
integer hanabi_channel = 81;
start_fire() {
llParticleSystem([
PSYS_PART_FLAGS, PSYS_PART_EMISSIVE_MASK | PSYS_PART_INTERP_COLOR_MASK ,
PSYS_SRC_PATTERN, 2,
PSYS_PART_START_ALPHA, 0.8,
PSYS_PART_END_ALPHA, 0.0,
PSYS_PART_START_COLOR, color,
PSYS_PART_END_COLOR, color,
PSYS_PART_START_SCALE, <3.0, 3.0, 0.0>,
PSYS_PART_END_SCALE, <15.0, 15.0, 0.0>,
PSYS_PART_MAX_AGE, 1.5 * scale / 2,
PSYS_SRC_MAX_AGE, 0.0,
PSYS_SRC_ACCEL, <0.0, 0.0, -3.0>,
PSYS_SRC_ANGLE_BEGIN, 0.0,
PSYS_SRC_ANGLE_END, 0.0,
PSYS_SRC_BURST_PART_COUNT, 300,
PSYS_SRC_BURST_RATE, 1.0,
PSYS_SRC_BURST_RADIUS, 0.0,
PSYS_SRC_BURST_SPEED_MIN, 1.0 * scale / 2,
PSYS_SRC_BURST_SPEED_MAX, 7.0 * scale / 2,
PSYS_SRC_OMEGA, <0.0, 0.0, 0.0>,
PSYS_SRC_TARGET_KEY,(key)"",
PSYS_SRC_TEXTURE, ""]);
}
delay() {
llSleep(0.1);
}
stop_fire() {
llParticleSystem([]);
}
fire() {
if (scale > 1.5) {
llShout(hanabi_channel, "don1");
} else {
llShout(hanabi_channel, "don2");
}
start_fire();
delay();
stop_fire();
}
default {
state_entry() {
llSetStatus(STATUS_DIE_AT_EDGE, TRUE);
}
on_rez(integer param) {
if (param != 0) {
pos = llGetPos();
org_z_pos = pos.z;
color = int2vector(param);
llSetColor(color, ALL_SIDES);
state from_cannon;
}
}
touch_start(integer total_number) {
state test;
}
}
state test {
state_entry() {
color = HSVtoRGB();
scale = 1.0;
fire();
state default;
}
}
state from_cannon {
state_entry() {
llSetTimerEvent(0.2);
}
collision_start(integer total_number) {
llDie();
}
land_collision_start(vector pos) {
llDie();
}
touch_start(integer total_number) {
llDie();
}
timer() {
pos = llGetPos();
z_pos = pos.z;
if (z_pos < prev_z_pos) {
scale = (z_pos - org_z_pos) / 10.0;
if (scale < 1.0) {
scale = 1.0;
}
fire();
llDie();
}
prev_z_pos = z_pos;
}
}
-----
次に筒の方(HSVtoRGB の部分は省いてあります)
integer vector2int(vector v) {get_color は 改造していたけれど 結局 元に戻してしまった感じ...
return (integer)(v.x * 100000) + (integer)(v.y * 1000) + (integer) v.z * 10;
}
vector color;
float min_delay_time = 0.05;
float max_delay_time = 3.0;
integer listener;
integer hanabi_channel = 81;
integer sequence_count = 0;
integer in_burst_mode = FALSE;
integer first_after_burst_mode = FALSE;
float h_in_bust_mode;
vector get_color() {
if (in_burst_mode) {
if (TRUE || sequence_count ==40) {
h_in_bust_mode = llFrand(360.0);
} else if (sequence_count == 19) {
h_in_bust_mode = llFrand(360.0);
}
return HSVtoRGB();
} else {
return HSVtoRGB();
}
}
float get_delay_time() {
float delay_time;
if (sequence_count == 20) {
sequence_count--;
return 4.0;
} else if (sequence_count > 20) {
sequence_count--;
return 0.04 + llFrand(0.02);
} else if (sequence_count > 0) {
sequence_count--;
first_after_burst_mode = TRUE; // not actually
return 0.02 + llFrand(0.02);
} else if (first_after_burst_mode) {
in_burst_mode = FALSE;
first_after_burst_mode = FALSE;
return 4.0;
}
while ((delay_time = llFrand(max_delay_time)) < min_delay_time) {
// do nothing
}
if (delay_time > max_delay_time * 0.9) {
sequence_count = 40;
in_burst_mode = TRUE;
delay_time += 2.0;
}
return delay_time;
}
float min_velocity = 10.0;
float max_velocity = 5.0; // not actually
float get_velocity() {
float velocity;
while ((velocity = llFrand(max_velocity) + 17.0) < min_velocity) {
// do nothing
}
return velocity;
}
default {
state_entry() {
llSetTimerEvent(0.0);
llPreloadSound("fue");
llPreloadSound("don1");
llPreloadSound("don2");
}
on_rez(integer param) {
llResetScript();
}
touch_start(integer total_number) {
state fire;
}
}
state fire {
state_entry() {
llOwnerSay("start firework");
llSetTimerEvent(get_delay_time());
listener = llListen(hanabi_channel, "", "", "");
}
on_rez(integer param) {
llResetScript();
}
touch_start(integer total_number) {
llOwnerSay("stop firework");
llListenRemove(listener);
state default;
}
timer() {
color = get_color();
llRezObject("firework_bullet2", llGetPos(),
-llRot2Fwd(llGetRot()) * get_velocity() +,
ZERO_ROTATION, vector2int(color));
llPlaySound("fue", 1.0);
llSetTimerEvent(get_delay_time());
}
listen(integer channel, string name, key id, string message) {
llPlaySound(message, 1.0);
}
}
-----
get_delay_time は連続発射するよう改造した
-----
後は ちらばらせるようにしたぐらいか...
Posted by walkinglint at 19:48│Comments(0)
│walking のスクリプティング講座