Difference between revisions of "LlDialog/ja"

From Second Life Wiki
Jump to navigation Jump to search
m
 
(4 intermediate revisions by 2 users not shown)
Line 1: Line 1:
{{LSL_Function/avatar/ja|avatar}}{{LSL_Function/ja
{{Issues/VWR-17064}}{{Issues/VWR-14537}}{{Issues/SVC-1815}}{{LSL_Function/avatar/ja|avatar|sim=*}}{{LSL_Function/chat/ja|chat_channel}}{{LSL_Function/ja|sort=Dialog|func_id=247|func_sleep=1.0|func_energy=10.0|func=llDialog
|sort=Dialog
|func_id=247
|func_sleep=1.0
|func_energy=10.0
|func=llDialog
|p1_type=key|p1_name=avatar|p1_desc
|p1_type=key|p1_name=avatar|p1_desc
|p2_type=string|p2_name=message|p2_desc
|p2_type=string|p2_name=message|p2_desc=表示するメッセージ
|p3_type=list|p3_name=buttons|p3_desc
|p3_type=list|p3_name=buttons|p3_desc=ボタンのラベル
|p4_type=integer|p4_name=chat_channel|p4_desc
|p4_type=integer|p4_name=chat_channel|p4_desc
|func_desc='''avatar'''のスクリーンに'''message'''と'''buttons'''を加えたダイアログボックスを表示します。
|func_desc='''avatar''' のスクリーンの右上端に青いダイアログボックスを表示し、その中に '''message''' と '''buttons''' を表示し、さらに Ignore ボタンを表示します。これには単純なメッセージ通知から複雑なメニューシステムまで、様々な用途があります。
|func_footnote=ボタンが押されたとき、'''avatar''''''chat_channel'''上でボタンのテキストを叫びます。<br/>チャットの位置はダイアログボックスが作られたときのプリムの場所です。
|func_footnote=ボタンが押されると、'''avatar''' はボタンのラベルのテキストを '''chat_channel''' で発言します。<br/>チャットが生成される位置は、ダイアログボタンが押されたときにダイアログを生成したオブジェクトのルートプリムがあった場所です。
|spec
|spec
|caveats=
|caveats=
*スクリプトでダイアログボックスを消す方法はありません。
*ダイアログボックスをスクリプトで消す方法はありません。
*スクリプトでユーザが小さな"ignore"ボタンを押した場合に探知する方法はありません。(このボタンを押した結果でチャットは生成されません)
*ユーザが小さい "Ignore" ボタンをい押したことをスクリプトで検出する方法はありません (このボタンを押した結果生成されるチャットはありません) 。
*ダイアログボックスからの入力と、同じユーザによる通常チャットを識別する方法はありません。
*ダイアログボックスの入力と同じユーザによる通常のチャットを識別する方法はありません。
**応答がボタンの一つによるものではないことを想定することは重要です。
**レスポンスがボタンのうちの 1 つでないかもしれないと予期しておくのは重要です。
*プリムがダイアログの作られた場所でのシャウトの範囲から外れた場合、応答は聞こえなくなるでしょう。
*{{LSLG/ja|listen}} 中のオブジェクトのルートプリムとダイアログを生成するプリムの間の距離が 20 メートルを超えると、ボタンが押されても、レスポンスを拾うことができません。[[#制限]] を参照してください。
**この制限は、装着物がダイアログボックスが作られた場所でのシャウト範囲を超えた場合でも作用します。
**この制限はアタッチメントにも適用され、装着者がリスナーの位置から 20 メートルを超えて移動しても同じです。[[#制限]] を参照してください。


===メッセージの制限===
===<tt>message</tt> の制限===
*8行を超えた場合、スクロールバーが現れます。
*'''message''' の長さは 512 バイトよりも小さくなければならず、空であってはいけません。空の場合、 llDialog は "llDialog: must supply a message" と {{LSLG/ja|DEBUG_CHANNEL}} で叫ぶことになります。512 バイト以上の場合、(これも {{LSLG/ja|DEBUG_CHANNEL}} で) "llDialog: message too long, must be less than 512 characters" と叫びます。両方の場合で、'''avatar''' に対してはダイアログボックスが生成されません。
*'''メッセージ'''は512byteより少なく、かつ空にでは無いようにすべきです。それらの場合は [[DEBUG_CHANNEL/ja|デバッグチャンネル]]にてエラーがシャウトされるでしょう。
*クライアントは '''message''' として 8 行だけ表示できます。それより長い場合、ダイアログにスクロールバーがつきます。[[#表示]] を参照してください。


===ボタンの限界===
===<tt>buttons</tt> の制限===
*'''ボタン'''が空のリストの場合、"OK"のみのようなリストが初期値となるでしょう。
*'''buttons''' が空のリストの場合、デフォルトで ["OK"] と指定されたことになります。
*エラーは[[DEBUG_CHANNEL/ja|デバッグチャンネル]]にてシャウトされるでしょう。
*エラーは次のような場合に、{{LSLG/ja|DEBUG_CHANNEL}} で叫ばれます。
**12ボタンよりもおおい場合
**12 を超える数のボタンがある。
**いくつかのリスト項目がstringでは無い場合
**リストアイテムの中に、string でないものがある。
**いくつかのリスト項目で、stringの長さ(byte計算)が0もしくは24より多い場合
**リストアイテムの中に、文字長が (バイト数で) 0 または 24 を超えるものがある。
|examples=<lsl>integer channel = 1000;
***言い換えると、ボタンのテキストは 24 バイトを超えたり、空文字列であったりしてはいけません。
list pairs = [];
*クライアントはボタンのテキストスペースより幅が長い場合、ボタンにはまったく文字が表示されなくなります。[[#表示]] を参照してください。
|examples=<source lang="lsl2">integer channel = 1000;


default
default
Line 42: Line 38:
     touch_start(integer count)
     touch_start(integer count)
     {
     {
         llDialog(llDetectedKey(0), "This is a test dialog.\n\nPlease choose one of the below options.",
         llDialog(llDetectedKey(0), "これはテストダイアログです。\n\n以下から選択してください。",
                 ["Yes", "No", "0", "1"], channel);
                 ["Yes", "No", "0", "1"], channel);
     }
     }
Line 48: Line 44:
     listen(integer chan, string name, key id, string mes)
     listen(integer chan, string name, key id, string mes)
     {
     {
         if(id == llGetOwnerKey(id))//won't listen to objects unless they aren't in the region.
         if(id == llGetOwnerKey(id))//地域にいなければオブジェクトを listen しない
             llSay(0,name + " (" + (string)llGetObjectDetails(id, (list)OBJECT_POS) + ") chose option " + mes);
             llSay(0,name + " (" + (string)llGetObjectDetails(id, (list)OBJECT_POS) + ") " + mes + " を選択しました");
     }
     }
}</lsl>
}</source>「ありふれた」ロジックでアルファベット順または数字順にボタンを並び替える簡単な方法です。<source lang="lsl2">list a_list;
|helpers=<lsl>//Compact function to put buttons in "correct" human-readable order
 
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 の倍数でない場合、スペーサーを入れます。
}</source>
|helpers=<source lang="lsl2">//「正しい」可読性のある順序でボタンを配置するコンパクトな関数
integer channel;
integer channel;


Line 58: Line 72:
{
{
     return llList2List(buttons, -3, -1) + llList2List(buttons, -6, -4)
     return llList2List(buttons, -3, -1) + llList2List(buttons, -6, -4)
        + llList2List(buttons, -9, -7) + llList2List(buttons, -12, -10);
        + llList2List(buttons, -9, -7) + llList2List(buttons, -12, -10);
}
}


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


Line 72: Line 86:
     touch_start(integer total_number)
     touch_start(integer total_number)
     {
     {
         llDialog(llDetectedKey(0),"\nPlease choose an option:\n",
         llDialog(llDetectedKey(0),"\n選択してください:\n",
    order_buttons(["1", "2", "3", "4", "5", "6", "7", "8", "9", "10"]),channel);
    order_buttons(["1", "2", "3", "4", "5", "6", "7", "8", "9", "10"]),channel);
     }
     }
Line 80: Line 94:
         llSay(0, _name + " chose option " + _option);
         llSay(0, _name + " chose option " + _option);
     }
     }
}</lsl>
}</source>
|constants=
|constants={{#vardefine:constants_nb}}
{{{!}}
{{{!}}
{{!}}- valign="top"
{{!}}- valign="top"
{{!}}
{{!}}
{{{!}}{{Prettytable}}
{{{!}}{{Prettytable|style=margin-top:0;}}
{{!}}-{{Hl2}}
{{!}}-{{Hl2}}
! colspan="4" {{!}} ボタンの配列
! colspan="4" {{!}} ボタンの順序
{{!}}-
{{!}}-
{{!}}9&nbsp;&nbsp;
{{!}}9&nbsp;&nbsp;
Line 106: Line 120:
{{!}}}
{{!}}}
{{!}}
{{!}}
{{LSL Constants/Chat/ja}}
{{!}}}
{{!}}}
|helpers|related|notes
|helpers
|related
|notes=
|notes=
大きなマイナス域のチャンネルを使うのはよい手段です。(最大マイナス域での32bit integerで、これ以上はありえないマイナス域とすれば、-2,147,483,64です)
メニューシステムでダイアログボックスを使用する場合、[[Dialog Menus|ダイアログメニュー: ステップ・バイ・ステップ・ガイド]] を参照してください。(学習者向け)
''例''
 
<lsl>// Create random channel within range [-1000000000,-2000000000]
===ヒント===
ずいぶん大きいマイナスのチャネルを使用するのは (32 ビットの integer のマイナスの限界値、つまり -2,147,483,648 よりも小さくなければ) 良い考えです。例えば、
<lsl>// [-1000000000,-2000000000] の範囲でランダムなチャネルを生成します
integer channel = (integer)(llFrand(-1000000000.0) - 1000000000.0);
integer channel = (integer)(llFrand(-1000000000.0) - 1000000000.0);


llDialog(llDetectedKey(0), "Please choose one of the below options:",
llDialog(llDetectedKey(0), "Please choose one of the below options:",
     ["Yes", "No", "0", "1"], channel);</lsl>
     ["Yes", "No", "0", "1"], channel);</lsl>
マイナスチャンネル上で'''アバタ'''がチャットをするのは不可能で、幾つかの他のオブジェクトが、なんらかのそのようなチャンネル上で発言してしまう事故は極めてありえないでしょう。(もちろん、故意にメッセージ対象のチャンネル上での'listen'を設定可能です)
マイナスのチャネルはスクリプトのコミュニケーションで広くつかわれています。クライアントはこれらのチャネルで直接チャットできないからです("/-xxxx message" は "message" をチャネル "-xxxx" で発言せず、チャネル 0 で "/-xxxx message" と発言します)。{{LSLG/ja|llTextBox}} が導入される前、これを行う唯一の方法は、24 バイトまでの制限で {{LSLG/ja|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 文字です。文字の幅によって異なります。
 
ボタンに表示できる文字数は文字の幅によって異なります。
 
 
===制限===
 
私のテストでは、ダイアログボックスは今ではオブジェクトと同じ地域であれば、もしくはハンドオフした先の地域 (例:テレポート先) どこでも動くようになっています。次にハンドオフした先では動きません。私はテレポートのみでテストしており、地域を歩いてまたがる場合はまだテストしていません。
 
|also_events=
{{LSL DefineRow||{{LSLG/ja|listen}}|}}
|also_functions=
{{LSL DefineRow||{{LSLG/ja|llListen}}|}}
{{LSL DefineRow||{{LSLG/ja|llTextBox}}|}}
{{LSL DefineRow||{{LSLG/ja|llRegionSay}}|}}
{{LSL DefineRow||{{LSLG/ja|llWhisper}}|10 メートルに限定したチャットを送ります}}
{{LSL DefineRow||{{LSLG/ja|llSay}}|20 メートルに限定したチャットを送ります}}
{{LSL DefineRow||{{LSLG/ja|llShout}}|100 メートルに限定したチャットを送ります}}
{{LSL DefineRow||{{LSLG/ja|llInstantMessage}}|特定のユーザにチャットを送ります}}
{{LSL DefineRow||{{LSLG/ja|llOwnerSay}}|オーナーだけにチャットを送ります}}
|also_tests
|also_articles=
{{LSL DefineRow||[[Dialog Menus|ダイアログメニュー: ステップ・バイ・ステップ・ガイド]]|ダイアログメニュー生成の手引き (学習者向け)}}
|cat1=Chat
|cat1=Chat
|cat2=Communications
|cat2=Communications
|cat3=Dialog
|cat3=Dialog
|cat4}}
|cat4}}

Latest revision as of 03:02, 25 February 2016

要約

関数: 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の関連した項目が参考になるかもしれません。