2007年11月11日日曜日

llDialog で、、、

ここのブログでも他の方がつけているのをみて面白い、、、と思い、使ってみました OnlyOneブログパーツ なのですが、このブログパーツによると、なぜか llDialog と「日本語」のキーワードで Google 検索トップ、、、(2007年11月10日現在w)

対象となっているのは、Yaz Mania 玉の投稿なんですけど、、、、

Makapu /Miz さまを抜いてのトップは本当に申し訳なく・・・

で、ちょっと罪滅ぼし(?) じゃないですが、それなら llDialog のことで私が知っていることや、やってみたことを紹介しようかと思いました。

本当にわかりやすく書かれているのは、Makapu/Miz さんの投稿ですので、はじめての方はそちらをご参照してもらうとして、「ちょっとこんなことできないのかな?」と思って、これまでやってみたことを書いてみます。

llDialog で日本語を使いたい
いまの LSL では日本語を直接扱うことはできませんが、Base64URLエンコード を使ってダイアログの中で日本語の表示が可能です。
Base64 については以前の投稿で、チャットボックスに入力した日本語を llStringToBase64 を使って Base64 に変換しllOwnerSay で表示する、というのを紹介していますので、そちらなどを参考にして、使用したい Base64 でエンコードされた日本語を用意します。

直接 llDialog の引数として llBase64ToString を使う手もありますが、ちょっとソースが見づらくなりますし、あとあと修正するのも大変です。参考までに、、、以下のようになります。ちなみにボタンのリストにも同様に Base64 を使って日本語をいれることができます。
(本当に見づらかったので改行しています)

llDialog(llDetectedKey(0),
llBase64ToString("44OA44Kk44Ki44Ot44Kw44
Gr5pel5pys6Kqe44KS5L2/
44GG44Go44GN44GvIEJhc
2U2NCDjgpLkvb/jgYTjgb7j
gZnjgYvvvJ8="),
[llBase64ToString("5L2/44GE44G+44GZ"),
llBase64ToString("5L2/44GE44G+44Gb44KT")],
8000);

以下のようなダイアログが表示されます。
image

でも、ソースは相当に見づらいですよねぇ、、、

なので、Yaz Mania 玉の投稿でも紹介したようなユーザー定義関数を使って、もうちょっとだけ見やすくしたほうがいいと思います。

グローバル変数として メッセージ群をまとめておいて、jString() みたいなユーザー定義関数を宣言します。


string d_Msg1 = "44OA44Kk44Ki44Ot44Kw44Gr5pel
5pys6Kqe44KS5L2/44GG44Go44G
N44GvIEJhc2U2NCDjgpLkvb/jgYTjg
b7jgZnjgYvvvJ8=";
string b_String1 = "5L2/44GE44G+44GZ";
string b_String2 = "5L2/44GE44G+44Gb44KT";
string jString(string param1) {
    string j = llBase64ToString(param1);
    return j;
}
default {
    touch_start(integer total_number) {
        llDialog(llDetectedKey(0),
jString(dMsg1),
[jString(b_String1),jString(b_String2)],
8000);
   }
}
(注) ダイアログを表示させるだけで、ボタンの処理、llListen などは本来は必要ですが記述してません~
実際、LSL が長くなってきたり、動的にボタンの数を変えたい、、、なんていう要望がでてきますから、そのときは、第3引数のボタンの List 作成用の別のユーザー定義関数を作ったほうがソースもきれいですし、わかりやすいのです。List の部分はダイアログ・ボタン用の LIST そのものが入るパターンが多いですね。
日本語って、やっぱりまずくない?
外国の方の利用可能性があるのなら、、、、考慮は必要ですよね。強制的にみせつけられる llSetText での日本語利用はわたしも使わないわけではないですが、ちょっと、、、、と思う反面、llDialog だと結構日本語使っちゃいますね。ダンス玉とか、ビデオ玉はそうですが、/99 start とチャットで入れるよりも、ダイアログからボタンで選択、、、のほうがわかりやすいですし。
たとえば、日本語と英語のどちらを選びますか? という問いかけをして、選ばれた言語で、、、なんていいと思います。
image
ソースはこんな感じ、、、(まだ、ボタン対応のコードはありませんのでご注意くださいね)
string d_Msg1 = "";
string d_Msg1_E = "Please choose your language.";
string d_Msg1_J = "6KiA6Kqe44KS6YG45oqe44GX44Gm44GP44Gg44GV44GE44CC";
string b_String1 = "English";
string b_String2 = "5pel5pys6Kqe";
list buttonList1 = [];
integer d_Channel = 8000;
string jString(string param1) {
    string j = llBase64ToString(param1);
    return j;
}
createDialogMsg() {
    d_Msg1 = d_Msg1_E + "\n" + jString(d_Msg1_J);
}
createButtonList() {
    buttonList1 = [b_String1,jString(b_String2)];
}
default {
    touch_start(integer total_number) {
        createDialogMsg();
        createButtonList();
        llDialog(llDetectedKey(0),d_Msg1,buttonList1,d_Channel);
    }
}
ちょっと、すっきりしますよね。
と、、、あらら、もう、結構長くなっちゃいましたね。
本当は複数ページのダイアログくらいまで、、、書こうと思ったのに。
それはまた、どこかの機会で。。。
とても大切な注意点を書くのを忘れていました、、、
llDialog を使っていくと何にでも使いたくなるのですが、ものすごく重要なのは ダイアログを表示させる Avatar の Key が必須 ということです。
なので、だいたい Touch などのイベントから、いわゆる llDetected 系関数を使って、Key の取得ができるシーンでの使われ方が多いです。Avatar の Key 取得は LSL関数では名前からでは今のところできません。 (外部のサービスはあります。LSL wiki の llKey2Name 参照してください。)
その意味で、私がよく使うのは、オブジェクトの Owner に対して、そのオブジェクトおよびスクリプトの設定などをダイアログで行ってもらう、、、というものです。
/88 show dialog みたいなチャットからの入力で、llGetOwner() で取得した Key に対して llDialog を発行すれば、オーナーさんの画面上にダイアログが表示されるからです。これは自分で使っていても、チャットからのコマンド入力よりは、使い勝手はいいと思っています。

2 件のコメント:

  1. 私は、URLエンコード派なの~・・・^^。
    でも、今、この記事見て、
    base64用のエンコード/デコード、ツールをインストールしてチャレンジしてみます。
    Vevtorから、「Base64EnDeco」って言うフリーのソフトダウンロードしました。
    http://www.vector.co.jp/soft/dl/win95/util/se335304.html

    返信削除
  2. llBase64toString と llStringToBase64 を使えば、、、(笑
    自作ツールで十分かもです。
    http://mydiary.slmame.com/e9471.html

    返信削除