Difference between revisions of "Changed/ja"
< Changed
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= | |event_footnote=複数の変更が 1 つのイベントで現れてくることもあります。このため、ビット演算を使用しましょう。 | ||
|event_desc= | |||
|constants={{LSL Constants Changed/ja | フラグの種類にかかわらず、SIMを越えると拾う現象が起きていますので、乗り物には使わないほうが無難です。 | ||
|event_desc=オブジェクト・プリムに対してさまざまな変更が行われると、このイベントが発生します。 | |||
|constants={{LSL Constants Changed/ja}} | |||
|spec | |spec | ||
|caveats | |caveats=changed イベントの中で {{LSLG/ja|state}} を離れる場合、{{LSLG/ja|state}} を変更する直前にさらに変更が行われていると、この state に戻ってきたときに changed イベントが発生することになります。例えば、 | ||
<source lang="lsl2">default | |||
{ | { | ||
changed(integer change) | changed(integer change) | ||
{ | { | ||
if (change & | if(change & CHANGED_LINK) | ||
{ | { | ||
llOwnerSay(" | 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; | |||
} | |||
}</source> | |||
|examples=<source lang="lsl2">default | |||
{ | |||
changed(integer change) | |||
{ | |||
// & です。 && ではありません ... ビット演算子です! | |||
if (change & CHANGED_INVENTORY) | |||
{ | |||
llOwnerSay("インベントリが変わりました。"); | |||
} | |||
if (change & CHANGED_COLOR) | |||
{ | { | ||
llOwnerSay(" | llOwnerSay("色か透過度が変わりました。"); | ||
} | } | ||
if (change & CHANGED_SHAPE) | if (change & CHANGED_SHAPE) | ||
{ | { | ||
llOwnerSay(" | llOwnerSay("プリムの形が変わりました。"); | ||
} | } | ||
if (change & CHANGED_SCALE) | if (change & CHANGED_SCALE) | ||
{ | { | ||
llOwnerSay(" | llOwnerSay("プリムのサイズが変わりました。"); | ||
} | } | ||
if (change & CHANGED_TEXTURE) | if (change & CHANGED_TEXTURE) | ||
{ | { | ||
llOwnerSay(" | llOwnerSay("プリムのテクスチャかテクスチャの属性が変わりました。"); | ||
} | } | ||
if (change & CHANGED_LINK) | if (change & CHANGED_LINK) | ||
{ | { | ||
llOwnerSay(" | llOwnerSay("リンクされているプリムの数が変わりました。"); | ||
} | } | ||
if (change & CHANGED_ALLOWED_DROP) | if (change & CHANGED_ALLOWED_DROP) | ||
{ | { | ||
llOwnerSay(" | llOwnerSay("インベントリが編集権限のないユーザによって変更されました "+ | ||
"プリムにアイテムが落とされ、スクリプトはそれを許可しました。"); | |||
} | } | ||
if (change & CHANGED_OWNER) | if (change & CHANGED_OWNER) | ||
{ | { | ||
llOwnerSay(" | llOwnerSay("オブジェクトのオーナーが変わりました。"); | ||
} | } | ||
if (change & CHANGED_REGION) | if (change & CHANGED_REGION) | ||
{ | { | ||
llOwnerSay(" | llOwnerSay("オブジェクトのある地域が変わりました。"); | ||
} | } | ||
if (change & CHANGED_TELEPORT) | if (change & CHANGED_TELEPORT) | ||
{ | { | ||
llOwnerSay(" | llOwnerSay("オブジェクトが装着されたままテレポートしました。"); | ||
} | |||
if (change & CHANGED_REGION_START) | |||
{ | |||
llOwnerSay("地域が今再起動されました。"); | |||
} | } | ||
} | } | ||
}</ | } | ||
</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 | ||
|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 | ||
}}{{LSLC/ja|Region}}{{LSLC/ja|Owner}}{{LSLC/ja|Prim}} | |||
}}{{LSLC|Region |
Latest revision as of 08:52, 21 February 2016
LSL ポータル | 関数 | イベント | 型 | 演算子 | 定数 | 実行制御 | スクリプトライブラリ | カテゴリ別スクリプトライブラリ | チュートリアル |
フラグ | 説明 | |
---|---|---|
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の関連した項目が参考になるかもしれません。