前のエントリーの時に、アバターがタイピングしているときだけ指定のアニメを動かして、スクリプトが入っているオブジェのアルファを操作する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);
}
}
}