ソラマメブログ

2008年02月09日

walking のスクリプティング講座 - 噴水

タイトルのようなことをしようと思うじょ

教材は Programmable Fountain のスクリプト New Script と New Script 1 だよ

New Script はこれ
// to add sequence, edit #1 #2 #3
string start_str = "start";
string stop_str = "stop";
string start_color_str = "start_color";
string end_color_str = "end_color";
integer min_link_num = 1;
integer max_link_num = 6; // customize here to add nozzle
list sequence;
integer num_of_record = 5; // duration / src nozzle link num / operation(start/stop) / hight / target nozzle link num
list sequence0 = [0.0, 1, start_str, 4, 0, 0.0, LINK_ALL_OTHERS, start_str, 1, 0];
list sequence1 = [1.0, 2, start_str, 2, 1, 1.0, 2, stop_str, 2, 1, 1.0, 3, start_str, 2, 1, 1.0, 3, stop_str, 2, 1, 1.0, 4,
            start_str, 2, 1, 1.0, 4, stop_str, 2, 1, 1.0, 5, start_str, 2, 1, 1.0, 5, stop_str, 2, 1, 1.0, 6, start_str, 2, 1, 1.0, 6, stop_str, 2, 1];
list sequence2 = [0.0, 1, start_str, 4, 1, 0.0, LINK_ALL_OTHERS, start_str, 1, 1];
list sequence3 = [0.0, 1, start_str, 4, 1, 0.0, 2, start_str, 1, 3, 0.0, 3, start_str, 1, 4, 0.0, 4, start_str, 1, 5, 0.0, 5,
            start_str, 1, 6, 10.0, 6, start_str, 1, 2];
list sequence4 = [0.0, 1, start_str, 4, 1, 0.0, 2, start_str, 1, 4, 0.0, 3, start_str, 1, 5, 0.0, 4, start_str, 1, 6, 0.0, 5,
            start_str, 1, 2, 0.0, 6, start_str, 1, 3];
list sequence5 = [0.0, 1, start_str, 4, 1, 0.0, 2, start_str, 1, 4, 0.0, 3, start_str, 1, 5, 0.0, 4, start_str, 1, 6, 0.0, 5,
            start_str, 1, 2, 3.0, 6, start_str, 1, 3, 0.0, 1, stop_str, 4, 1, 0.0, 2, stop_str, 1, 4, 0.0, 3,
            stop_str, 1, 5, 0.0, 4, stop_str, 1, 6, 0.0, 5, stop_str, 1, 2, 5.0, 6, stop_str, 1, 3];
list sequence6_1 = [1.0, LINK_SET, start_str, 2, 2];
list sequence6_2 = [4.5, LINK_SET, stop_str, 2, 2];
list sequence6_3 = [1.0, LINK_SET, start_str, 2, 3];
list sequence6_4 = [4.5, LINK_SET, stop_str, 2, 3];
list sequence6_5 = [1.0, LINK_SET, start_str, 2, 4];
list sequence6_6 = [4.5, LINK_SET, stop_str, 2, 4];
list sequence6_7 = [1.0, LINK_SET, start_str, 2, 5];
list sequence6_8 = [4.5, LINK_SET, stop_str, 2, 5];
list sequence6_9 = [1.0, LINK_SET, start_str, 2, 6];
list sequence6_10 = [4.5, LINK_SET, stop_str, 2, 6];
list sequence7_1 = [0.0, LINK_SET, start_color_str, 50510, 0];
list sequence7_2 = [0.0, 2, start_str, 2, 0, 0.0, 3, start_str, 2, 0, 0.0, 4, start_str, 2, 0, 0.0, 5, start_str, 2, 0, 10.0, 6, start_str, 2, 0];
list sequence7_3 = [0.0, LINK_SET, start_color_str, 51005, 0];
list sequence7_4 = [0.0, 2, start_str, 2, 0, 0.0, 3, start_str, 2, 0, 0.0, 4, start_str, 2, 0, 0.0, 5, start_str, 2, 0, 10.0, 6, start_str, 2, 0];
list sequence7_5 = [0.0, LINK_SET, start_color_str, 101010, 0];
list sequence7_6 = [0.0, 2, start_str, 2, 0, 0.0, 3, start_str, 2, 0, 0.0, 4, start_str, 2, 0, 0.0, 5, start_str, 2, 0, 10.0, 6, start_str, 2, 0];
list sequence8_1 = [0.0, LINK_SET, start_color_str, 50510, 0];
list sequence8_2 = [0.8, 2, start_str, 2, 0, 0.8, 3, start_str, 2, 0, 0.8, 4, start_str, 2, 0, 0.8, 5, start_str, 2, 0, 0.8, 6, start_str, 2, 0];
list sequence8_2_2 = [10.0, 1, start_str, 6, 0];
list sequence8_3 = [0.8, 2, stop_str, 2, 0, 0.8, 3, stop_str, 2, 0, 0.8, 4, stop_str, 2, 0, 0.8, 5, stop_str, 2, 0, 0.8, 6, stop_str, 2, 0];
list sequence8_3_2 = [5.0, 1, stop_str, 6, 0];
list sequence8_4 = [0.0, LINK_SET, start_color_str, 51005, 0];
list sequence8_5 = [0.8, 2, start_str, 2, 0, 0.8, 3, start_str, 2, 0, 0.8, 4, start_str, 2, 0, 0.8, 5, start_str, 2, 0, 0.8, 6, start_str, 2, 0];
list sequence8_5_2 = [10.0, 1, start_str, 6, 0];
list sequence8_6 = [0.8, 2, stop_str, 2, 0, 0.8, 3, stop_str, 2, 0, 0.8, 4, stop_str, 2, 0, 0.8, 5, stop_str, 2, 0, 0.8, 6, stop_str, 2, 0];
list sequence8_6_2 = [5.0, 1, stop_str, 6, 0];

// add sequence here #1
list pattern_list = ["0", "1", "2", "3", "4", "5", "6", "7", "8"]; // add sequence number here #2

vector default_start_color = <0.50,0.50,1.00>;
vector default_end_color = <1.00,1.00,1.00>;

integer num_of_sequence;
list cur_seq;
integer cur_seq_num;
float cur_duration;
integer cur_src_link;
string cur_operation;
integer cur_hight;
integer cur_target_link;
integer touched;

get_record()
{
cur_src_link = llList2Integer(cur_seq, 1);
cur_operation = llList2String (cur_seq, 2);
cur_hight = llList2Integer(cur_seq, 3);
cur_target_link = llList2Integer(cur_seq, 4);
}

float update_cur_seq_and_get_duration()
{
cur_seq = llList2List(sequence, cur_seq_num * num_of_record, (cur_seq_num + 1) * num_of_record - 1);
if (++cur_seq_num > num_of_sequence) {
cur_seq_num = 0;
}
// llOwnerSay((string)cur_seq_num);
return llList2Float(cur_seq, 0);
}

stop_fountain()
{
integer i;
for (i = min_link_num; i <= max_link_num; i++) {
llMessageLinked(i, 0, stop_str, NULL_KEY);
}
}

integer vector2int(vector v)
{
return (integer)(v.x * 100000) + (integer)(v.y * 1000) + (integer)(v.z * 10);
}

set_default_colors()
{
llMessageLinked(LINK_SET, vector2int(default_start_color), start_color_str, NULL_KEY);
llMessageLinked(LINK_SET, vector2int(default_end_color), end_color_str, NULL_KEY);
}

default
{
state_entry()
{
sequence = sequence1;
num_of_sequence = llGetListLength(sequence) / num_of_record;
cur_seq_num = 0;
stop_fountain();
llSetTimerEvent(1.0);
llListen(123, "", "", "");
touched = FALSE;
}
touch(integer total_number)
{
touched = TRUE;
llDialog(llDetectedKey(0), "Select pattern", pattern_list, 123);
}
listen(integer channel, string name, key id, string message) {

// llOwnerSay("here we are " + message);

if (touched == FALSE) {
return;
}

touched = FALSE;

llListen(123, "", "", "");

if (message == "0") {
set_default_colors();
sequence = sequence0;
} else if (message == "1") {
set_default_colors();
sequence = sequence1;
} else if (message == "2") {
set_default_colors();
sequence = sequence2;
} else if (message == "3") {
set_default_colors();
sequence = sequence3;
} else if (message == "4") {
set_default_colors();
sequence = sequence4;
} else if (message == "5") {
set_default_colors();
sequence = sequence5;
} else if (message == "6") {
set_default_colors();
sequence = sequence6_1 + sequence6_2 + sequence6_3 + sequence6_4 + sequence6_5 + sequence6_6
              + sequence6_7 + sequence6_8 + sequence6_9 + sequence6_10; // num of initializers is limited in LSL
} else if (message == "7") {
set_default_colors();
sequence = sequence7_1 + sequence7_2 + sequence7_3 + sequence7_4 + sequence7_5 + sequence7_6; // why error ?
} else if (message == "8") {
set_default_colors();
sequence = sequence8_1 + sequence8_2 + sequence8_2_2 + sequence8_3 + sequence8_3_2
              + sequence8_4 + sequence8_5 + sequence8_5_2 + sequence8_6 + sequence8_6_2;
} else { // add process for added sequence #3
// do not comes here
}

// if (sequence != prev_sequence) {
num_of_sequence = llGetListLength(sequence) / num_of_record;
cur_seq_num = 0;
stop_fountain();
llSetTimerEvent(1.0);
// llOwnerSay(message + " is selected");
// prev_sequence = sequence;
// }
}
timer()
{
integer max_count = 0;
while ((cur_duration = update_cur_seq_and_get_duration()) == 0.0) {
get_record();
llMessageLinked(cur_src_link, cur_hight, cur_operation, llGetLinkKey(cur_target_link));
// llOwnerSay(cur_operation + " " + (string)cur_src_link);
if (++max_count > num_of_sequence) {
llSetTimerEvent(0.0);
return;
}
}
get_record();
if (cur_target_link == 0) {
llMessageLinked(cur_src_link, cur_hight, cur_operation, NULL_KEY);
} else {
llMessageLinked(cur_src_link, cur_hight, cur_operation, llGetLinkKey(cur_target_link));
}
// llOwnerSay(cur_operation + " " + (string)cur_src_link);
llSetTimerEvent(cur_duration);
}
}

New Script 1 はこれ
//*****************************************************************************
//
// The simplest possible particle script.
//
// Use: Will start a particle system either when rezzed or the script is reset.
//
//*****************************************************************************

string start_str = "start";
string stop_str = "stop";
string start_color_str = "start_color";
string end_color_str = "end_color";

vector default_start_color = <0.50,0.50,1.00>;
vector default_end_color = <1.00,1.00,1.00>;

vector start_color = default_start_color;
vector end_color = default_end_color;

ParticleStart(float hight, key target)
{
llParticleSystem([
PSYS_PART_FLAGS, 259 | PSYS_PART_TARGET_POS_MASK,
PSYS_SRC_PATTERN, 2,
PSYS_PART_START_ALPHA, 1.00,
PSYS_PART_END_ALPHA, 0.10,
PSYS_PART_START_COLOR, start_color,
PSYS_PART_END_COLOR, end_color,
PSYS_PART_START_SCALE, <0.2,0.2,0.00>,
PSYS_PART_END_SCALE, <0.7,0.7,0.00>,
PSYS_PART_MAX_AGE, 6.0,
PSYS_SRC_TARGET_KEY, target,
PSYS_SRC_MAX_AGE, 0.00,
PSYS_SRC_ACCEL, <0.00, 0.00, hight>,
PSYS_SRC_ANGLE_BEGIN, 0.00,
PSYS_SRC_ANGLE_END, 0.70,
PSYS_SRC_BURST_PART_COUNT, 10,
PSYS_SRC_BURST_RADIUS, 0.01,
PSYS_SRC_BURST_RATE, 0.05,
PSYS_SRC_BURST_SPEED_MIN, 0.00,
PSYS_SRC_BURST_SPEED_MAX, 0.40,
PSYS_SRC_OMEGA, <0.00,0.00,0.00>,
PSYS_SRC_TEXTURE, "bbf5a4bf-4971-4db7-905a-0235b2757dec"
]);

}

ParticleEnd()
{
llParticleSystem([
]);

}

//*****************************************************************************
//
// Default state: LSL will always start in this state.
//
//*****************************************************************************

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;
}
default
{
link_message(integer sender_num, integer num, string str, key id){
if (str == start_str) {
// llOwnerSay((string)llGetLinkNumber() + " is started");
ParticleStart((float)num, id);
} else if (str == stop_str) {
// llOwnerSay((string)llGetLinkNumber() + " is stopped");
ParticleEnd();
} else if (str == start_color_str) {
start_color = int2vector(num);
// llOwnerSay((string)num);
} else if (str == end_color_str) {
end_color = int2vector(num);
}
}
}

頭から 少しずつ解説するね w

(続く)

タグ :スクリプト

同じカテゴリー(walking のスクリプティング講座)の記事
 プロフィール写真の表示に問題 (2009-11-30 20:55)
 ミニ太陽系 (2009-03-21 06:03)
 関数から文字列を返したら何か問題になる? (2009-03-18 18:02)
 llListFindList って型って関係ないんだったっけ (2009-03-18 14:02)
 夏時間(PDT)の実験 (2009-03-08 22:04)
 15パズルの作り方(その3) (2009-03-08 06:03)
上の画像に書かれている文字を入力して下さい
 
<ご注意>
書き込まれた内容は公開され、ブログの持ち主だけが削除できます。