ソラマメブログ
< 2024年04月 >
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        
Mail

2007年12月29日

多人数制御ポーズボール

多人数制御ポーズボール

mojikoさんのコメント(MakapuさんのLSLBBSでの質問)を受けて、
大分遅れましたが
1つのプリムでたくさんの人数を制御するポーズボール(かな?)を作りました。

多人数制御ポーズボール
プリムにすわる度に、違う位置でアバタがポーズを取っていきます。
人数は重ならなければメモリが許すまでOKです。

ポーズボールが消えるような処理は書いてないのと
時間がなかったので3人以上で検証できてません。
バグあるかもですが、まあ、参考にはなるかと。

多人数制御ポーズボール
汎用的に使えるようにしました。
プリムの中に必要なだけのアニメとノートカードを用意します。

ノートカードには
"1人目のアニメ名"
"1人目のポジション(相対位置)"
"1人目の回転角(度)"
"2人目のアニメ名"
"2人目のポジション(相対位置)"
"2人目の回転角(度)"
:
"n人目のアニメ名"
"n人目のポジション(相対位置)"
"n人目の回転角(度)"

を羅列します。
アニメ名は重複があっても良いです。
アバタ位置はそれぞれがかぶらないようにしないと、座る事ができない事があります。
回転角はわからなければ<0,0,0>でいいです。

あー…ノートカードに記述したn人より多いアバタがsitした時の
判別を書いてなかった…エラーになるかも。
しかし直してる余裕がないので、とりあえずコレで。
とりあえず、下記の場所にひっそり置いてあります。
フルパ(のつもり)なので自由に持っていってください。
多人数制御ポーズボール
http://slurl.com/secondlife/Jabara%20Land/54/137/28

harayoki'sPoseBallソース
(別途座り立ち制御モジュールver.2を使っています。)
integer debug = FALSE;
Trace(string s){
//debug = TRUE;
if(debug) llOwnerSay(s);
}
string EVENT_SIT = "harayoki.event.avatarSit";
string EVENT_UNSIT = "harayoki.event.avatarUnSit";
//~ string COMMAND_UNSIT = "harayoki.avatarUnSit";
//~ string COMMAND_SITENABLED= "harayoki.setSitEnabled";
string COMMAND_RESET= "harayoki.sitModuleReset";
//~ string COMMAND_SETAVPOS= "harayoki.setAvatarPos";
//~ string COMMAND_SETAVROT= "harayoki.setAvatarRot";
string COMMAND_SETAVPOSROT= "harayoki.setAvatarPosAndRot";
//~ UnSitAllAvatar(){
//~ Trace("UnSitAllAvatar");
//~ llMessageLinked(LINK_SET,0,COMMAND_UNSIT,NULL_KEY);//NULL_KEY means that target is all avatars.
//~ }
//~ UnSitAvatarByKey(key id){
//~ Trace("UnSitAvatarByKey "+(string)id);
//~ llMessageLinked(LINK_THIS,0,COMMAND_UNSIT,id);
//~ }
//~ SetEnabled(integer b){
//~ //Trace("SetEnabled "+llList2String(["FALSE","TRUE"],b));
//~ llMessageLinked(LINK_THIS,b,COMMAND_SITENABLED,NULL_KEY);
//~ }
//~ SetAvPos(key id,vector v){
//~ //Trace("SetAvPos "+llKey2Name(id)+" "+(string)v);
//~ llMessageLinked(LINK_SET,0,COMMAND_SETAVPOS+" "+(string)v,id);
//~ }
//~ SetAvRot(key id,rotation r){
//~ //Trace("SetAvRot "+llKey2Name(id)+" "+(string)r);
//~ llMessageLinked(LINK_SET,0,COMMAND_SETAVROT+" "+(string)r,id);
//~ }
SetAvPosAndRot(key id,vector v,rotation r){
//Trace("SetAvPosAndRot "+llKey2Name(id)+" "+(string)v+" "+(string)r);
string arguments = (string)v+"|"+(string)r;//注意! | がセパレータ
llMessageLinked(LINK_SET,0,COMMAND_SETAVPOSROT+" "+arguments,id);
}
SetText(string s){
llSetText(s,<1,1,1>,1);
}
ReadNextLine(){
SetText("reading notecard "+noteCard+" line:"+(string)lineNum);
query = llGetNotecardLine(noteCard, lineNum);
}
string GetAnim(integer index){
index *= 3;
return llList2String(animData,index);
}
vector GetAvPos(integer index){
index *= 3;
index ++;
return llList2Vector(animData,index);
}
rotation GetAvRot(integer index){
index *= 3;
index +=2;
return llList2Rot(animData,index);
}
AddAvatar(key id){
integer index = llListFindList(avList,[id]);
if(index!=-1){
llWhisper(0,"error!");
MainInit();
return;
}
index = llListFindList(avList,[NULL_KEY]);
avList = llListReplaceList(avList,[id],index,index);
Trace("AddAvatar "+llList2CSV(avList));
anim = GetAnim(index);
vector v= GetAvPos(index);
rotation r= GetAvRot(index);
SetAvPosAndRot(id,v,r);
}
RemoveAvatar(key id){
integer index = llListFindList(avList,[id]);
if(index==-1){
llWhisper(0,"error!");
MainInit();
return;
}
avList = llListReplaceList(avList,[NULL_KEY],index,index);
Trace("RemoveAvatar "+llList2CSV(avList));
}
Init(){
Trace("Init");
animNum = 0;
animData = [];
lineNum = 0;
noteCard = llGetInventoryName(INVENTORY_NOTECARD,0);
}
MainInit(){
Trace("MainInit");
SetText("");
avList= [];
integer i;
for(i=0;i<animNum;i++){
avList += [NULL_KEY];
}
llMessageLinked(LINK_SET,0,COMMAND_RESET,NULL_KEY);//全員立たせる
}

string noteCard;
integer lineNum = 0;
key query;
list animData;
integer animNum = 0;
list avList;
string anim = "";
default{
state_entry(){
Init();
ReadNextLine();
}
dataserver(key id,string data){
if (id == query) {
if (data != EOF) {
integer i;
i = lineNum % 3;
if(i==0){
animData += [data];//animation name
}else if(i==1){
animData += [(vector)data];//avatar position
}else if(i==2){
animData += [llEuler2Rot((PI/180)*(vector)data)];//avatar rotation
}
++lineNum;
ReadNextLine();
}else{
animNum = (lineNum+1) / 3;
SetText("anim number :" +(string)animNum);
llSleep(1.0);
state main;
}
}
}
changed(integer ch){
if(ch & CHANGED_INVENTORY){
llResetScript();
}
}
}
state main{
state_entry(){
MainInit();
}
changed(integer ch){
if(ch & CHANGED_INVENTORY){
llResetScript();
}
}
link_message(integer sender,integer num,string mes,key id){
if(mes==EVENT_SIT){
llRequestPermissions(id,PERMISSION_TRIGGER_ANIMATION);
AddAvatar(id);
}else if(mes==EVENT_UNSIT){
RemoveAvatar(id);
}
}
run_time_permissions(integer perm){
if(perm & PERMISSION_TRIGGER_ANIMATION){
llStartAnimation(anim);
}
}
}


タグ :lsl研究

同じカテゴリー(椅子(sit)の挙動)の記事画像
くるくるイス3
くるくるイス2
くるくるイス
子プリムといっしょにアバタを動かせない
好きな場所に座らせてみる
phantomイスの変な挙動
同じカテゴリー(椅子(sit)の挙動)の記事
 くるくるイス3 (2007-10-30 06:27)
 くるくるイス2 (2007-10-30 04:17)
 くるくるイス (2007-10-29 13:43)
 子プリムといっしょにアバタを動かせない (2007-08-07 10:45)
 好きな場所に座らせてみる (2007-08-06 07:41)
 椅子に複数人で座ってみると(3) (2007-07-30 04:40)
この記事へのコメント
お礼が送れてしまい、申し訳ございません、
お忙しい中、本当にありがとうございました。

そ、、、それと、多人数制御ポーズボール中のスクリプトとポーズにno copy no trans no modがあるようでお持ち帰り不可でございましたTT 

またコッソリ覗きに行こうと思います
m(_ _)m
Posted by mojiko at 2008年01月07日 16:01
とりあえずno copy no trans no mod直しました!
すいません!
Posted by harayoki at 2008年01月09日 23:57
 
<ご注意>
書き込まれた内容は公開され、ブログの持ち主だけが削除できます。