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);
        }
    }
}

2008年10月20日月曜日

LSLCONと情報共有

LSLCONの意見交換会に参加してきました。テーマは「情報・ノウハウの共有の話」です。
普段私は得た情報をまったく共有してないので、いい機会かなーと思って書きますね。


……簡単なネタなのでw



友達がタイピング中のアニメを変更したいということで、どこかからスクリプトひろってきました。
そのスクリプトは、アバターの状態を常に見て、チャット入力中ならアニメを再生する、というスクリプトでした。


アニメの優先度を2でアップしたようで、実際にやってみると通常のタイピングと二重になってしまい変な動きになってしまいました。
じゃあ、通常のタイピングを止めてあげれば?ということで、停止命令をくわえたところ、動かなくなってしまいました。


ここでふと気づいたこと!(どこから情報得たのかわすれましたが)

  • アバターの「チャット入力中」や「away」といった状態は、アニメの再生と連動している。
  • チャット入力中は「type」、away中は「away」という名前のアニメが再生されている。
  • アニメを停止すると、その状態が解除されてしまう。

ということです。チャット入力中に「type」のアニメは停止したらダメなんですね。

今回の正解は、アニメの優先度を上げる、ということでしたーー。(具体的な優先度は調べてないです。)