LlDialog/ja

From Second Life Wiki
Jump to navigation Jump to search

要約

関数: llDialog( key avatar, string message, list buttons, integer chat_channel );

avatar のスクリーンの右上端に青いダイアログボックスを表示し、その中に messagebuttons を表示し、さらに Ignore ボタンを表示します。これには単純なメッセージ通知から複雑なメニューシステムまで、様々な用途があります。

• key avatar 同一 地域 にいるアバターの UUID
• string message 表示するメッセージ
• list buttons ボタンのラベル
• integer chat_channel 出力チャネル、任意の整数

ボタンが押されると、avatar はボタンのラベルのテキストを chat_channel で発言します。
チャットが生成される位置は、ダイアログボタンが押されたときにダイアログを生成したオブジェクトのルートプリムがあった場所です。

ボタンの順序
9   10 11
6 7 8  
3 4 5
0 1 2

警告

  • この関数は 1.0 秒間、スクリプトを停止します。
  • ダイアログボックスをスクリプトで消す方法はありません。
  • ユーザが小さい "Ignore" ボタンをい押したことをスクリプトで検出する方法はありません (このボタンを押した結果生成されるチャットはありません) 。
  • ダイアログボックスの入力と同じユーザによる通常のチャットを識別する方法はありません。
    • レスポンスがボタンのうちの 1 つでないかもしれないと予期しておくのは重要です。
  • listen 中のオブジェクトのルートプリムとダイアログを生成するプリムの間の距離が 20 メートルを超えると、ボタンが押されても、レスポンスを拾うことができません。#制限 を参照してください。
    • この制限はアタッチメントにも適用され、装着者がリスナーの位置から 20 メートルを超えて移動しても同じです。#制限 を参照してください。

message の制限

  • message の長さは 512 バイトよりも小さくなければならず、空であってはいけません。空の場合、 llDialog は "llDialog: must supply a message" と DEBUG_CHANNEL で叫ぶことになります。512 バイト以上の場合、(これも DEBUG_CHANNEL で) "llDialog: message too long, must be less than 512 characters" と叫びます。両方の場合で、avatar に対してはダイアログボックスが生成されません。
  • クライアントは message として 8 行だけ表示できます。それより長い場合、ダイアログにスクロールバーがつきます。#表示 を参照してください。

buttons の制限

  • buttons が空のリストの場合、デフォルトで ["OK"] と指定されたことになります。
  • エラーは次のような場合に、DEBUG_CHANNEL で叫ばれます。
    • 12 を超える数のボタンがある。
    • リストアイテムの中に、string でないものがある。
    • リストアイテムの中に、文字長が (バイト数で) 0 または 24 を超えるものがある。
      • 言い換えると、ボタンのテキストは 24 バイトを超えたり、空文字列であったりしてはいけません。
  • クライアントはボタンのテキストスペースより幅が長い場合、ボタンにはまったく文字が表示されなくなります。#表示 を参照してください。

サンプル

integer channel = 1000;

default
{
    state_entry()
    {
        llListen(channel,"", "","");
    }

    touch_start(integer count)
    {
        llDialog(llDetectedKey(0), "これはテストダイアログです。\n\n以下から選択してください。",
                 ["Yes", "No", "0", "1"], channel);
    }
    
    listen(integer chan, string name, key id, string mes)
    {
        if(id == llGetOwnerKey(id))//地域にいなければオブジェクトを listen しない
            llSay(0,name + " (" + (string)llGetObjectDetails(id, (list)OBJECT_POS) + ") は " + mes + " を選択しました");
    }
}
「ありふれた」ロジックでアルファベット順または数字順にボタンを並び替える簡単な方法です。
list a_list;

key owner;

list n_list;

default
{
    state_entry()
    {
        a_list = ["e", "h", "g", "a", "c", "d", "b", "f", "i"];          // このようなダイアログを表示
        owner = llGetOwner();                                            // [a] [b] [c]
    }                                                                    // [d] [e] [f]
    touch_start(integer total_number)                                    // [g] [h] [i]
    {                                                                    //    (ignore)
        n_list = llListSort(llListSort(a_list, 1, TRUE), 3, FALSE);
        llDialog(owner, "\nWha!!?", n_list, 0);
    } // 3, 6, 9, 12 のボタンにのみ動作します。3 の倍数でない場合、スペーサーを入れます。
}

便利なスニペット

//「正しい」可読性のある順序でボタンを配置するコンパクトな関数
integer channel;

list order_buttons(list buttons)
{
    return llList2List(buttons, -3, -1) + llList2List(buttons, -6, -4)
         + llList2List(buttons, -9, -7) + llList2List(buttons, -12, -10);
}

default
{
    state_entry()
    {   // [-1000000000,-2000000000] の中でランダムなチャネルを生成します。
	channel = (integer)(llFrand(-1000000000.0) - 1000000000.0);

	llListen(channel,"", "","");
    }
	
    touch_start(integer total_number)
    {
        llDialog(llDetectedKey(0),"\n選択してください:\n",
	    order_buttons(["1", "2", "3", "4", "5", "6", "7", "8", "9", "10"]),channel);
    }
	
    listen(integer _chan, string _name, key _id, string _option)
    {
        llSay(0, _name + " chose option " + _option);
    }
}

注意点

メニューシステムでダイアログボックスを使用する場合、ダイアログメニュー: ステップ・バイ・ステップ・ガイド を参照してください。(学習者向け)

ヒント

ずいぶん大きいマイナスのチャネルを使用するのは (32 ビットの integer のマイナスの限界値、つまり -2,147,483,648 よりも小さくなければ) 良い考えです。例えば、 <lsl>// [-1000000000,-2000000000] の範囲でランダムなチャネルを生成します integer channel = (integer)(llFrand(-1000000000.0) - 1000000000.0);

llDialog(llDetectedKey(0), "Please choose one of the below options:",

   ["Yes", "No", "0", "1"], channel);</lsl>

マイナスのチャネルはスクリプトのコミュニケーションで広くつかわれています。クライアントはこれらのチャネルで直接チャットできないからです("/-xxxx message" は "message" をチャネル "-xxxx" で発言せず、チャネル 0 で "/-xxxx message" と発言します)。llTextBox が導入される前、これを行う唯一の方法は、24 バイトまでの制限で llDialog を使う方法でした。

スクリプトオブジェクトがみんなそれぞれこの小さい関数を使って固有のチャットチャネルをもつことに、みなさん納得されるでしょう。

<lsl>integer dialog_channel; // スクリプトの上部に変数定義

integer channel() { // スクリプトの上部に関数定義

   return (integer)("0x"+llGetSubString((string)llGetKey(),-8,-1));

}

dialog_channel = channel(); // 実際の処理のどこか、例えば state_entry() のようなところに</lsl> 注意: この関数はチャネル番号を生成するのに公開されている情報を使用するため、けっして秘密とはいえません。

これは他の方法です。上のバージョンは正のチャネルを使用していて、非常にレアなケースでチャネル 0 や、DEBUG_CHANNEL その他とぶつかる可能性があります。このバージョンは -1073741823 (0xBFFFFFFF) から -2147483648 (0x80000000) までのチャネル番号を返します。これもたった 1 行のコードです。 <lsl>privchan = ((integer)("0x"+llGetSubString((string)llGetKey(),-8,-1)) & 0x3FFFFFFF) ^ 0xBFFFFFFF;</lsl>

表示

message に 8 行より多く指定すると、縦のスクロールバーがダイアログに現れます。

メッセージテキストは "\n" (改行) や "\t" (タブ) を使っていくらか整形することができます。フォントの字体、サイズ、太さを指定することはできません。

ダイアログの実際の大きさを指定する方法はありません。色を変えることもできません。

ダイアログの 1 行に表示できる文字数は、ASCII 文字で 1 行あたり約 35 文字です。文字の幅によって異なります。

ボタンに表示できる文字数は文字の幅によって異なります。


制限

私のテストでは、ダイアログボックスは今ではオブジェクトと同じ地域であれば、もしくはハンドオフした先の地域 (例:テレポート先) どこでも動くようになっています。次にハンドオフした先では動きません。私はテレポートのみでテストしており、地域を歩いてまたがる場合はまだテストしていません。

関連項目

イベント

•  listen

関数

•  llListen
•  llTextBox
•  llRegionSay
•  llWhisper 10 メートルに限定したチャットを送ります
•  llSay 20 メートルに限定したチャットを送ります
•  llShout 100 メートルに限定したチャットを送ります
•  llInstantMessage 特定のユーザにチャットを送ります
•  llOwnerSay オーナーだけにチャットを送ります

記事

•  ダイアログメニュー: ステップ・バイ・ステップ・ガイド ダイアログメニュー生成の手引き (学習者向け)

特記事項

All Issues

~ Search JIRA for related Issues
   Only the latest of multiple dialogs remains available (Viewer 2.0 Beta)
   llDialog user button with text "Ignore" is treated like client "Ignore" button and is dropped when clicked.
   llDialog menus can fail when an object is deeded to a group

Signature

function void llDialog( key avatar, string message, list buttons, integer chat_channel );
この翻訳は 原文 と比べて古いですか?間違いがありますか?読みにくいですか?みんなで 修正 していきましょう! (手順はこちら)
この項目はあなたにとって参考にならない項目ですか?もしかしたらLSL Wikiの関連した項目が参考になるかもしれません。