Adsense

2007年6月12日火曜日

SL でやれることは SL で :)

[追記 2009/10] この話しは Second Life の LSL(スクリプト)編集環境で日本語が使用できなかったときの話題です。

当たり前といえば当たり前なんですが、やっぱり Web の世界にはすでにいろいろなサービスが公開されていますから、そちらのほうが「探しやすい」し、「使い勝手」が良かったり、、、すでに「知っていた」りするので、そちらを主体に使うわけです。

なんの話しかというと、Base64 という文字列を作る話なんです。

海外の方のことを考えるとあまりお勧めできない方法ですが、オブジェクトの上にフローティング・テキストと呼ばれる、空中に浮いた文字をみることがありますよね。そこで日本語表示をするためには、Base64 という文字コードにして、スクリプトの中に埋め込んで、表示するときに人間が理解できる文字列に戻す、、、という方法をとるんです。

この時使用する Base64 の文字列を作るのに、今まで、Web のサービスを使っていたわけで、、、

よく使っていたのは、こういうところ。。。UTF-8 -> Base 64 で使っていました。

http://fesc.abell.co.jp/tool/

(Base64 は Mac だと楽に入力できる、、、と聞いたのですがw Windows なので。。。。)

私はお店もってませんが、たとえば、イベントなどの時に「各パネルをクリックすると投票されます!」みたいな一文を置いておくとか、そういう時に使ったりしています。(SHOPなどで多用しているところがたまにありますが、、、ちょっとうるさいかも、、)

でも、、、なんとなく、SL でやれるんだったら、SL でやってみたほうがいいかも、、、と思ったわけ。(笑

そんなの知ってるよ~、やってるよ~、という方は、この後はスルーしてください (笑

LSL (Linden Scripting Language) の function (関数) に llStringToBase64 という、いかにも変換してくれそうな関数があったので、、、お友達に作ってみて!と頼んだら、作ってくれましたw
それも、、、あっという間(笑
売るほどのものじゃないらしいので、以下、そのスクリプトですw

integer Handle;
integer channel = 11;
key     owner;
vector  ON_COLOR = <0,1,0>;
vector  OFF_COLOR = <1,1,1>;
string  msg1 = "44KS5L2/44Gj44GmIENoYXQg44GX44Gm44GP44Gg44GV44GE44CC";
string  msg2 = "44GT44GuIENoYXQg44Gv5LuW44Gu5Lq644GL44KJ44Gv6KaL44GI44G+44Gb44KT44CCQ2hhdCBIaXN0b3J5KOWxpeattCnjgYvjgokgQmFzZTY0IOOBq+OCqOODs+OCs+ODvOODieOBleOCjOOBn+aWh+Wtl+WIl+OCkiBDb3B5IOOBp+OBjeOBvuOBmeOAgg==";
string  msg3 = "44Gr44Gq44KK44G+44GX44Gf44CCT24g44Gr44GZ44KL44Gr44Gv44KC44GG5LiA5bqm44K/44OD44OB44GX44Gm44GP44Gg44GV44GE44CC";
string  msg4 = "TGlzdGVuIG9mZiDjgavjgZnjgovjgavjga/jgIEvMTEg44Gu44GC44Go44GrIG9mZiDjgpLjgYTjgozjgaYgU2F5IOOBl+OBpuOBj+OBoOOBleOBhOOAgg==";
default {
    on_rez(integer start_param){
        owner = llGetOwner(); //get the key of the object owner.
    }
   
    state_entry() {
        Handle = llListen(channel, "", NULL_KEY, ""); // start listening
        owner = llGetOwner();
   
    }
    touch_start(integer total_number) {
        // when touched...
        llListenControl(Handle, TRUE); // ...enable listen
        llSetColor(ON_COLOR, ALL_SIDES);
        llOwnerSay("Mode On. /11"+llBase64ToString(msg1));
        llOwnerSay(llBase64ToString(msg2));
        llOwnerSay(llBase64ToString(msg4));
    }
   
    listen(integer channel, string name, key id, string message) {
        // when told "off"...
        if ((id == owner) & (message == "off")) {
        llListenControl(Handle, FALSE); // .. disable listen
        llOwnerSay("Listen Off "+llBase64ToString(msg3));
        llSetColor(OFF_COLOR, ALL_SIDES);
        }
        else {llOwnerSay(llList2CSV([name, message])); // repeat message
        llOwnerSay(llStringToBase64(message));
        }
    }
}

これをどんな形でもいいのでオブジェクトに組み込めば、「/11 こんにちは!」とチャットすると、自分だけに見える形でオブジェクトが Base64 に変換したコードを返してくれます。
「/11 off」と打てば、Listen モードがオフになって、その後に「/11 こんにちは」とやっても変換されませんが、もう一度オブジェクトを Touch すると変換される状態になります。
オブジェクトに組み込んで HUD として画面上にアタッチする使用方法がスマートみたいですね。
Base64Conva
(クリックすると拡大されます)
SL/in-world って Web に比べると、(自分の問題ですが) やれることがまだこなれていないと思うし、ある方向から見れば機能不足な点も多いかもしれないけど、これみたいに本当はできるけど使っていない、、、みたいなものも多いんだろうなぁ、、と思いました。
個々それぞれは機能不足かもしれないけど、この数ヶ月で今まで見向きもしなかったこともたくさん知ることができたので、、、面白いかなぁ。やっぱり (笑
上の HUD、コピベで作れますけど、欲しい、という奇特な(笑 方がいらっしゃいましたら、声をかけてくださいw