サンプルでは、お家っていうかオモチャの小屋って感じでしょうかね。。。壁の部分と屋根の部分の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 件のコメント:
コメントを投稿