ラベル LSL の投稿を表示しています。 すべての投稿を表示
ラベル LSL の投稿を表示しています。 すべての投稿を表示

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年1月13日日曜日

LSLの色づけテスト

 

LiveWriterとSyntaxHighliterでLSLの色づけテストです。

default
{
    state_entry()
    {
        llSay(0, "Hello, SL World!");
    }
}
うまく表示させるコツは、Bloggerの設定を変更することです。途中にbrタグがいっぱい合って変だ!って時には、

設定>フォーマット>改行の変換>「いいえ」

とします。

WearしてもTip Jarは機能するのん?

知り合いに頼まれて検証してみたのですが、ダメみたいです。

Wearした時点で、ObjectへのPayがアバターのもので上書きされてしまい、Objectを右クリックしてPayしてもmoneyイベントは立ち上がらないようです。ぎゃふ。