2008年11月26日水曜日

スクリプトの話(19)〜リストを使おう

前回はバーニング・ライフで使った
色が順番に変わるオブジェクトを例に
周期的に状態を変える方法について考えました。
そこで今回はその続きのような感じで、
もう少し考えてみたいと思います。

同じバーニングライフの僕のキャンプには、
星をイメージしたパーティクルが飛び交っていて
これが一定時間が経つと色がランダムに変化するような
そんな仕掛けにしてありました。

ランダムと言えば、乱数を発生させる関数を持って来ればできそうですが、
ここで扱うのは色というベクトル型の変数であるし、
何よりランダムと言っても、とんでもない色ばかり出て来ても困るので、
出来れば指定した色の中でランダムに変わるのが望ましいのです。
そんな欲張りなことができるのか?
そう、出来れば好きな色のリストみたいのがあって、
その中で順番がメチャクチャに入れ替われば……。

と思ってはたと思いつきました。
そうです。リストです。
整数型や文字列型のように頻繁に出て来るわけではないので、
目立たない、ジミ〜な存在ですが、
リンデン・スクリプトにはリスト型という変数があるのです。
これはいろんなものをまとめて放り込んでおける
なかなか便利な変数なのです。

昨日と同じく、青、赤、黄に白を加えた4色の間で
ランダムに色を変化させるということにして、
この4色のリストを作りましょう。
宣言の方法も簡単です。
要素をブラケット(四角い括弧)で囲んで
カンマで区切って並べるだけです。

list lstColors = [ <0.0, 0.0, 1.0>, <1.0, 0.0, 0.0>, <1.0, 1.0, 1.0>,
  <1.0, 1.0, 1.0>];

今、lstColors というリスト変数の中は、青、赤、黄、白という色が
順番に並んでいます。
ここで関数の登場。その名もズバリ!

llListRandomize()

文字通り、リストをランダムにする関数です。w
ランダムにした後どうするか?
出来たリストから1番目の要素を取り出してあげればいいのです。
そして、その要素を取り出すのが、変数によって異なりますが、

llList2〜()

という関数で、今回はベクトル型なので、

llList2Vector()

を使います。
昨日のスクリプトを参考にして、
20秒毎に色をランダムに変化させるには次のようにします。

default {
  state_entry(){
  }

  touch_start(integer total_number){
    llSetTimerEvent(20);
  }

  timer(){
    llSetColor(llList2Vector(llListRandmize(lstColors), 0),
      ALL_SIDES);
  }
}

llList2Vector() の2番目の引数が
リストの何番目の値を取ってくるかを示すもので、
1番目は「0」になります。
関数が入れ子入れ子になっててややこしそうですが、
何ともシンプル、1行で終わってしまいました。w

ん? ということは?
昨日の順番に色が変わるスクリプトも
このリストを使えばすっきりするのでは?

i = 0;

default {
  state_entry(){
  }

  touch_start(integer total_number){
    llSetTimerEvent(20);
  }

  timer(){
    llSetColor(llList2Vector(lstColors, i), ALL_SIDES);
    i++;
    if (i >= llGetListLength(lstColors) - 1) {
      i = 0;
    }
  }
}

llGetListLength() は、リストの要素の個数を返す関数です。
例えば今回の場合、青、赤、黄、白の4個になります。
但し、リストの順番も、カウンター変数 i の値も
「0」からスタートしているので、1を引いているわけですが、
昨日の「if 文」がずらずらっと並んだものに比べると
何ともシンプルになりましたね。
カウンターの値を増やしながら、
そのカウンターの値と同じ順番の色を持って来い、
と言っているわけです。
そしてカウンターが要素の数だけ増えると
また0に戻してあげているのですね。

リストはこのように順番に処理させる時にも使えますし、
それから、先に書いたようにいろんな要素を入れられるので、
データベースのような使い方もできます。
例えば、昨日ご紹介した、仲間のブログを表示する
メッセージボードですが、
あれは実はセカンドライフの中から僕のRLのサイトにアクセスして、
次のようなCSVファイルを作らせています。

記事1のURL, 記事1のタイトル, 記事1の更新日
記事2のURL, 記事2のタイトル, 記事2の更新日
記事3のURL, 記事3のタイトル, 記事3の更新日……

もうお分かりですね?
タイマーでこのファイルを1行ずつ取ってくるのですが、
その時に、1行の3つの要素、
記事のURLとタイトルと更新日とをリストに入れるのです。
そしてそのリストからタイトルと更新日を取り出して表示に使い、
URLは取り出したらそれをタッチスクリプトに入れて、
メッセージボードをタッチするとその記事がブラウザで開くように
設定してあるわけです。



今のところ、説明が飛ばしすぎで分からない、という方は
ごめんなさい、あまり気にしなくてもいいです。
とにかく、リストを使うといろんな複雑な処理も
簡単に行えるようになるのだ、
というくらいお分かり頂ければ幸いです。

あまり馴染みのないリスト型ですが、
このように複雑な「if 文」を使わずに済んだりと
いろいろ便利な使い方ができるので、
皆さんもいろいろ研究してみられてはいかがでしょう?

それでは今日はこの辺で。

No response to “スクリプトの話(19)〜リストを使おう”

Leave a Reply