2008年05月11日
[解説] 3 の付く時だけ あほ になるブレスレット
暇なので解説してみることにした w
変数の宣言と初期値設定
-----
word2match というのはマッチさせる文字列を入れておくノートの名前
アニメーションさせる時は勝手にアニメーションさせることができるわけでなく アニメーションさせる許可を得てない場合 アニメーションさせる許可をまず要求し得ないといけない(アニメーションさせるスクリプトの定式)
-----
ここでは許可を得ているかどうかを調べ 得てなかった場合 許可を要求している
スクリプトの入っている場所に入っているアニメーションを調べ 最初にリストされたアニメーションの名前を animation_name に入れる(これも定式)
ノートの名前でそれがノートであることを確認した後 その読み込みを起動する(これもノートを読み込む時の定式)
SL のスクリプトの最も大きな特徴は言語要素として状態(ステート)を持っていること(他に知らないけど他にもあるのかな? w)
-----
スクリプトは最初に起動されると default という状態にある(default 以外の状態を使わない場合はずっと default 状態のままにある)
-----
状態を使った方がいい場合というのはあんまり思い浮かばないので 普通はあんまり状態について考える必要はないんじゃないかな? とか思う w
-----
状態を用いた場合の(簡単に思いつく明らかな)デメリットは 状態を持たない他の言語への移行性が失われることだろう
-----
というのはまあ置いておいて w
-----
例えば rez された場合 on_rez というアクションが起動されるわけだけれど 状態毎に on_rez が定義されていた場合 今いる状態の on_rez が起動されるわけ
-----
つまり 状態毎にアクションは定義するわけ
-----
さらに 状態はリセット(編集した場合もリセットされるようだが)されない限り インベントリーに出し入れしても 状態がクリアされることはないわけ
-----
というわけで.
-----
最初の最初に default の state_entry が実行されるので ここに最初に実行させる処理を入れておく
-----
オーナーのキー(許可を得るのに必要)を取り 関数(というか手続き)を起動し変数を設定し listen で オーナーのチャット(0 チャネル)を聞かせる
-----
関数(というか手続き)は 状態の定義の前に置くらしい
これは SL のスクリプトで一般的に用いられる定式みたいなものだと思うのだけれど rez のタイミングでリセットさせる
-----
rez を超えて状態(変数の状態もだけど)を保持させたい場合は使っちゃだめだけれど w
許可を得るためのアクションとノートを読み込むためのアクション(どちらも定式)
オーナーがチャットすると チャットの行が message に入れられてこのアクションが呼び出される
-----
マッチさせるリストから 1つづつ取り出し message にマッチ(/合致)する場所が存在するかを調べ 存在した場合(存在しない場合 -1 が返される) animation_name のアニメーションを起動する
-----
存在しない場合 アニメーションを停止する
integer i;
integer read_line;
string animation_name = "";
string notecard_name = "word2match";
key query_id;
list word2match_list = [];
key owner;
integer num_of_word2match;
string word2match;
integer got_permission = 0; // needed?
変数の宣言と初期値設定
-----
word2match というのはマッチさせる文字列を入れておくノートの名前
get_permission () {
integer perm = llGetPermissions();
if ((perm & PERMISSION_TRIGGER_ANIMATION) == 0) {
llRequestPermissions(owner, PERMISSION_TRIGGER_ANIMATION);
} else {
got_permission = 1;
}
}
アニメーションさせる時は勝手にアニメーションさせることができるわけでなく アニメーションさせる許可を得てない場合 アニメーションさせる許可をまず要求し得ないといけない(アニメーションさせるスクリプトの定式)
-----
ここでは許可を得ているかどうかを調べ 得てなかった場合 許可を要求している
set_animation_name () {
integer num_of_animations;
num_of_animations = llGetInventoryNumber(INVENTORY_ANIMATION);
for (i = 0; i < num_of_animations; i++) {
animation_name = llGetInventoryName(INVENTORY_ANIMATION, i);
return;
}
}
スクリプトの入っている場所に入っているアニメーションを調べ 最初にリストされたアニメーションの名前を animation_name に入れる(これも定式)
set_word2match_list () {
llOwnerSay("Now Loading..");
read_line = 0;
if (llGetInventoryType(notecard_name) == INVENTORY_NOTECARD) {
// request first line
query_id = llGetNotecardLine(notecard_name, read_line);
} else {
llOwnerSay("Notecard " + notecard_name + " is not found");
}
}
ノートの名前でそれがノートであることを確認した後 その読み込みを起動する(これもノートを読み込む時の定式)
default {
state_entry () {
owner = llGetOwner();
get_permission();
set_animation_name();
set_word2match_list();
llListen(0, "", owner, "");
}
SL のスクリプトの最も大きな特徴は言語要素として状態(ステート)を持っていること(他に知らないけど他にもあるのかな? w)
-----
スクリプトは最初に起動されると default という状態にある(default 以外の状態を使わない場合はずっと default 状態のままにある)
-----
状態を使った方がいい場合というのはあんまり思い浮かばないので 普通はあんまり状態について考える必要はないんじゃないかな? とか思う w
-----
状態を用いた場合の(簡単に思いつく明らかな)デメリットは 状態を持たない他の言語への移行性が失われることだろう
-----
というのはまあ置いておいて w
-----
例えば rez された場合 on_rez というアクションが起動されるわけだけれど 状態毎に on_rez が定義されていた場合 今いる状態の on_rez が起動されるわけ
-----
つまり 状態毎にアクションは定義するわけ
-----
さらに 状態はリセット(編集した場合もリセットされるようだが)されない限り インベントリーに出し入れしても 状態がクリアされることはないわけ
-----
というわけで.
-----
最初の最初に default の state_entry が実行されるので ここに最初に実行させる処理を入れておく
-----
オーナーのキー(許可を得るのに必要)を取り 関数(というか手続き)を起動し変数を設定し listen で オーナーのチャット(0 チャネル)を聞かせる
-----
関数(というか手続き)は 状態の定義の前に置くらしい
on_rez(integer start_param) {
llResetScript();
}
これは SL のスクリプトで一般的に用いられる定式みたいなものだと思うのだけれど rez のタイミングでリセットさせる
-----
rez を超えて状態(変数の状態もだけど)を保持させたい場合は使っちゃだめだけれど w
run_time_permissions(integer perm) {
if (perm & PERMISSION_TRIGGER_ANIMATION) {
got_permission = 1;
}
}
dataserver(key queryid, string data) {
if (queryid == query_id) {
if (data != EOF) {
// process data
if (llStringLength(data) != 0) {
word2match_list = llListInsertList(word2match_list,
[data], llGetListLength(word2match_list));
}
read_line++;
query_id = llGetNotecardLine(notecard_name, read_line);
} else {
llOwnerSay("Loading complete.");
}
}
}
許可を得るためのアクションとノートを読み込むためのアクション(どちらも定式)
listen(integer channel, string name, key id, string message) {
if ((got_permission == 1) && (llStringLength(animation_name) != 0)) {
num_of_word2match = llGetListLength(word2match_list);
for (i = 0; i < num_of_word2match; i++) {
word2match = llList2String(word2match_list, i);
if (llSubStringIndex(message, word2match) != -1) {
llStartAnimation(animation_name);
return;
}
}
llStopAnimation(animation_name);
}
}
}
オーナーがチャットすると チャットの行が message に入れられてこのアクションが呼び出される
-----
マッチさせるリストから 1つづつ取り出し message にマッチ(/合致)する場所が存在するかを調べ 存在した場合(存在しない場合 -1 が返される) animation_name のアニメーションを起動する
-----
存在しない場合 アニメーションを停止する
Posted by walkinglint at 15:52│Comments(0)
│walking のスクリプティング講座