ソラマメブログ
< 2024年05月 >
S M T W T F S
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  
Mail

2007年07月30日

イスに座る立つを制御するモジュール(1)

sitModule links
イスに座る立つを制御するモジュール(1)

イス(プリム)に座ったアバタを制御するモジュールを作りました。

・アバタが座った時にイベントが取れます。
・アバタがたった時にイベントが取れます。
・座っているアバタを立たせる事ができます

・・・そう書くとなんだか意味がなさそうですが…けっこう便利です。
子プリムにたくさんのアバタが座っているとき、
全員のキー値を管理でき、破綻なく制御できるからです。

また、椅子に複数人で座ってみると(2)の最後のほうに書いたように
リンクされたプリムそれぞれにいくつもllSitTargetを設定すると
CHANGED_LINKイベントがちょっと変な挙動をします。
その変な挙動を隠蔽して使いやすくする意味もあってモジュールにしました。

ソースはエントリーのお尻に。
基本的に子プリム達にこのモジュールをくっつけて
親プリムからまとめて制御する使い道を想定しています。
が、同じプリムにモジュールと制御プログラムを書いたり、
親子構造がない1プリムで構成のオブジェクトに
モジュールをくっつけても動作はします。

渡されるイベントの説明

◆アバタがプリムに座ったとき
linkMessage経由で"harayoki.event.avatarSit"が渡され、
キー値にそのアバタIDが渡されます

◆アバタがプリムから立った時
linkMessage経由で"harayoki.event.avatarUnSit"が渡され、
キー値にそのアバタIDが渡されます
(これでちょっとscript記述が楽になります。普段はchangedイベント時にアバタのキー値は取れないので)

使用できる命令

◆指定アバタをプリムから立たせる(プリムリンク番号指定)
harayoki.avatarUnSitをlinkMessage経由で送ります。
その際、リンク番号をllMessageLinkedの引数で指定してください
ex)
llMessageLinked(linkNum,0,"harayoki.avatarUnSit",NULL_KEY);

◆指定アバタをプリムから立たせる(アバタキー値指定)
harayoki.avatarUnSitをlinkMessage経由で送ります。
その際キー値を引数に含めてください。
ex)
llMessageLinked(LINK_SET,0,"harayoki.avatarUnSit",caade896-b36c-4480-aa50-8d5dc5f00ddc);
LINK_SET部分は状況に応じて変更

◆アバタ全員をプリムから立たせる
harayoki.avatarUnSitをlinkMessage経由で送ります。
その際、キー値をNULL_KEYにしてください。
ex)
llMessageLinked(LINK_SET,0,"harayoki.avatarUnSit",NULL_KEY);
LINK_SET部分は状況に応じて変更


※使用サンプルはまた次エントリーにて。


SitAvManagerModuleソース
// SitAvManagerModule ver 1.00
//since 2007/7/29
integer debug = FALSE;
Trace(string s){
if(debug) llOwnerSay(s);
}
string MODULE_NAME ="SitAvManagerModule";
string EVENT_NAME1 = "harayoki.event.avatarSit";
string EVENT_NAME2 = "harayoki.event.avatarUnSit";
string EVENT_SEP = " ";
string COMMAND_NAME1 = "harayoki.avatarUnSit";
integer ARGUMNET_LENGTH1 = 0;
string COMMAND_NAME2= "harayoki.setSitEnabled";
integer ARGUMNET_LENGTH2 = 0;
string ARGUMENT_SEP = " ";
list MyString2List(string s,string sep,integer len){
list res = [];
list l = llParseString2List(s,[sep],[]);
integer listLen = llGetListLength(l);
integer i;
if(len<=0) return res;
if(listLen<len) for(i=0;i<len-listLen;i++) l += [""];
for(i=0;i<-1+len;i++) res += [llList2String(l,i)];
res += llDumpList2String(llList2List(l,i,-1),sep);
return res;
}
integer IsMyCommand1(string s){
//return (llSubStringIndex(s+ARGUMENT_SEP,COMMAND_NAME1)==0);
return (llSubStringIndex(s,COMMAND_NAME1)==0);
}
integer IsMyCommand2(string s){
//return (llSubStringIndex(s+ARGUMENT_SEP,COMMAND_NAME2)==0);
return (llSubStringIndex(s,COMMAND_NAME2)==0);
}
list GetArguments1(string s){
return MyString2List(s,ARGUMENT_SEP,ARGUMNET_LENGTH1+1);
}
list GetArguments2(string s){
return MyString2List(s,ARGUMENT_SEP,ARGUMNET_LENGTH2+1);
}
DispatchEvent1(key av){
string s = EVENT_NAME1;//+EVENT_SEP;
llMessageLinked(LINK_SET,0,s,av);
}
DispatchEvent2(key av){
string s = EVENT_NAME2;//+EVENT_SEP;
llMessageLinked(LINK_SET,0,s,av);
}
UnSitAvatar(key av){
Trace("UnSitAvatar "+(string)av);
if(!bSitting) return;
if(av==NULL_KEY || av==sittingAvatar){
llUnSit(sittingAvatar);//CHANGED_LINK invoke
}
}
SetSitEnabled(integer b){
Trace("SetSitEnabled "+(string)b);
//mijissou
if(b){
}else{
}
}
integer bSitting = FALSE;
key sittingAvatar = NULL_KEY;
OnSit(key av){
if(!bSitting){
bSitting = TRUE;
sittingAvatar = av;
Trace("OnSit "+llKey2Name(sittingAvatar));
DispatchEvent1(sittingAvatar);
}
}
OnUnSit(){
if(bSitting){
bSitting = FALSE;
Trace("OnUnSit "+llKey2Name(sittingAvatar));
DispatchEvent2(sittingAvatar);
sittingAvatar = NULL_KEY;
}
}
integer initialized = FALSE;
Init(){
Trace(MODULE_NAME+" Initialized.");
if(initialized) return;
initialized = TRUE;
key av = llAvatarOnSitTarget();
if(av!=NULL_KEY) llUnSit(av);
}
default{
state_entry(){
Init();
}
on_rez(integer num){
llResetScript();
}
link_message(integer sender,integer num,string mes,key id){
if(IsMyCommand1(mes)){
UnSitAvatar(id);
}else if(IsMyCommand2(mes)){
SetSitEnabled(num);
}
}
changed(integer che){
if(che & CHANGED_LINK){
key av = llAvatarOnSitTarget();
if(av!=NULL_KEY){
OnSit(av);
}else{
OnUnSit();
}
}
}
}


同じカテゴリー(sit動作の制御)の記事画像
座り立ち制御モジュールver.2 サンプル2
座り立ち制御モジュールver.2.01
座り立ち制御モジュールver.2 サンプル
座り立ち制御モジュールver.2
イスに座る立つを制御するモジュール(2)サンプル
同じカテゴリー(sit動作の制御)の記事
 座り立ち制御モジュールver.2 サンプル2 (2007-10-30 15:45)
 座り立ち制御モジュールver.2.01 (2007-10-30 13:04)
 座り立ち制御モジュールver.2 サンプル (2007-10-30 10:59)
 座り立ち制御モジュールver.2 (2007-10-30 09:36)
 イスに座る立つを制御するモジュール(2)サンプル (2007-07-30 03:59)
Posted by harayoki at 02:20│Comments(0)sit動作の制御
 
<ご注意>
書き込まれた内容は公開され、ブログの持ち主だけが削除できます。