2008年03月01日
walking のスクリプティング講座2(その2)
制御部からいってみよ~
制御部は各翼に対し 開け とか 閉じろ とかいう指令を出す部分
is_open というのは 開いているかどうか という状態を示してるんだけど
LSL には state の機能があるので それ使ってもいいんだけどね~
それ使って作るのは 宿題にしとこうって 誰に対する w
そうそう is_flying っていうのは 飛んでいるかどうか という状態を示してる
飛んでいる時だけ翼を表示するために使ってるんだ(あ 後 飛んでない時は じゃまにならないように下に向けるようにしてる)
後 wing_channel というのは オブジェクト間通信するためのチャネルを定義してる
左右別々のオブジェクトにしてるんだ 1つのオブジェクトにすることもできると思うんだけど なんだかうまくいかなかったんだよな~ < てきと~ w
283 は 翼 だ < てきと~ w
-----
今回は 前回のようにひっぱらないで さっさとかたづけちゃうぞ w
最初にここを実行する
1秒毎に timer を起動するようにして id_str という所に所有者の ID を記録している
オブジェクト間通信を行う時に たまたま近くに 同じ翼を付けている人がいると シンクロしちゃうという問題を避けるために メッセージに 所有者の ID をつけることにしたんだ
そのための変数
でもって 1秒毎に実行される timer だけど
llGetAgentInfo というのはアバターの状態を調べる関数
AGENT_FLYING というのとアンドを取ると飛んでいるかどうかが分かる
飛んでいたら その前まで飛んでいなかったら 翼を見えるようにして 翼が閉じていたら 開いて 開いていたら 閉じる
これを 1秒毎にするわけなんで 翼がぱたぱたするわけだ w
飛んでいなかったら その前まで飛んでいたら 翼を見えないようにする
これで 翼は飛んでいるときだけ表示されるのだ < わっかるかな~ まあ 普通分かるな w
とさっと書いたけど 見えるようにする とか 開く とかいうのは 見えるようにしろ とか 開け とかいう指示を出すってことね
オブジェクト間通信とか言ってたけど なんのことはない チャネルを決めて llSay すればよいのだ
llRegionSay 使えばリージョン中に届かせることもできるじょ 音楽の URL を設定するやつは それ 使ってたな...
(続く)
//
// File: Wing_C.lsl
// Date Author number of nodes
// 2007/9/9 walkinglint 22
// 2007/9/7 walkinglint 12
// 2007/9/7 walkinglint 32 (Wing_R->Wing_C)
// 2007/9/5 walkinglint 32
// 2007/9/5 walkinglint 15 (Wing->Wing_R)
// 2007/9/2 walkinglint 15
//
integer is_open = FALSE;
integer is_flying = FALSE;
integer wing_channel = 283;
制御部は各翼に対し 開け とか 閉じろ とかいう指令を出す部分
is_open というのは 開いているかどうか という状態を示してるんだけど
LSL には state の機能があるので それ使ってもいいんだけどね~
それ使って作るのは 宿題にしとこうって 誰に対する w
そうそう is_flying っていうのは 飛んでいるかどうか という状態を示してる
飛んでいる時だけ翼を表示するために使ってるんだ(あ 後 飛んでない時は じゃまにならないように下に向けるようにしてる)
後 wing_channel というのは オブジェクト間通信するためのチャネルを定義してる
左右別々のオブジェクトにしてるんだ 1つのオブジェクトにすることもできると思うんだけど なんだかうまくいかなかったんだよな~ < てきと~ w
283 は 翼 だ < てきと~ w
-----
今回は 前回のようにひっぱらないで さっさとかたづけちゃうぞ w
string id_str;
default {
on_rez(integer param) {
llSetTimerEvent(1.0);
id_str = llGetOwner();
}
最初にここを実行する
1秒毎に timer を起動するようにして id_str という所に所有者の ID を記録している
オブジェクト間通信を行う時に たまたま近くに 同じ翼を付けている人がいると シンクロしちゃうという問題を避けるために メッセージに 所有者の ID をつけることにしたんだ
そのための変数
timer() {
integer status = llGetAgentInfo(llGetOwner());
if (status & AGENT_FLYING) {
if (is_flying == FALSE) {
llSay(wing_channel, id_str + "visible");
is_flying = TRUE;
}
if (is_open == FALSE) {
is_open = TRUE;
llSay(wing_channel, id_str + "open");
} else {
is_open = FALSE;
llSay(wing_channel, id_str + "close");
}
} else {
if (is_flying == TRUE) {
llSay(wing_channel, id_str + "invisible");
is_flying = FALSE;
}
}
}
}
でもって 1秒毎に実行される timer だけど
llGetAgentInfo というのはアバターの状態を調べる関数
AGENT_FLYING というのとアンドを取ると飛んでいるかどうかが分かる
飛んでいたら その前まで飛んでいなかったら 翼を見えるようにして 翼が閉じていたら 開いて 開いていたら 閉じる
これを 1秒毎にするわけなんで 翼がぱたぱたするわけだ w
飛んでいなかったら その前まで飛んでいたら 翼を見えないようにする
これで 翼は飛んでいるときだけ表示されるのだ < わっかるかな~ まあ 普通分かるな w
とさっと書いたけど 見えるようにする とか 開く とかいうのは 見えるようにしろ とか 開け とかいう指示を出すってことね
オブジェクト間通信とか言ってたけど なんのことはない チャネルを決めて llSay すればよいのだ
llRegionSay 使えばリージョン中に届かせることもできるじょ 音楽の URL を設定するやつは それ 使ってたな...
(続く)
Posted by walkinglint at 14:20│Comments(0)
│walking のスクリプティング講座