Site search
2008年10月2日木曜日
コントロール用HUDのスクリプト
今回はオブジェクトにデータを送ってコントロールする簡単なHUDのスクリプトです^^
ダイアログからの送信と同じで、HUDがチャットのチャンネルでデータを送信するような感じになります。なのでllSay使ったら20m以内で送信可能ってことになりますね。
HUDからは色のベクターデータを送るように書いてみましたw
色リストのデータはベクター値ですが、チャットで送信するので文字列データに変換してます。
タッチの度に色リストのデータを順番にひとつ送るようにしました。
そして、データを受信するためのオブジェクトに使うスクリプトです。
listenイベントのキーidにはチャットしたHUDのUUIDが入りますので、それからllGetOwnerKeyでHUDのオーナーのキーを調べて、受信オブジェクトのオーナーと同じだったら受信したデータを処理するようにします。
例えばワイヤレスリモコンとかみたいな、近くのものにデータを送るときは同じような要領になりますね^^
ダイアログからの送信と同じで、HUDがチャットのチャンネルでデータを送信するような感じになります。なのでllSay使ったら20m以内で送信可能ってことになりますね。
HUDからは色のベクターデータを送るように書いてみましたw
// 送信用HUD
integer ch=10020550;  // 送信用チャンネル
integer color=0;  // 色リストのポインタ用
integer len;
list color_list=[<1,1,1>,<1,0,0>,<0,1,0>,<0,0,1>];  // 色のリスト
default
{
    state_entry()
    {
        len=llGetListLength(color_list);  // 色の数
    }
    touch_start(integer total_number)
    {
        color++;  // ポインタ加算
        if (color >= len) color=0;  // 色数を超えたらポインタを0にする
        string str=llList2String(color_list,color);  // 色リストのデータを文字データに変換
        llSay(ch,str);  // データ送信
    }
}
色リストのデータはベクター値ですが、チャットで送信するので文字列データに変換してます。
タッチの度に色リストのデータを順番にひとつ送るようにしました。
そして、データを受信するためのオブジェクトに使うスクリプトです。
// 受信用オブジェクト
integer ch=10020550;  // 受信するチャンネル(送信と同じチャンネル)
default
{
    state_entry()
    {
        llListen(ch,"",NULL_KEY,"");  // 受信チャンネルでリッスン開始
    }
    listen(integer channel, string name, key id, string msg)
    {
        if (llGetOwner() == llGetOwnerKey(id))
        {  // オーナーと送信HUDのオーナーが一致したら
            if (llGetSubString(msg,0,0) == "<")
            {  // データの最初が < だったら
                vector v=(vector)msg; // データをベクター値に変換
                llSetColor(v,ALL_SIDES);  // 色設定
            }
        }
    }
}
listenイベントのキーidにはチャットしたHUDのUUIDが入りますので、それからllGetOwnerKeyでHUDのオーナーのキーを調べて、受信オブジェクトのオーナーと同じだったら受信したデータを処理するようにします。
例えばワイヤレスリモコンとかみたいな、近くのものにデータを送るときは同じような要領になりますね^^
登録:
コメントの投稿 (Atom)


こんばんは。いつもこちらでスクリプト参考にさせていただいてます。
返信削除質問なのですが、このHUDスクリプトの機能をカラーチェンジではなく、テクスチャーチェンジに変えて使ってみたいのですが、どう書き換えればいいのかがわかりません;
llSetColorやlistを書き換えただけじゃダメなのはわかってるんですけど、他のとこをどうすればいいのかがわかんないです。
よろしければ教えてください^^;
こんばんは。ご利用ありがとうございます。
返信削除テクスチャの場合はリストにテクスチャ名を記入して、データ送信のところは
llSay(ch,"texture "+str);
そして受信オブジェクトは
if (llGetSubString(msg,0,7) == "texture ") {
llSetTexture(llGetSubString(msg,8,-1),ALL_SIDES);
}
のようにしたらOKですかね?
この方法ではテクスチャは受信オブジェクトのコンテンツに入れておきます。
あとコンテンツにテクスチャ入れたくないときはUUIDをスクリプトに記述する方法などもあります。
わかりにくかったらIMでご相談くださいますか。簡単なサンプルでよかったらお作りできますので^^
ありがとうございます!ばっちり動作しました!
返信削除テクスチャーチェンジでまだわからないことがあるので、IMでご相談させていただきます^^;
宜しくお願いします。