Site search

Google
WWW を検索 backup-beta.blogspot.com を検索

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のリンク番号が抜けてたのを訂正しました^^;;

2 件のコメント:

  1. 気になったので・・・。
    最後の
    llSetLinkColor(color,ALL_SIDES);
    ですが、リンク番号が抜けています。
    llSetLinkColor(LINK_ALL_CHILDREN, color, ALL_SIDES);
    ですね。

    返信削除
  2. ご指摘ありがとうございます^^
    記事執筆中に全プリムに対してのカラーチェンジに変更したんですが、中途半端に修正してしまって間違えたみたいです;
    今回は親プリムへ適用も想定してたのでLINK_SETのほうに訂正しました。

    返信削除