2007年12月18日
回転マンタ・スクリプトの総括(2)
さて前回の続きです。
3.on_rezイベント
on_rezイベントは目新しいイベントではありません。今までも必ず使っていたイベントです。
これはRezした時に発生するイベントで、良く使う使い方としては、次のような物です。
on_rez(integer param)
{
llResetScript();
}
これはRezした時にスクリプトをリセットさせるものです。以前も書いたのですが、スクリプトの一番最初に、オーナーのUUIDを取得したり、各種変数の初期化をしたりする事が多くあります。それらを最初からセットし直したい場合等は、このイベントを使って、必ず最初から実行するようにさせています。
今回は、このような単純な使い方では無く、回転軸オブジェクトからRezされた時に行う処理として使っています。
以下に実際のスクリプトを示します。
float radius;
float def_size = 3.0;
integer size_no;
list scale_p = [1.5,3.0,4.5,6.0];
float f;
integer chanel = -3;
integer i;
integer j;
default
{
on_rez(integer param){
if(param>0){
size_no = (integer)llGetSubString((string)param, 0, 0)-1;
radius = (float)llGetSubString((string)param, 1, 2);
if(size_no!=1){
f = llList2Float(scale_p,size_no)/def_size;
llMessageLinked( LINK_SET, 90, (string)f, NULL_KEY);
}
llSleep(0.5);
j=llFloor(radius/10.0);
for(i=1;i<=j;i++){
llSetPos(llGetPos()+<10.0,0.0,0.0>);
}
llSetPos(llGetPos()+<(float)radius-j*10,0.0,0.0>);
llShout(chanel,llGetKey());
}
}
}
これはon_rezイベントだけのスクリプトで、マンタがRezされた時のみ実行されます。
最初のif文はRez時に引き渡されたパラメータ内容のチェックです。parm=0と言う事は、オブジェクトからRezされたのでは無く、単独で持ち物からRezされた場合を意味します。
もし持ち物からRezされた場合は何もしません。(これは制作時の為の条件です。販売時には持ち物からRezされる事は有り得ませんから)
parm>0と言う事は、何らかの値が引き渡されていると言う事ですから、その値の1桁目をサイズNOとして切り出し、残りの2桁をリンク距離として切り出しています。
そして、取得したサイズNOとリストで保持しているサイズ表から、標準(マンタ本体が3m)との比率を求めて、その結果をマンタの各パーツへとリンクメッセージで伝達しています。
勿論各パーツには、このメッセージを受け取って、自分のサイズとマンタ本体からの相対位置調整を行うスクリプトが入っています。
更にマンタは0.5秒待って、指定されたリンク距離へと移動をします。0.5秒待つ理由は、各パーツのサイズ調整が揃わないケースが発生したからです。
ここが以前暴走して問題になった箇所で、llSetPosで一回に移動できる距離が10mだったので、指定が25mとかの場合は、10m単位で2回移動させ、その後端数の5m移動するような仕組みが必要でした。
その部分がforループとループを抜けた後に出てくるllSetPosの部分です。
そして最後に自分のUUIDを取得して、llShoutでメッセージを飛ばしています。勿論相手は自分をRezした回転の中心軸オブジェクトに対してです。
llShoutを使っているのはllSayが20mまでとなっており、リンク距離が20m以上になっていた場合、声が届かないからです。
llShoutなら100mまで声が届きますので。
この部分では、まだ未確認の問題も残っています。
それは、進入禁止とかプリム設置制限一杯の土地にマンタが移動しようとして、侵入できずにエラーが出た場合です。
その場で止まるだけなら問題は無いですが、一応確認は必要だと思っています。
それと、この場合はリンクできたとしても、設定距離に達していないので、実際の遊泳半径を求めて、設定値を変えておく方が本当は良いのでしょうね。そこまではまだ対応していないです。><
うー。。。なんやかやと面倒じゃのー。
3.on_rezイベント
on_rezイベントは目新しいイベントではありません。今までも必ず使っていたイベントです。
これはRezした時に発生するイベントで、良く使う使い方としては、次のような物です。
on_rez(integer param)
{
llResetScript();
}
これはRezした時にスクリプトをリセットさせるものです。以前も書いたのですが、スクリプトの一番最初に、オーナーのUUIDを取得したり、各種変数の初期化をしたりする事が多くあります。それらを最初からセットし直したい場合等は、このイベントを使って、必ず最初から実行するようにさせています。
今回は、このような単純な使い方では無く、回転軸オブジェクトからRezされた時に行う処理として使っています。
以下に実際のスクリプトを示します。
float radius;
float def_size = 3.0;
integer size_no;
list scale_p = [1.5,3.0,4.5,6.0];
float f;
integer chanel = -3;
integer i;
integer j;
default
{
on_rez(integer param){
if(param>0){
size_no = (integer)llGetSubString((string)param, 0, 0)-1;
radius = (float)llGetSubString((string)param, 1, 2);
if(size_no!=1){
f = llList2Float(scale_p,size_no)/def_size;
llMessageLinked( LINK_SET, 90, (string)f, NULL_KEY);
}
llSleep(0.5);
j=llFloor(radius/10.0);
for(i=1;i<=j;i++){
llSetPos(llGetPos()+<10.0,0.0,0.0>);
}
llSetPos(llGetPos()+<(float)radius-j*10,0.0,0.0>);
llShout(chanel,llGetKey());
}
}
}
これはon_rezイベントだけのスクリプトで、マンタがRezされた時のみ実行されます。
最初のif文はRez時に引き渡されたパラメータ内容のチェックです。parm=0と言う事は、オブジェクトからRezされたのでは無く、単独で持ち物からRezされた場合を意味します。
もし持ち物からRezされた場合は何もしません。(これは制作時の為の条件です。販売時には持ち物からRezされる事は有り得ませんから)
parm>0と言う事は、何らかの値が引き渡されていると言う事ですから、その値の1桁目をサイズNOとして切り出し、残りの2桁をリンク距離として切り出しています。
そして、取得したサイズNOとリストで保持しているサイズ表から、標準(マンタ本体が3m)との比率を求めて、その結果をマンタの各パーツへとリンクメッセージで伝達しています。
勿論各パーツには、このメッセージを受け取って、自分のサイズとマンタ本体からの相対位置調整を行うスクリプトが入っています。
更にマンタは0.5秒待って、指定されたリンク距離へと移動をします。0.5秒待つ理由は、各パーツのサイズ調整が揃わないケースが発生したからです。
ここが以前暴走して問題になった箇所で、llSetPosで一回に移動できる距離が10mだったので、指定が25mとかの場合は、10m単位で2回移動させ、その後端数の5m移動するような仕組みが必要でした。
その部分がforループとループを抜けた後に出てくるllSetPosの部分です。
そして最後に自分のUUIDを取得して、llShoutでメッセージを飛ばしています。勿論相手は自分をRezした回転の中心軸オブジェクトに対してです。
llShoutを使っているのはllSayが20mまでとなっており、リンク距離が20m以上になっていた場合、声が届かないからです。
llShoutなら100mまで声が届きますので。
この部分では、まだ未確認の問題も残っています。
それは、進入禁止とかプリム設置制限一杯の土地にマンタが移動しようとして、侵入できずにエラーが出た場合です。
その場で止まるだけなら問題は無いですが、一応確認は必要だと思っています。
それと、この場合はリンクできたとしても、設定距離に達していないので、実際の遊泳半径を求めて、設定値を変えておく方が本当は良いのでしょうね。そこまではまだ対応していないです。><
うー。。。なんやかやと面倒じゃのー。
llDetectedTouchST
llAddToLandPassList
【注意】Bulk Permissions機能は使っては駄目!
HTTP-INを使ってみた。
オブジェクトへの指示
ペットを作るには(6)
llAddToLandPassList
【注意】Bulk Permissions機能は使っては駄目!
HTTP-INを使ってみた。
オブジェクトへの指示
ペットを作るには(6)
Posted by Gonbe Shan at 12:34│Comments(0)
│スクリプトのお勉強メモ