2008年10月22日水曜日

タイピングスクリプト添削

前のエントリーの時に、アバターがタイピングしているときだけ指定のアニメを動かして、スクリプトが入っているオブジェのアルファを操作するLSLを貰ったのですが、気になる点があったので添削してみますw
// アバターがタイピングしているときだけオブジェクトを見せてつつアバターにアニメーションさせます

// アニメの名前
string TypeAnim = "typing";

default
{
    attach(key agent)
    {
        // アバターがオブジェクトを装着した
        if (agent != NULL_KEY) {
            // パーミッションを取得
            llRequestPermissions(agent, PERMISSION_TRIGGER_ANIMATION);
        }
    }
    
    run_time_permissions(integer parm)
    {
        // パーミッションが取得できた
        if(parm == PERMISSION_TRIGGER_ANIMATION)
        {
            // タイマー開始
            llSetTimerEvent(0.1);
        }
    }
    
    timer()
    {
        // アバターの状態を取得
        integer Status = llGetAgentInfo(llGetOwner());
        
        // アバターがタイピング(チャット入力)中
        if (Status & AGENT_TYPING){
            
            // オブジェクトを見えるように
            llSetLinkAlpha(LINK_SET,1.0,ALL_SIDES);
            // アニメを開始
            llStartAnimation(TypeAnim);
            
        }
        // アバターがタイピングをやめた
        else{
            // オブジェクトを隠す
            llSetLinkAlpha(LINK_SET,0.0,ALL_SIDES);
            // アニメを停止
            llStopAnimation(TypeAnim);
            
        }
    }
}

きになった点は、タイマーで0.1秒ごとにアバターをチェックしていますが、前にチェックしたときの状態を持っていないため、毎回llSetLinkAlphaとllStart/StopAnimationを実行しているところ。
グローバル変数でedgeという変数を用意して、前回の情報をとっておくようにしました。

追記:下にさらに修正したものがあります

string TypeAnim = "typing";
key owner;
integer edge = 0;

default
{
    attach(key agent)
    {
        if ( agent != NULL_KEY ) {
            owner = llGetOwner();
            llRequestPermissions(agent, PERMISSION_TRIGGER_ANIMATION);
        }
        else {
            edge = 0;
        }
    }

    run_time_permissions(integer perm)
    {
        if ( perm == PERMISSION_TRIGGER_ANIMATION ) {
            llSetTimerEvent(0.1);
        }
    }

    timer()
    {
        if ( llGetAgentInfo(owner) & AGENT_TYPING ) {
            if ( !edge ) {
                edge = 1;

                llSetLinkAlpha(LINK_SET, 1.0, ALL_SIDES);
                llStartAnimation(TypeAnim);
            }
        }
        else if ( edge ) {
            edge = 0;

            llSetLinkAlpha(LINK_SET, 0.0, ALL_SIDES);
            llStopAnimation(TypeAnim);
        }
    }
}

か、解説がめんどうに。。。w 興味のある人はちょっと考えてみてくださいネ。

追記
HidenoriさんとFakeさんに添削されました!

ぜんぜん気づいてなかったところ(´・ω・`)
  • タイマーの開始条件が謎
  • タイマー止めてないよ
ぎゃーw もっかい。
string TypeAnim = "typing";
key owner;
integer edge = 0;

default
{
    attach(key agent)
    {
        if ( agent != NULL_KEY ) {
            owner = llGetOwner();
            llRequestPermissions(agent, PERMISSION_TRIGGER_ANIMATION);
            llSetTimerEvent(0.1);
        }
        else {
            edge = 0;
            llSetTimerEvent(0.0); // 追記 timer止めてなかった(っ_・`)
        }
    }

    timer()
    {
        if ( (llGetAgentInfo(owner) & AGENT_TYPING) ) {
            if ( !edge ) {
                edge = 1;

                llSetLinkAlpha(LINK_SET, 1.0, ALL_SIDES);
                llStartAnimation(TypeAnim);
            }
        }
        else if ( edge ) {
            edge = 0;

            llSetLinkAlpha(LINK_SET, 0.0, ALL_SIDES);
            llStopAnimation(TypeAnim);
        }
    }
}

0 件のコメント: