ソラマメブログ

2008年06月21日

ランダム 3D モンドリアン - Randrian(その3)

Randrian ですが 実は 本来 リンクする機能を試してみようと思って始めたことだったのですが それができないままで 気持ちが悪かったのですが
-----
ようやく 思ったものができましたが... これが結構大変でした w
-----
rez したオブジェクトの key を返す object_rez というのがある というのに気付き これをリンクすればいいんじゃないか
-----
というわけで少し調べてみると
-----
パーミッションも リンクする側で取られていればよいようなので 本体側でとっておくだけでよいようです
-----
というわけで そくっと作って試してみましたが どうもうまくいきません(リンクしないのです)
-----

-----
流石にこれは変だろうというわけで object_rez llcreatelink で google ってみると
-----
LSL-BBS :: トピックを表示 - 失敗したこと・はまったこと
-----
に 同じようなことで悩んだ人がいて
-----
オチとしては、なぜか私のSIMではうまく動かないという...
数m移動して隣のSIMでやってみると見事動きました
2日ハマってたのに...
-----
などということが書かれてあり
-----
ひょっとしてと思い 自分の土地で試してみると
-----

-----
なんのことはない ちゃんとリンクされています
-----
で リンクする所までも 結構波乱の展開だったのですが ^^;
-----
クリックすると リンクした cube を削除し 生成し直す という機能を実現しようとして また嵌りました
-----
リンクを変更すると イベントが発生するので それが 2回起きたら llDie するスクリプトを cube の方に入れておけばいいだろう
-----
と思ったのですが 本体が消えてしまいました
-----
cube は本体にリンクされるので リンクされたものとして リンクが変更されたというイベントをもらってしまって 本体ごと消えてしまうのかもしれません
-----
というわけで 本体の方で 子プリム に対し メッセージを出しておいて そのメッセージを受けた後 リンクが変更されたら llDie するようにするとうまくいきました ^^
-----

-----
リンクに結構時間がかかるので(1リンク 1秒?)メッセージをださせるようにしました
-----
というわけで 本体側のスクリプトがこれ
//
// File: randrian2link.lsl
// Date Author number of nodes
// 2008/6/21 walkinglint 30
// 2008/6/19 walkinglint 18
// 2008/6/19 walkinglint 19 (randrian->randrian2link)
// 2008/6/19 walkinglint 19
//
integer i;
integer j;
integer num_of_box = 50;
float range = 0.5;
float distance = 0.7;
gen_randrian() {
for (i = 0; i < num_of_box; i++) {
llRezObject("cube2link", llGetPos()
            + (<0.0, 0.0, distance>
             + <(llFrand(1.0) - 0.5) * range, (llFrand(1.0) - 0.5) * range, (llFrand(1.0) - 0.5) * range>) * llGetRot(),
           ZERO_VECTOR, llGetRot(), 0);
}
}
default {
state_entry() {
llRequestPermissions(llGetOwner(), PERMISSION_CHANGE_LINKS);
}
on_rez(integer param) {
llResetScript();
}
touch_start(integer total_number) {
llMessageLinked(LINK_ALL_CHILDREN, 0, "", NULL_KEY);
llSleep(1.0);
llBreakAllLinks();
llOwnerSay("linking boxes ...");
j = 0;
gen_randrian();
}
object_rez(key id) {
llCreateLink(id, TRUE);
j++;
if (j == num_of_box) {
llOwnerSay("linked all boxes");
}
}
}
cube 側のスクリプトがこれ
//
// File: cube2link.lsl
// Date Author number of nodes
// 2008/6/21 walkinglint 32
// 2008/6/19 walkinglint 25
// 2008/6/19 walkinglint 16 (cube->cube2link)
// 2008/6/18 walkinglint 15
//
integer i;
integer to_die;
default {
on_rez(integer param) {
i = 0;
vector scale;
scale.x = llFrand(1.0) * 0.1;
scale.y = llFrand(1.0) * 0.1;
scale.z = llFrand(1.0) * 0.1;
llSetScale(scale);
vector color;
color.x = llFrand(1.0);
color.y = llFrand(1.0);
color.z = llFrand(1.0);
llSetColor(color, ALL_SIDES);
llSetAlpha(llFrand(1.0), ALL_SIDES);
llSetPrimitiveParams([25, ALL_SIDES, llFrand(1.0) * 0.1]); // too bright
integer to_die = 0;
}
changed(integer change) {
if ((to_die == 1) && (change == CHANGED_LINK)) {
llSleep(1.0);
llDie();
}
}
link_message(integer sender_num, integer num, string str, key id) {
to_die = 1;
}
}
あ もちろんここでは cube は臨時オブジェクトでなくしています

同じカテゴリー(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)
上の画像に書かれている文字を入力して下さい
 
<ご注意>
書き込まれた内容は公開され、ブログの持ち主だけが削除できます。