Site search

Google
WWW を検索 backup-beta.blogspot.com を検索

2009年8月14日金曜日

低プリムの椅子に決まった人数座れるスクリプト

暑い時期はボケーっとして物作りもする気の起きない千尋です^^;

今回はスカルプで作った低プリムのソファーとかに設定した人数座れるような簡単なスクリプトを考えてみました。。。ずっとソファー作りたいって思ってるんですけどねw

座れる人数分(座席数)のリストにアバターのキーを保存するようにして、空席にはNULL_KEYを入れておくようにしてます。2人用で書いてますが人数を増やす場合は、座る位置のベクトル値を増やしてくださいね。


// 1プリムの定位置に2人座れる
list pos=[<0.4,-0.5,0.4>, <0.4,0.5,0.4>];  // 座る位置のリスト(1人目、2人目)
list av;  // 座ってるアバターのキーリスト用
vector ang=<0,0,0>;  // 座った角度

default
{
    state_entry()
    {
        llSitTarget(<0,0,0.5>, llEuler2Rot(ang*DEG_TO_RAD));  // 座る位置の初期値
        integer i;
        for (i=0; i < llGetListLength(pos); i++)
        {  // キーリストに座席分のNULL_KEYを設定
            av+=[NULL_KEY];
        }
    }

    changed(integer change)
    {
       if (change & CHANGED_LINK)
       {  // リンクが変化したら
            integer i=llGetNumberOfPrims();  // リンクしてるプリムの数
            key id=llGetLinkKey(i);  // 座った(リンクした)アバターのキー取得
            if (id) {
                integer j=llListFindList(av,[NULL_KEY]);  // 空席チェック
                if (~j) {  // 空いてたら
                    av=llListReplaceList(av,[id],j,j);  // アバターのキーをセット
                    vector v=llList2Vector(pos,j);  // 空いてた席の座る位置
                    v.z+=0.35;  // Z方向に0.35加算
                    // 座った位置を移動
                    llSetLinkPrimitiveParams(i,[PRIM_POSITION,v, PRIM_ROTATION,ZERO_ROTATION/llGetRot()*llEuler2Rot(ang*DEG_TO_RAD)]);
                }
                else {  // 空席がないとき
                    if (llListFindList(av,[id]) < 0) llUnSit(id);  // キーリストになかったら立たせる
                }
            }
            list l;
            for (i; i > 1; i--) {  // 子プリムのキーをリストアップ
                l+=[llGetLinkKey(i)];
            }
            for (i=0; i < llGetListLength(av); i++) {
                // 座ってるアバターのキーリストと比較して、一致しないキーをリストから削除
                id=llList2Key(av,i);
                if (llListFindList(l,[id]) < 0) av=llListReplaceList(av,[NULL_KEY],i,i);
            }
        }
    }
}

ポーズさせる部分はありませんが、座った位置を移動させた直後にllRequestPermissionsを追加して、アニメーションさせるイベントを入れるとかしたらいいかなって思います。

19時5分頃追記: シェイプ変えて調べてみたんですが、llSitTargetとllSetLinkPrimitiveParamsのPRIM_POSITIONはアバターが座ったとき体格に関係なくZ方向に0.35の差があるみたいなんですね。それで0.35足してから移動させてます。

0 件のコメント:

コメントを投稿