Site search
2008年7月22日火曜日
カラーチェンジの工夫
今回は普通にカラーチェンジのスクリプトです^^
llSetLinkColorでリンクしてる子プリムも全部色を変えますので、変えたくないプリムは
// 色変更しない子プリム
vector color=<0,0,0>; // 変えたくない色
default
{
changed(integer change)
{
if (change & CHANGED_COLOR) { // 色が変わったら
if (llGetColor(0) != color) { // 違う色に変わったら
llSetColor(color,ALL_SIDES); // 元の色に戻す
}
}
}
}
こんなスクリプトを入れておくと一瞬色が変わりますが元に戻りますw
if (llGetColor(0) != color)は元の色への更新がループするのを防止します。
親プリムのスクリプトは色の名と値をそれぞれリストにして処理するようにしてみました^^
リストの色の名前はそのままダイアログのボタンとして表示されます。
// カラーチェンジ
integer listen_handle;
integer CHANNEL;
list color_name=["Red","Green","Blue","White"]; // 色の名前
list color_value=[<1,0,0>,<0,1,0>,<0,0,1>,<1,1,1>]; // 色の値
default
{
touch_start(integer total_number)
{
key agent=llDetectedKey(0); // タッチしたアバターのキー
if (agent != llGetOwner()) return; // オーナーでないときは中断
llListenRemove(listen_handle); // listen解除
CHANNEL=llCeil(llFrand(2147483646)); // listenチャンネルのランダム化
listen_handle=llListen(CHANNEL, "", agent, ""); // listen開始
llDialog(agent, "Color change", color_name, CHANNEL); // ダイアログ表示
}
listen(integer channel, string name, key id, string msg)
{
llListenRemove(listen_handle); // listen解除
if (channel == CHANNEL && id == llGetOwner()) {
integer i=llListFindList(color_name,[msg]); // 押されたボタンをリストから検索
if (i < 0) return; // 一致しなかったら終了
vector color=llList2Vector(color_value,i); // 色の値リストの一致した色
llSetLinkColor(LINK_SET,color,ALL_SIDES); // 全プリムの色を変更
}
}
}
今回のダイアログ用のリッスンチャンネルは乱数でプラス側(1~2147483646)を発生するようにしてます^^
7月22日18時頃追記: llSetLinkColorのリンク番号が抜けてたのを訂正しました^^;;
llSetLinkColorでリンクしてる子プリムも全部色を変えますので、変えたくないプリムは
// 色変更しない子プリム
vector color=<0,0,0>; // 変えたくない色
default
{
changed(integer change)
{
if (change & CHANGED_COLOR) { // 色が変わったら
if (llGetColor(0) != color) { // 違う色に変わったら
llSetColor(color,ALL_SIDES); // 元の色に戻す
}
}
}
}
こんなスクリプトを入れておくと一瞬色が変わりますが元に戻りますw
if (llGetColor(0) != color)は元の色への更新がループするのを防止します。
親プリムのスクリプトは色の名と値をそれぞれリストにして処理するようにしてみました^^
リストの色の名前はそのままダイアログのボタンとして表示されます。
// カラーチェンジ
integer listen_handle;
integer CHANNEL;
list color_name=["Red","Green","Blue","White"]; // 色の名前
list color_value=[<1,0,0>,<0,1,0>,<0,0,1>,<1,1,1>]; // 色の値
default
{
touch_start(integer total_number)
{
key agent=llDetectedKey(0); // タッチしたアバターのキー
if (agent != llGetOwner()) return; // オーナーでないときは中断
llListenRemove(listen_handle); // listen解除
CHANNEL=llCeil(llFrand(2147483646)); // listenチャンネルのランダム化
listen_handle=llListen(CHANNEL, "", agent, ""); // listen開始
llDialog(agent, "Color change", color_name, CHANNEL); // ダイアログ表示
}
listen(integer channel, string name, key id, string msg)
{
llListenRemove(listen_handle); // listen解除
if (channel == CHANNEL && id == llGetOwner()) {
integer i=llListFindList(color_name,[msg]); // 押されたボタンをリストから検索
if (i < 0) return; // 一致しなかったら終了
vector color=llList2Vector(color_value,i); // 色の値リストの一致した色
llSetLinkColor(LINK_SET,color,ALL_SIDES); // 全プリムの色を変更
}
}
}
今回のダイアログ用のリッスンチャンネルは乱数でプラス側(1~2147483646)を発生するようにしてます^^
7月22日18時頃追記: llSetLinkColorのリンク番号が抜けてたのを訂正しました^^;;
登録:
コメントの投稿 (Atom)
気になったので・・・。
返信削除最後の
llSetLinkColor(color,ALL_SIDES);
ですが、リンク番号が抜けています。
llSetLinkColor(LINK_ALL_CHILDREN, color, ALL_SIDES);
ですね。
ご指摘ありがとうございます^^
返信削除記事執筆中に全プリムに対してのカラーチェンジに変更したんですが、中途半端に修正してしまって間違えたみたいです;
今回は親プリムへ適用も想定してたのでLINK_SETのほうに訂正しました。