2007年5月18日金曜日

【LSL】鍵付きのドア(更衣室)

【プール機能拡張】でちょっと書いた「更衣室のドア」。「内カギ」ではありませんが、更衣室(試着室)のように、閉めるのは誰でもOKだけど、開けられるのは「閉めた人」とオーナーだけにしました。


基本的な動作は【ドアとスライドする窓を作る】Makapu【鍵をかける】と同じです。

出来上がりがこちらの写真。写真左が閉じている状態の時、写真右が開いている状態の時です。開いている時はフローティングテキストで説明を出しています。

以下スクリプト。
// floating text
string ft = "Touch! Close the curtain.";

// close
vector close_scale = <4.8, 6.2, 0.1>;
vector close_pos = <-2.2, 0.0, 0.0>;

// open
vector open_scale;
vector open_pos;

// open timer(minutes)
integer timers = 60;

// lock key
key lock=NULL_KEY;

default {
state_entry() {
open_scale = llGetScale();
open_pos = llGetPos();
llSetText(ft,<1.0,1.0,1.0>, 1.0);
state open;
}
}

state open {
state_entry() {
// unlock
lock = NULL_KEY;
llSetScale(open_scale);
llSetPos(open_pos);
llSetText(ft,<1.0,1.0,1.0>, 1.0);
}

touch_start(integer total_number) {
lock = llDetectedKey(0);
state close;
}

}

state close {
state_entry() {
llSetScale(close_scale);
llSetPos(open_pos+close_pos);
llSetText(ft,<1.0,1.0,1.0>, 0.0);
llSetTimerEvent(timers*60);
}

touch_start(integer detected) {
if (llDetectedKey(0) == llGetOwner()) { // Owner
state open;
} else if (llDetectedKey(0) == lock) { // touch close user
state open;
}
}

timer() {
llSetTimerEvent(0);
state open;
}

}

Touch! Close the curtain.は、開いている時に表示するフローティングテキストです。
vector close_scale = <4.8, 6.2, 0.1>;の右辺は閉じている時のプリムの大きさです。
vector close_pos = <-2.2, 0.0, 0.0>;の右辺は閉じている時と開いている時の座標の差分の値です。
integer timers = 60;は自動でカーテンがあくまでの時間を「分」で入れています。

スクリプトの流れはこんな感じです。

「カーテンが開いているとき」
誰かがタッチしたら、その人のUUIDを変数lockに格納。
 ↓
「カーテンを閉じる」
サイズと位置を変更して、フローティングテキストを消去(厳密には透明にする)。
変数timersで設定した時間後、カーテンを開けるイベントが発生するようにする。
 ↓
「カーテンが閉じているときに誰かがタッチした」
・触った人がオーナー:変数lockを空にしてカーテンを開ける。
・オーナー以外の場合:タッチした人のUUIDと変数lockを比較、同じであればカーテンを閉じる。
 ↓
「カーテンが開く」
最初に置いた時のサイズ・位置に戻して、フローティングテキストを表示して変数lockを空にする。

なんだか長くなりましたが、これ大丈夫だと思います。・・・多分^^
ただ、先の記事にも書きましたが、カメラワーク次第では中をのぞかれてしまいます。まぁ、その辺はセカンドライフの仕様なので、どうしようもありませんが・・・