2009年11月26日木曜日

2ヶ所に使えるカラーチェンジメニュー

今回は何となく複数ヶ所に適用できるようなカラーチェンジメニューのサンプルスクリプトです。最初のメニューでカラーチェンジする部分を選択して、次のメニューで色を選択する2段階のメニューになります。

サンプルでは、お家っていうかオモチャの小屋って感じでしょうかね。。。壁の部分と屋根の部分の2ヶ所でそれぞれカラーチェンジできるメニューになってます。

カラーチェンジの色は共用で、color_nameのリストの色名に対する色のベクトル値をcolor_valueに記入しています。それでmenuっていう変数に入ってる値によって、どの部分のカラーチェンジかを判断するようにしました。(色を共用しない場合はこの辺りそのまま使えないかもですけどw)

// 2ヶ所用カラーチェンジメニュー
integer listen_handle;
integer CHANNEL;
string menu;  // 選択されたメニューの一時記憶用
list main_menu=["Wall color","Roof color"];  // メインメニュー
list color_name=["White","Red","Green","Blue"];  // 色名リスト
list color_value=[<1,1,1>,<1,0,0>,<0,1,0>,<0,0,1>];  // 色値リスト

dialog(key id, string text, list menu_list)
{
    llListenRemove(listen_handle);  // リッスン解除
    CHANNEL=llCeil(llFrand(2147483646));  // チャンネルを乱数で決める
    llSetTimerEvent(600);  // タイマー10分
    listen_handle=llListen(CHANNEL,"",id,"");  // リッスン開始
    llDialog(id,text,menu_list,CHANNEL);  // ダイアログメニューを出す
}

default
{
    touch_start(integer total_number)
    {
        key id=llDetectedKey(0);  // タッチしたアバターのキー
        if (id == llGetOwner()) {  // オーナーのみに限定
            menu="";  // 変数menuを初期化
            dialog(id,"Menu",main_menu);  // dialogへ
        }
    }

    timer()
    {
        llSetTimerEvent(0);  // タイマー停止
        llListenRemove(listen_handle);  // リッスン解除
    }

    listen(integer channel, string name, key id, string msg)
    {
        llSetTimerEvent(0);
        llListenRemove(listen_handle);
        if (channel == CHANNEL && id == llGetOwner()) {
            if (msg == "Wall color") {  // 壁用メニュー
                dialog(id,"Wall color change",color_name);
            }
            else if (msg == "Roof color") {  // 屋根用メニュー
                dialog(id,"Roof color change",color_name);
            }
            else if (menu == "Wall color") {  // 壁のメニューだったとき
                vector v=llList2Vector(color_value,llListFindList(color_name,[msg]));  // 色名から色値を得る
                llSetColor(v,ALL_SIDES);  // 壁(親プリム)に着色
            }
            else if (menu == "Roof color") {  // 屋根のメニューだったとき
                vector v=llList2Vector(color_value,llListFindList(color_name,[msg]));
                llSetLinkColor(LINK_ALL_CHILDREN,v,ALL_SIDES);  // 屋根(子プリムに着色
            }
            menu=msg;  // 選択されたメニューを記憶
        }
    }
}

ダイアログはサブメニューでも呼び出すのでユーザー関数にしてます。それから一応メニューは無視したとき10分でタイムアウトするようにしました。

色値のリストをテクスチャのUUIDにして、llSetColor、llSetLinkColor、llList2Vectorの代わりにllSetTexture、llSetLinkTexture、llList2Keyを使ったらテクスチャチェンジにも応用できると思います^^

1時30分頃追記: サンプルでは、お家っていうかオモチャの小屋。。。って、画像を載せるの忘れてました。今アップロードしました^^;;

0 件のコメント:

コメントを投稿