Changed/ja

From Second Life Wiki
< Changed
Revision as of 07:20, 15 January 2014 by Kireji Haiku (talk | contribs) (不具合を修正しました)
Jump to navigation Jump to search

説明

イベント: 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 イベントが発生することになります。例えば、 <lsl>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;
   }

}</lsl>

サンプル

<lsl>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("地域が今再起動されました。");
       }
   }

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

   changed(integer change)
   {
       if(change & (CHANGED_OWNER

注意点

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

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