Difference between revisions of "Changed/ja"

From Second Life Wiki
Jump to navigation Jump to search
m
 
(5 intermediate revisions by 3 users not shown)
Line 4: Line 4:
|p1_type=integer
|p1_type=integer
|p1_name=change  
|p1_name=change  
|p1_desc=CHANGE_* フラグの{{LSLG|bit field|ビットフィールド}}です
|p1_desc=CHANGE_* フラグの {{LSLG/ja|bit field|ビットフィールド}}
|event_footnote=複数のchangeは単一のイベントで表現することができ、ビット演算の算術を用います。
|event_footnote=複数の変更が 1 つのイベントで現れてくることもあります。このため、ビット演算を使用しましょう。
|event_desc=このイベントを引き金にしてオブジェクトあるいはプリムの変化する内容です。
 
|constants={{LSL Constants Changed/ja|LSL Constants Changed}}
フラグの種類にかかわらず、SIMを越えると拾う現象が起きていますので、乗り物には使わないほうが無難です。
|event_desc=オブジェクト・プリムに対してさまざまな変更が行われると、このイベントが発生します。
|constants={{LSL Constants Changed/ja}}
|spec
|spec
|caveats
|caveats=changed イベントの中で {{LSLG/ja|state}} を離れる場合、{{LSLG/ja|state}} を変更する直前にさらに変更が行われていると、この state に戻ってきたときに changed イベントが発生することになります。例えば、
|examples=<lsl>default
<source lang="lsl2">default
{
{
     changed(integer change)
     changed(integer change)
     {
     {
         if (change & CHANGED_INVENTORY) //これは&であり&&ではなく、ビット演算です!
         if(change & CHANGED_LINK)
         {
         {
             llOwnerSay("The inventory has changed.");
            integer links = 0;
            if(llGetObjectPrimCount(llGetKey()) < (links = llGetNumberOfPrims()))
            {
                llUnSit(llGetLinkKey(links));
                state whatever;
            }
            else
             llOwnerSay("リンクかリンク解除かされましたが、上には誰も座っていません。");
            // default ステートに戻ってきた後にこれがチャットされます。
         }
         }
         if (change & CHANGED_COLOR) //これは&であり&&ではなく、ビット演算です!
    }
}
state whatever
{
    state_entry()
    {
        llSetTimerEvent(10.0);//秒
    }
    timer()
    {
         state default;
    }
}</source>
|examples=<source lang="lsl2">default
{
    changed(integer change)
    {
        // & です。 && ではありません ... ビット演算子です!
        if (change & CHANGED_INVENTORY)       
        {
            llOwnerSay("インベントリが変わりました。");
        }
        if (change & CHANGED_COLOR)
         {
         {
             llOwnerSay("The color or alpha changed.");
             llOwnerSay("色か透過度が変わりました。");
         }
         }
         if (change & CHANGED_SHAPE) //これは&であり&&ではなく、ビット演算です!
         if (change & CHANGED_SHAPE)  
         {
         {
             llOwnerSay("The prims shape has changed.");
             llOwnerSay("プリムの形が変わりました。");
         }
         }
         if (change & CHANGED_SCALE) //これは&であり&&ではなく、ビット演算です!
         if (change & CHANGED_SCALE)  
         {
         {
             llOwnerSay("The prims size has changed.");
             llOwnerSay("プリムのサイズが変わりました。");
         }
         }
         if (change & CHANGED_TEXTURE) //これは&ではなく&&であり、ビット演算です!
         if (change & CHANGED_TEXTURE)  
         {
         {
             llOwnerSay("The prims texture or texture attributes have changed.");
             llOwnerSay("プリムのテクスチャかテクスチャの属性が変わりました。");
         }
         }
         if (change & CHANGED_LINK) //これは&であり&&ではなく、ビット演算です!
         if (change & CHANGED_LINK)  
         {
         {
             llOwnerSay("The number of links have changed.");
             llOwnerSay("リンクされているプリムの数が変わりました。");
         }
         }
         if (change & CHANGED_ALLOWED_DROP) //これは&であり&&ではなく、ビット演算です!
         if (change & CHANGED_ALLOWED_DROP)  
         {
         {
             llOwnerSay("The inventory has changed as a result of a user without mod permissions dropping an item on the prim and it being allowed by the script.");
             llOwnerSay("インベントリが編集権限のないユーザによって変更されました "+
                      "プリムにアイテムが落とされ、スクリプトはそれを許可しました。");
         }
         }
         if (change & CHANGED_OWNER) //これは&であり&&ではなく、ビット演算です!
         if (change & CHANGED_OWNER)  
         {
         {
             llOwnerSay("The owner of the object has changed.");
             llOwnerSay("オブジェクトのオーナーが変わりました。");
         }
         }
         if (change & CHANGED_REGION) //これは&であり&&ではなく、ビット演算です!
         if (change & CHANGED_REGION)  
         {
         {
             llOwnerSay("The region the object is in has changed.");
             llOwnerSay("オブジェクトのある地域が変わりました。");
         }
         }
         if (change & CHANGED_TELEPORT) //これは&であり&&ではなく、ビット演算です!
         if (change & CHANGED_TELEPORT)  
         {
         {
             llOwnerSay("The object has been teleported while attached.");
             llOwnerSay("オブジェクトが装着されたままテレポートしました。");
        }
        if (change & CHANGED_REGION_START)
        {
            llOwnerSay("地域が今再起動されました。");
         }
         }
     }
     }
}</lsl>
}
</source>
複数の変更で同じアクションが呼ばれたときのために、以下の構文を使用するとよいでしょう。
<source lang="lsl2">
default
{
    changed(integer change)
    {
        if(change & (CHANGED_OWNER | CHANGED_INVENTORY)) // どちらかの変更で true が返ります。
            llResetScript();
    }
}
</source>
|helpers
|helpers
|also_header
|also_header
Line 62: Line 111:
|also_articles
|also_articles
|also_footer
|also_footer
|notes
|mode
|mode
|notes=
{{LSLG/ja|llGetOwner}} に " (change & CHANGED_OWNER) " の完全な考察が載っています。
|deprecated
|deprecated
|cat1=Inventory
|cat1=Inventory
Line 73: Line 123:
|cat7=Sit
|cat7=Sit
|cat8=Link/Management
|cat8=Link/Management
|cat8=Link/Management
}}{{LSLC/ja|Region}}{{LSLC/ja|Owner}}{{LSLC/ja|Prim}}
}}{{LSLC|Region/ja}}{{LSLC|Owner/ja}}{{LSLC|Prim/ja}}

Latest revision as of 08:52, 21 February 2016

説明

イベント: changed( integer change ){ ; }

オブジェクト・プリムに対してさまざまな変更が行われると、このイベントが発生します。

• integer change CHANGE_* フラグの ビットフィールド

複数の変更が 1 つのイベントで現れてくることもあります。このため、ビット演算を使用しましょう。

フラグの種類にかかわらず、SIMを越えると拾う現象が起きていますので、乗り物には使わないほうが無難です。

フラグ 説明
CHANGED_INVENTORY 0x001 プリムのインベントリが変わりました。 (オーナーが追加したインベントリだけ)
CHANGED_COLOR 0x002 プリムの色か透過度が変わりました。
CHANGED_SHAPE 0x004 プリムの形が変わりました。
CHANGED_SCALE 0x008 プリムのサイズが変わりました。
CHANGED_TEXTURE 0x010 プリムのテクスチャかテクスチャの属性が変わりました。
CHANGED_LINK 0x020 オブジェクトを構成するプリムの数が変わったか、オブジェクトの上に座っているアバターの数が変わりました。
CHANGED_ALLOWED_DROP 0x040 オーナー以外のユーザ (編集不可能な場合はオーナーも含む) がプリムにインベントリを追加しました。
CHANGED_OWNER 0x080 オブジェクトのオーナーが変わりました。
CHANGED_REGION 0x100 オブジェクトのある地域が変わりました。
CHANGED_TELEPORT 0x200 オブジェクトが 装着 されたままテレポートしました。
CHANGED_REGION_START 0x400 地域が今オンラインになりました。
CHANGED_MEDIA 0x800 プリムメディア が変更されました。

警告

changed イベントの中で state を離れる場合、state を変更する直前にさらに変更が行われていると、この state に戻ってきたときに changed イベントが発生することになります。例えば、

default
{
    changed(integer change)
    {
        if(change & CHANGED_LINK)
        {
            integer links = 0;
            if(llGetObjectPrimCount(llGetKey()) < (links = llGetNumberOfPrims()))
            {
                llUnSit(llGetLinkKey(links));
                state whatever;
            }
            else
            llOwnerSay("リンクかリンク解除かされましたが、上には誰も座っていません。");
            // default ステートに戻ってきた後にこれがチャットされます。
        }
    }
}
state whatever
{
    state_entry()
    {
        llSetTimerEvent(10.0);//秒
    }
    timer()
    {
        state default;
    }
}

サンプル

default
{
    changed(integer change)
    {
        // & です。 && ではありません ... ビット演算子です!
        if (change & CHANGED_INVENTORY)         
        {
            llOwnerSay("インベントリが変わりました。");
        }
        if (change & CHANGED_COLOR) 
        {
            llOwnerSay("色か透過度が変わりました。");
        }
        if (change & CHANGED_SHAPE) 
        {
            llOwnerSay("プリムの形が変わりました。");
        }
        if (change & CHANGED_SCALE) 
        {
            llOwnerSay("プリムのサイズが変わりました。");
        }
        if (change & CHANGED_TEXTURE) 
        {
            llOwnerSay("プリムのテクスチャかテクスチャの属性が変わりました。");
        }
        if (change & CHANGED_LINK) 
        {
            llOwnerSay("リンクされているプリムの数が変わりました。");
        }
        if (change & CHANGED_ALLOWED_DROP) 
        {
            llOwnerSay("インベントリが編集権限のないユーザによって変更されました "+
                       "プリムにアイテムが落とされ、スクリプトはそれを許可しました。");
        }
        if (change & CHANGED_OWNER) 
        {
            llOwnerSay("オブジェクトのオーナーが変わりました。");
        }
        if (change & CHANGED_REGION) 
        {
            llOwnerSay("オブジェクトのある地域が変わりました。");
        }
        if (change & CHANGED_TELEPORT) 
        {
            llOwnerSay("オブジェクトが装着されたままテレポートしました。");
        }
        if (change & CHANGED_REGION_START) 
        {
            llOwnerSay("地域が今再起動されました。");
        }
    }
}

複数の変更で同じアクションが呼ばれたときのために、以下の構文を使用するとよいでしょう。

default
{
    changed(integer change)
    {
        if(change & (CHANGED_OWNER | CHANGED_INVENTORY)) // どちらかの変更で true が返ります。
            llResetScript();
    }
}

注意点

llGetOwner に " (change & CHANGED_OWNER) " の完全な考察が載っています。

この翻訳は 原文 と比べて古いですか?間違いがありますか?読みにくいですか?みんなで 修正 していきましょう! (手順はこちら)
この項目はあなたにとって参考にならない項目ですか?もしかしたらLSL Wikiの関連した項目が参考になるかもしれません。