汎用ポーズチェンジスクリプト

概要

  • 椅子に入れたポーズをタッチ→ダイアログからチェンジするスクリプトです
  • 途中でポーズを追加したり削除したりしても、スクリプトを編集しなおす必要はありません
  • タッチしにくいポーズボールには不向きです
  • ポーズは理論上、無限に入れることができます

ソースコード

posechange.lsl
// changepose.lsl :: 2008-08-06
 
// Sit Position
uuSetSitPosition(){
    vector sit_pos = <0.0, 0.0, 0.1>;
    vector sit_rot = <0.0, 0.0, 0.0>;
    llSitTarget(sit_pos, llEuler2Rot(sit_rot * DEG_TO_RAD));
}
 
// Pose
integer pose_num;
integer now_pose_num = 1;
string now_pose_name;
list pose_name;
list button = ["<<", "UnSit", ">>", "4", "5", "6", "1", "2", "3"];
 
uuSetPoseNum(){
    pose_num = llGetInventoryNumber(INVENTORY_ANIMATION);
    llSay(0, (string)pose_num + "個のポーズをセットしました");
}
 
uuLoadPose(string str){
    if (str == "<<"){
        now_pose_num -= 6;
        if (now_pose_num < 1){
            now_pose_num += pose_num;
        }
    }else if (str == ">>"){
        now_pose_num += 6;
        if (now_pose_num > pose_num){
            now_pose_num -= pose_num;
        }
    }
    pose_name = [];
    integer i;
    integer g;
    for (i=now_pose_num; i<now_pose_num+6; i++){
        g = i;
        if (g > pose_num){
            g -= pose_num;
        }
        pose_name += llGetInventoryName(INVENTORY_ANIMATION, g - 1);
    }
}
 
uuStartPose(){
    now_pose_name = llList2String(pose_name, 0);
    llStartAnimation(now_pose_name);
    llStopAnimation("sit");
}
 
uuChangePose(string num){
    string new_pose_name = llList2String(pose_name, (integer)(num) - 1);
    llStartAnimation(new_pose_name);
    llStopAnimation(now_pose_name);
    now_pose_name = new_pose_name;
}
 
// Interface
integer d_ch = -99999;
integer handle;
float listen_remove = 60.0;
 
uuListen(integer flug){
    if (flug){
        handle = llListen(d_ch, "", llAvatarOnSitTarget(), "");
        llSetTimerEvent(listen_remove);
    }else{
        llSetTimerEvent(0.0);
        llListenRemove(handle);
    }
}
 
uuDialog(){
    string pose_list;
    integer i;
    for (i=0; i<6; i++){
        pose_list += (string)(i + 1) + " : " + llList2String(pose_name, i) + " \n";
    }
    uuListen(TRUE);
    llDialog(llAvatarOnSitTarget(), pose_list, button, d_ch);
}
 
// Flow
default{
    state_entry(){
        uuSetSitPosition();
        uuSetPoseNum();
        uuLoadPose("");
    }
 
    changed(integer change){
        if (change & CHANGED_INVENTORY){
            uuSetPoseNum();
        }else if (change & CHANGED_LINK && llAvatarOnSitTarget() != NULL_KEY){
            llRequestPermissions(llAvatarOnSitTarget(), PERMISSION_TRIGGER_ANIMATION);
        }
    }
 
    run_time_permissions(integer perm){
        if (perm & PERMISSION_TRIGGER_ANIMATION){
            uuStartPose();
        }
    }
 
    touch_start(integer total_number){
        if (llDetectedKey(0) == llAvatarOnSitTarget()){
            uuDialog();
        }else{
            llInstantMessage(llDetectedKey(0), "Sit down please before touching.");
        }
    }
 
    listen(integer channel, string name, key id, string message){
        uuListen(FALSE);
        if (message == ">>" || message == "<<"){
            uuLoadPose(message);
            uuDialog();
        }else if (message == "UnSit"){
            llUnSit(llAvatarOnSitTarget());
        }else{
            uuChangePose(message);
        }
    }
 
    timer(){
        uuListen(FALSE);
    }
}

スクリプトの説明・設定方法

Sit Positionの設定

// Sit Position
uuSetSitPosition(){
    vector sit_pos = <0.0, 0.0, 0.1>;
    vector sit_rot = <0.0, 0.0, 0.0>;
    llSitTarget(sit_pos, llEuler2Rot(sit_rot * DEG_TO_RAD));
}

位置

次の数値を編集します。単位は「メートル」です。

vector sit_pos = <0.0, 0.0, 0.1>;

全ての数値を「0.0(または0)」にすると、llAvatarOnSitTarget()関数で座ったアバターのUUIDを取得できないというLSLの仕様がありますので、注意してください。

角度

次の数値を編集します。単位は「度」です。

vector sit_rot = <0.0, 0.0, 0.0>;

各ユーザ関数について

uuSetSitPosition()

座る位置と角度を設定します。

uuSetSitPosition(){
    vector sit_pos = <0.0, 0.0, 0.1>;
    vector sit_rot = <0.0, 0.0, 0.0>;
    llSitTarget(sit_pos, llEuler2Rot(sit_rot * DEG_TO_RAD));
}

uuSetPoseNum()

コンテンツ内にいくつのポーズが存在するかを取得し、変数「pose_num」に格納します。

uuSetPoseNum(){
    pose_num = llGetInventoryNumber(INVENTORY_ANIMATION);
    llSay(0, (string)pose_num + "個のポーズをセットしました");
}

uuLoadPose(string str)

コンテンツ内にあるポーズの中から、ダイアログに表示するために6つのポーズ名を取得し、変数「pose_name」に格納します。

uuLoadPose(string str){
    if (str == "<<"){
        now_pose_num -= 6;
        if (now_pose_num < 1){
            now_pose_num += pose_num;
        }
    }else if (str == ">>"){
        now_pose_num += 6;
        if (now_pose_num > pose_num){
            now_pose_num -= pose_num;
        }
    }
    pose_name = [];
    integer i;
    integer g;
    for (i=now_pose_num; i<now_pose_num+6; i++){
        g = i;
        if (g > pose_num){
            g -= pose_num;
        }
        pose_name += llGetInventoryName(INVENTORY_ANIMATION, g - 1);
    }
}

llGetInventoryNumber(integer type)
 この関数は、コンテンツ内に10個のアイテムがあると「10」という数値を返します。すなわち、1から始まる整数値ということです。

llGetInventoryName(integer type, integer number)
 この関数の「number」に指定する数値は0から始まる整数値です。例えば、「10番目」のアイテム名を調べたければ「9」を指定しなければいけません。

 uuLoadPose内で「1を引いて調整している」箇所が分かりますか?

uuStartPose()

座った直後にポーズを再生します。

uuStartPose(){
    now_pose_name = llList2String(pose_name, 0);
    llStartAnimation(now_pose_name);
    llStopAnimation("sit");
}

uuChangePose(string num)

ダイアログからのコマンドをstring numで受け取り、それに対応したポーズを再生します。

uuChangePose(string num){
    string new_pose_name = llList2String(pose_name, (integer)(num) - 1);
    llStartAnimation(new_pose_name);
    llStopAnimation(now_pose_name);
    now_pose_name = new_pose_name;
}

uuListen(integer flug)

リスンのON / OFFを切り替えます。

uuListen(integer flug){
    if (flug){
        handle = llListen(d_ch, "", llAvatarOnSitTarget(), "");
        llSetTimerEvent(listen_remove);
    }else{
        llSetTimerEvent(0.0);
        llListenRemove(handle);
    }
}

uuDialog()

ダイアログを表示します。

uuDialog(){
    string pose_list;
    integer i;
    for (i=0; i<6; i++){
        pose_list += (string)(i + 1) + " : " + llList2String(pose_name, i) + " \n";
    }
    uuListen(TRUE);
    llDialog(llAvatarOnSitTarget(), pose_list, button, d_ch);
}
最終更新: 2010年11月08日 20 : 40 by arz Nitely
http://arzNitely.com/lsl/sample/pose-change.html

Copyright 2007-2010 ©arzNitely.com all right reserved

www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0