Site search

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

2008年6月18日水曜日

ダイアログで何かを渡すスクリプト

タッチでノートやランドマークを渡す、Notecard giverとかLandmark giverなどよく見かけますね。

// オブジェクトのコンテンツ内にあるOshiraseを渡す
default
{
    touch_start(integer total_number)
    {
        key agent=llDetectedKey(0);
        llGiveInventory(agent,"Oshirase");
    }
}

この例のOshiraseはノートカードのつもりですが、ランドマークやオブジェクトやボディパーツなど他の持ち物に変えてもOKです。ただし、ノートはパーミッションがノーコピーだと渡しても開いて見れないので注意してくださいw

では本題に入ります。今回はこれをダイアログを出してボタンで選べるようにします^^



メニューのボタンを押すとチャットでボタンの内容が送信されます。ですからチャンネルを0に設定すると送信内容が普通に見れます^^;
送信された内容はlistenイベントでゲットして処理します。
// ダイアログ
string text="サンプル メニュー";  // ダイアログに表示するメッセージ
string button1="お知らせ";
string note1="Oshirase";
string button2="ギフト";
string item2="T-shirt";
string button3="ブログへGO";
string url3="http://beta.slmame.com/";
list menu=[button1,button2,button3];  // メニューに出るボタンのリスト
integer CHANNEL;  // メニューの返事を聞くチャンネル用

default
{
    state_entry()
    {
        CHANNEL=llCeil(llFrand(2147483646));  // チャンネルを乱数で設定
        llListen(CHANNEL,"",NULL_KEY,"");  // listen開始
    }

    touch_start(integer total_number)
    {
        key agent=llDetectedKey(0);  // タッチしたアバターのキー
        llDialog(agent,text,menu,CHANNEL);  // ダイアログを出す
    }

    listen(integer channel, string name, key id, string msg)
    {
        if (channel == CHANNEL)
        {
            if (msg == button1) {  // button1が押されたとき
                llGiveInventory(id,note1);  // note1を渡す
            }
            else if (msg == button2) { // button2が押されたとき
                llGiveInventory(id,item2);  // item2を渡す
            }
            else if (msg == button3) { // button3が押されたとき
                llLoadURL(id,button3,url3);  // webページを開く
            }
        }
    }
}

2009年4月19日追記: state_entryでチャンネルを乱数で決めてリッスンを開始するようにしておいて、以後llListenRemoveしないように修正しました。

0 件のコメント:

コメントを投稿