Jamaica
2008年03月23日
08:37
今回は窓をつくります。窓といってもただの窓ではありません。中が見えないようにカーテンをつけます。さらに、そのカーテンを開け閉めできるようにします。もちろん誰でも開けられるようでは困るので、特定の人しか開け閉めできないようなカーテンにします。
いままでは、サンプルスクリプトをそのまま入れてスクリプトを動かすことで、スクリプトを使う楽しさを体験してもらうことを狙いとしてきました。今回は一応設計めいたことに挑戦してみましょう。と言っても難しいことはありません。手順を追ってきちんとやっていけばだれにでもできます。
まず、「何をしたいのか(させたいのか)」を明確にしましょう。
そのために「なにをしなければいけないか」、もしくは「なくてはいけないか」もはっきりさせましょう。こういうこと5W1Hに従い「いつ、どこで、だれが、なにを、どうやって」実現するのか整理しておきます。
1)窓にカーテンをつける
いつ?>常に。どうやって?>カーテンのついた窓のテクスチャーを貼る。
2)カーテンを開ける
いつ?>窓にタッチしたとき。誰が?>特定のグループのメンバーが。どうやって?>テクスチャーを貼りかえる。
3)カーテンを閉める
いつ?>窓にタッチしたとき。誰が?>特定のグループのメンバーが。どうやって?>テクスチャーを貼りかえる。
4)特定の人だけカーテンを開けられる
いつ?>タッチしたとき。どうやって?>タッチした人がグループメンバーかどうか検知する。
前回のドアの時もそうでしたが、スクリプトには状態 (state) という概念があります。前回のドアの時はドアの開いた状態(state open) と閉まった状態(state close) がありました。また、それ以外に実際のスクリプト上では初期設定を行う default という状態もありました。今回もカーテンの開いた状態と閉まった状態がありますので状態(state)に関してはドアの時と同じです。今回はdefault の状態をカーテンの閉まった状態(close) と考え、default と state open の二つの状態(state)でスクリプトを作ってみたいと思います。
スクリプトを書いていくときに、最初の状態(state) は必ず default が使われます。この default という状態(state)の中でやってもらいたいことをスクリプトを使って書いていきます。やってもらいたいことはさっき書き出したとおりですね。まずは(1)窓にカーテンをつける=カーテンのついた窓のテクスチャーをプリムに貼って窓をつくる。でしたね。今回使うテクスチャーはカーテンが閉まった状態の窓とカーテンが開いた状態の窓、それを内側と外側それぞれ作ります。合計4枚のテクスチャーが必要になるということです。まず、カーテンの閉じた状態の窓のテクスチャーを貼ることにしましょう。
default
{
state_entry()
{
llSetPrimitiveParams([PRIM_TEXTURE, 1, "cartaincloseout", , , 0]);
llSetPrimitiveParams([PRIM_TEXTURE, 3, "cartainclosein", , , 0]);
llSetPrimitiveParams([PRIM_TEXTURE, 0, "Brazillian rosewood", , , 0]);
llSetPrimitiveParams([PRIM_TEXTURE, 2, "Brazillian rosewood", , , 0]);
llSetPrimitiveParams([PRIM_TEXTURE, 4, "Brazillian rosewood", , , 0]);
llSetPrimitiveParams([PRIM_TEXTURE, 5, "Brazillian rosewood", , , 0]);
}
}
"cartaincloseout" が閉じたカーテンのテクスチャー外側、"cartainclosein" が閉じたカーテンのテクスチャー内側です。"Brazillian rosewood" というのは窓枠の部分に貼ったテクスチャーです。SLを始めた時に初期でついてきたテクスチャーの中にありますが、ここはそれぞれ好みで色んなテクスチャーを選んでください。上記スクリプトと、スクリプトの中で指定したテクスチャーをオブジェクトのコンテンツの中に入れると、下の写真のように窓の体裁をなすようになります。
わかりやすいようにコピーして、窓の内側と外側が見えるようにしました。
次にカーテンの開いた状態の窓を作ってみることにしましょう。作り方はカーテンの閉じた状態の窓と全く同じです。
ただし、テクスチャーだけが窓の開いた状態のものに変わります。今回は "cartainopenout" と "cartainopenin" という名前になっています。
default
{
state_entry()
{
llSetPrimitiveParams([PRIM_TEXTURE, 1, "cartainopenout", , , 0]);
llSetPrimitiveParams([PRIM_TEXTURE, 3, "cartainopenin", , , 0]);
llSetPrimitiveParams([PRIM_TEXTURE, 0, "Brazillian rosewood", , , 0]);
llSetPrimitiveParams([PRIM_TEXTURE, 2, "Brazillian rosewood", , , 0]);
llSetPrimitiveParams([PRIM_TEXTURE, 4, "Brazillian rosewood", , , 0]);
llSetPrimitiveParams([PRIM_TEXTURE, 5, "Brazillian rosewood", , , 0]);
}
}
下の写真をご覧ください。ちゃんとカーテンが開いて窓の向こうの景色が見えますね。わかりやすいようにカーテンを閉めた状態のものと並べてみました。
あとはこの二つの状態をいったりきたりできるようにすればいいわけです。最初に5W1Hで整理したように、タッチしたときに切り替わるようにしたいんでした。そこで窓にタッチしたときに二つの状態を行ったり来たりできるようなスクリプトを追加します。開閉二つの状態と、その間を窓にタッチするたび行ったり来たりできるスクリプトは下記のようになります。
default
{
state_entry()
{
llSetPrimitiveParams([PRIM_TEXTURE, 1, "cartaincloseout", , , 0.0]);
llSetPrimitiveParams([PRIM_TEXTURE, 3, "cartainclosein", , , 0.0]);
llSetPrimitiveParams([PRIM_TEXTURE, 0, "Brazillian rosewood", , , 0]);
llSetPrimitiveParams([PRIM_TEXTURE, 2, "Brazillian rosewood", , , 0]);
llSetPrimitiveParams([PRIM_TEXTURE, 4, "Brazillian rosewood", , , 0]);
llSetPrimitiveParams([PRIM_TEXTURE, 5, "Brazillian rosewood", , , 0]);
}
touch_start(integer total_number)
{
state open;
}
}
state open
{
state_entry()
{
llSetPrimitiveParams([PRIM_TEXTURE, 1, "cartainopenout", , , 0.0]);
llSetPrimitiveParams([PRIM_TEXTURE, 3, "cartainopenin", , , 0.0]);
llSetPrimitiveParams([PRIM_TEXTURE, 0, "Brazillian rosewood", , , 0]);
llSetPrimitiveParams([PRIM_TEXTURE, 2, "Brazillian rosewood", , , 0]);
llSetPrimitiveParams([PRIM_TEXTURE, 4, "Brazillian rosewood", , , 0]);
llSetPrimitiveParams([PRIM_TEXTURE, 5, "Brazillian rosewood", , , 0]);
}
touch_start(integer total_number)
{
state default;
}
}
見ていただくとわかるとおり、カーテンが閉まった状態(default)の方は touch_start(integer total_number) という部分とstate open; という部分が追加されました。これは「タッチしたときに、state open という状態(state)に移行するということを意味しています。同様にしてカーテンが開いた方の状態(state open)の方も、touch_start(integer total_number) と、こちらは state default; という記述があります。これも同様に「タッチしたときにstate default(つまりカーテンの閉まった状態)に移行しますということです。
上記スクリプトと4種類のテクスチャー(窓の開閉x内と外)を窓のプリム(オブジェク)のコンテンツに入れて家にとりつけてみました。それが下の写真です。
タッチするとちゃんとカーテンが開いて部屋の中が見えます。当然部屋からもカーテンを開けて外を見ることができます。
最後の仕上げはセキュリティーですね。タッチしたときにグループメンバー以外はカーテンを操作できないようにします。
グループメンバーかどうかを検知するには llDetectedGroup(0) という機能を使います。この機能を用いて条件文をつくり、グループメンバーであればカーテンが開き(閉じ)、グループメンバーでない場合は"You are not granted to touch" というメッセージが出るようにします。これを行うために以下の記述を touch_start(integer total_number) に続けて加えます。
touch_start(integer total_number)
{
if(llDetectedGroup(0);)
{
state open; ((閉める場合は state defualt; )
}
else
{
llSay(0, "You are not granted to touch");
}
これを入れて完成させたスクリプトが下記のものです。
default
{
state_entry()
{
llSetPrimitiveParams([PRIM_TEXTURE, 1, "cartaincloseout", , , 0.0]);
llSetPrimitiveParams([PRIM_TEXTURE, 3, "cartainclosein", , , 0.0]);
llSetPrimitiveParams([PRIM_TEXTURE, 0, "Brazillian rosewood", , , 0]);
llSetPrimitiveParams([PRIM_TEXTURE, 2, "Brazillian rosewood", , , 0]);
llSetPrimitiveParams([PRIM_TEXTURE, 4, "Brazillian rosewood", , , 0]);
llSetPrimitiveParams([PRIM_TEXTURE, 5, "Brazillian rosewood", , , 0]);
}
touch_start(integer total_number)
{
if(llDetectedGroup(0))
{
state open;
}
else
{
llSay(0, "You are not granted to touch");
}
}
}
state open
{
state_entry()
{
llSetPrimitiveParams([PRIM_TEXTURE, 1, "cartainopenout", , , 0.0]);
llSetPrimitiveParams([PRIM_TEXTURE, 3, "cartainopenin", , , 0.0]);
llSetPrimitiveParams([PRIM_TEXTURE, 0, "Brazillian rosewood", , , 0]);
llSetPrimitiveParams([PRIM_TEXTURE, 2, "Brazillian rosewood", , , 0]);
llSetPrimitiveParams([PRIM_TEXTURE, 4, "Brazillian rosewood", , , 0]);
llSetPrimitiveParams([PRIM_TEXTURE, 5, "Brazillian rosewood", , , 0]);
}
touch_start(integer total_number)
{
if(llDetectedGroup(0))
{
state default;
}
else
{
llSay(0, "You are not granted to touch");
}
}}
スクリプト全般に言えることですが、中で使われている括弧( { や } )の数に気をつけてください。
ちゃんと正しい場所に使われているか。もしくは前の括弧と後の括弧の数が合っているかなどです。実際にスクリプトを書くときには In World (SL内)でエディターを使って書いていきますので、括弧に限らず誤りがあると保存するときにエラーが出て知らせてくれます。よくある文法エラーとしてはこの括弧の間違いや、セミコロンのつけ忘れ、もしくはいらないところにつけてる、などがあります。この辺は習うより慣れろで実際に使っているうちに誤りも少なくなってくるでしょう。
長い記事でしたが、ようやく終了です。グループ限定のセキュリティーの方もちゃんと動いてくれました。(下写真)
家づくりが一段落したので、今度は久しぶりに Avimatar で遊んでみましょう。前回は静止ポーズでしたが、次は動きのあるものに挑戦です。題材としては、もはや旬は過ぎた感は否めませんが小島よしおですw お楽しみに。