Second Lifeで気に入ったアイテムの記録です あ、ウソです。スクリプトとか他のことも書いてます

2009/05/02

Link系の関数をもっと使ってみるの2

さて、この名前とリンク番号ですが、
この対応は、リンク順を変えた時しか変わりません。
※当たり前のようですが、AVが座った場合を考えると
 よく考えられているなと思います。


ということは、先に名前からリンク番号を取得しておいて
タッチした時には、リンク番号だけで判断すればいいのではないでしょうか。

では、スクリプトリセット時にprim名からリンク番号を取得しておいて
それを使って分岐する例です。

integer gl_i_primA = -1;
integer gl_i_primB = -1;

integer f_init()
{
gl_i_primA = gl_i_primB = -1;
integer i_lnkno = llGetNumberOfPrims();
string s_primnm = "";
for (;i_lnkno>=2;--i_lnkno){
s_primnm = llToUpper(llGetLinkName(i_lnkno));
if (s_primnm=="A"){
gl_i_primA = i_lnkno;
}else if (s_primnm=="B"){
gl_i_primB = i_lnkno;
}
}
if(gl_i_primA<0)
return FALSE;
if(gl_i_primB<0)
return FALSE;
return TRUE;
}

default
{
state_entry()
{
if(f_init()==FALSE)
llOwnerSay("設定エラー");
}
touch_start(integer total_number)
{
integer i_lnkno = llDetectedLinkNumber(0);
if(i_lnkno==gl_i_primA){
llOwnerSay("A");
}else if(i_lnkno==gl_i_primB){
llOwnerSay("B");
}else{
llOwnerSay("ELSE");
}
}
}


一応、求める名前が全てない場合は、エラーとするようにしています。
この処理にはいくつか問題があるかもしれませんが
基本の考え方は、こんなふうになると思います。
※no modアイテムとして配布するような場合は
 これでも問題ないかもしれません。


ひとまず、これで各primにスクリプトを仕込まなくても
ルートに1つスクリプトがあれば、処理ができることがわかります。

リンクprimがいっぱいあれば、それなりに初期化に時間がかかります。
 ※リンクできる上限までリンクして、試してみてください。
初期化時の時間が気になるなら、
必要な名前のprimが出揃ったらループを中断するようにしましょう。
また、同じ名前のprimをうっかりリンクした場合などの
エラーチェックもあってもいいかもしれません。

他にも製作過程では、リンクなんてしょっちゅう変えるので
Changedイベントを設定しておくのもありでしょう。

    changed( integer change )
{
if (change & CHANGED_LINK){
if(f_init()==FALSE)
llOwnerSay("設定エラー");
//llResetScript()でもいい
}
}

※リンクを変えなくてもAVが座った時にも、このイベントは発生します。

今回の例では、integerの変数にリンク番号を格納しましたが
押されたprimに対してメッセージを返すだけならListを使うことも考えられます。

作りたい処理にあわせて、工夫してみると楽しいです。

また、touch系の関数も組み合わせると
タッチされた子primの面や位置なども取得できます。

3に続く

0 コメント: