2008年11月6日木曜日

スクリプトの話(16)〜宿題の答え=発想の転換を

さて、既に15回を越えましたこの稿も、
今回からはスクリプトを書く時のヒントのようなものについて
触れていってみたいと思います。
そのまずは一回目。。。

前回変数の初期化について書いた時に、
僕自身が作った「世界時計HUD」の例を挙げました。
これは写真にあるように、画面右上に世界の時間を表示するもの。
時間の下にあるバーをクリックして文字色を変えたり、
時間の計算をしたりすることができます。



前回話題にしたのは、
折角お好みの色に変更しても、
次にログインした時に文字色が初期化されてしまうので、
最後に設定された色を覚えさせることはできないか、
というものでした。
さて、どうするか?

実は、前回これについては別の機会に、と書いたのは
記事自体が長くなったからというのもありますが、
実は、私自身、どういう処理をしたのか
全く覚えていなかったからです。^^;
そこで実際にスクリプトを見てみましたが、
それでも暫くは意味不明でした。w
そして、あっ、と思い出しました。

最後にどんな色に設定したか、
それをどうやって覚えさせるか、
そしてそれを起動時に取得するか。
ノートカードを利用することは考えられますが、
あんまり複雑は処理はしたくありません。
そこで、僕はじーっとこのHUDとにらめっこしたのです。

もう一度このHUDの写真をよく見て下さい。
実は、こうやって時間を並べるのに使っているのは
何のことはない、例の llSetText() なのです。
そう、フローティング・テキスト、
で、何の上にフロートしているかというと、
設定用のボタンとなっている下のバーですね。
ということは、そう、
このバーは HUD なので平面ですが、
実際にはブロック・オブジェクトなんです。

と、ここまで書けばおわかりでしょうか。
文字色の設定をする時に、このブロックも
同じ色に設定しているのです。
そして、このブロックの色は一旦設定されたら
起動時もその色のままのはずです。
私が state_entry() で書いている処理は次の1行でした。

  llGetColor(4);

これはそのオブジェクトのかっこ内の番号で示された面の
色を取得する関数です。
ここで4番というのがこのHUDのバーとなっている面の番号です。
文字の色そのものは保存できないので、
このオブジェクトの色をまず取得し、
その色を今度は文字の色として
設定し直すということをやっていました。
これであれば、敢えて色を保存したり
それを呼び出したりなんて複雑な処理はいらなくなりますね。
自動的に残ってしまっている値を
そのまま使えばよかったわけです。
ただ、ここで、
文字そのものに拘らず、同じ色を使っているオブジェクトに
視点を移したのが解決の鍵となりました。

リンデンのスクリプトに用意された関数は、
例えばエクセルの関数などに比べると随分少ない気がします。
例えば llSet〜 (値設定用の関数)はあるのに
セットとなるべき llGet〜(値取得用の関数)がないとか、その逆とか、
えー、何でこれないの〜? と驚くこともしばしばです。
基本的にはなかったらできません。
が、そこでないからできない、と諦めるかどうか。
何か他の方法はないか、
処理したい対象(今回の場合文字の色)を直接扱うのが無理なら、
他のもの(今回の場合バーのオブジェクト)を処理することで
回り道しながらでも実現できるかもしれません。
場合によっては、SLの中から抜け出して、
自分のWebサーバで処理させてもう一度SLに返すといったような
荒技まで考える必要があるかもしれません。

明らかに直球ではムリ!
そんな時こそ苦しみながらも
何か手はないかと考えるのが楽しみになってきますね。
そして、自分でも信じられないような解決を見いだした時の
嬉しさといったら!

。。。なんだけど、
自分がやったことを完全に忘れていたヒロシでした。w
今回はこの辺で。

     *   *   *

P.S. オブジェクトに色をつけたり、
テクスチャを貼ったりする時に、
面を指定したい時がありますね。
関数としては、

  llGetColor()/llSetColor()
  llGetTexture()/llSetTexture()
  llGetPrimitiveParams()/llSetPrimitiveParams()

などがあります。
が、自分が設定したい面が何番になるのか、
LSL Portal の「Face」の項を見てもよくわかりません。
こんな時は編集モードで、「テクスチャを選択」の状態で、
指定したい面を選択、丸に十字が出ているのを確認します。
そして、メニューから
Advance > Rendering > Selected Texture Info を選ぶか
ctrl + alt + shift + T(Macの方は cmd + option + shift + T)
と操作すると、画面左下に2行の情報が表示されます。
その最後の「face X」の「X」が面の番号ということになります。




大抵のスクリプトの入門書などでは
面の値に ALL_SIDES つまり全ての面を設定しているものが多く、
私自身面番号の指定で苦労したので
ここに補足として書いておきます。

No response to “スクリプトの話(16)〜宿題の答え=発想の転換を”

Leave a Reply