日本時間を表示するLSL(Linden Script Language)のTips を説明します。
建造ウィンドウで適当なプリムを制作し、以下のLSL-Tips を組み込んでください。
スクリプトを使用するだけであればスクリプトの内容を理解する必要はありません。
(Tipsをコピー&ペーストするだけで動きます)
●日本時間表示のスクリプト
integer JISA = 9;
integer time;
integer hours;
integer minutes;
integer seconds;
update()
{
time = (integer)llGetGMTclock();
hours = time / 3600;
minutes = (time - hours*3600) / 60;
seconds = time - hours*3600 - minutes*60;
hours = (hours + JISA) % 24;
}
default
{
state_entry()
{
llSetTimerEvent(1);
}
timer()
{
update();
llSetText((string)hours + ":" + (string)minutes + ":" + (string)seconds,
<1.0,1.0,1.0>,1.0);
}
}
●時計の配付
スクリプト組込済みのオブジェクト(時計)を無料配付しています。サイズやテクスチャーなど自由に変更できます。スクリプトも見られるので、いろいろと改良を加えてみてください。
Game Forum:http://slurl.com/secondlife/Game%20Forum/210/204/22 
スクリプトを改造したり、他のスクリプトと合成したりする際にはスクリプトの内容を理解しておく必要があります。以下で、スクリプトの内容を説明します。なお、説明はスクリプトの基礎知識(本ブログのスクリプト超初心者講座、等)を前提としています。
●定数
グリニッジ標準時と日本時間との時差(JISA)は9時間です。整数型で時差(JISA)を定義します。
integer JISA = 9;
●グローバル変数
time:グリニッジ標準時を秒単位で保存するための変数です。
hours:時間を保存するための変数です。
minutes:分を保存するための変数です。
seconds:秒を保存するための変数です。
●関数
http://rpgstats.com/wiki/index.php?title=Ja:functions
float llGetGMTclock()
http://rpgstats.com/wiki/index.php?title=LlGetGMTclock
グリニッジ標準時を得る関数です。
llSetTimerEvent(float sec)
http://rpgstats.com/wiki/index.php?title=LlSetTimerEvent
パラメーターで指定した秒数毎に、timerイベントを発生させます。
タイマーを止めるときはパラメーターに0秒を指定します(例2)。
例1:llSetTimerEvent(3.0) // 3秒毎にtimerイベントを発生
例2:llSetTimerEvent(0.0) // タイマーを止める
llSetText(string text, vector color, float alpha)
http://rpgstats.com/wiki/index.php?title=LlSetText
プリム上に文字列を表示する関数です。
1番目パラメーターで表示する文字列を指定します。
2番目パラメーターで色を指定します。
3番目パラメーターでアルファー値を指定します。
例1:llSetText(“ABC”, <0.0,0.0,1.0>, 1.0) // 文字列”ABC”を青色で表示
例2:llSetText(“XYZ”, <1.0,1.0,1.0>, 0.5) // 文字列を白色半透明で表示
●ユーザー定義関数
http://rpgstats.com/wiki/index.php?title=UserDefinedFunction
update()
update関数にパラメーターはありません。関数がよばれた時の日本時間を計算します。
time = (integer)llGetGMTclock();
変数timeにグリニッジ標準時を秒単位で代入します。
例えば、グリニッジ標準時で10時の場合、36000秒となりtimeに36000が代入されます。
hours = time / 3600;
time / 3600により、秒単位のtime から時間(hours)を計算します。
例えば、time が8000秒であれば、8000 / 3600 = 2.222…ですがhours は整数型なので小数点以下がカットされ、hours には2が代入されます。
minutes = (time - hours*3600) / 60;
seconds = time - hours*3600 - minutes*60;
これらの計算はhours計算と同様に考えられます。
hours = (hours + JISA) % 24;
グリニッジ標準時と日本時間の時差は9時間なので、時差(JISA)を足しています。
そのままでは、24以上になるので24の剰余を計算(%)しています。
例えば、30 / 24 は1余り6なので、30 % 24 は6となります。
以下、参考資料
http://rpgstats.com/wiki/index.php?title=LlGetWallclock
●イベント
http://rpgstats.com/wiki/index.php?title=Ja:events
state_entryイベント
http://rpgstats.com/wiki/index.php?title=State_entry
1秒毎のタイマーを設定します。
timerイベント
http://rpgstats.com/wiki/index.php?title=Timer
update関数を呼び出します。
「時間:分:秒」の書式のテキストを表示します。
●考察・課題
このプログラム何かおかしいですよね^^ タイマー使っているのに1秒ごとにグリニッジ標準時から日本時間を計算しています。タイマー使っているのだから日本時刻の計算は頻繁に行う必要はないはずです。タイマーが正確に動くのであれば、グリニッジ標準時から日本時間を計算するのはrezの際だけでOKなわけです。
60秒に一度だけグリニッジ標準時から日本時間を計算し、それ以外はタイマーでカウントするプログラムに修正してみてください。
プログラミング初心者向けにLSL超初心者講座を開講してきましたが残りも後少しとなりました^^
そこで、次のステップとして、LSL-Tips制作講座をはじめたいと思います。
●LSL-Tips制作講座
以下の内容と目標で行きたいと思います。
・内容:いろいろなLSL-Tipsを制作します。簡単な商品を制作します。
・目標:自分でいろいろTipsが作れる。簡単な商品が作れる。
ちなみに、LSL超初心者講座・LSL初心者講習会の内容と目標等は以下でやってきました。
●LSL超初心者講座(ブログ・HP)
・内容:LSLを用いてプログラムの基礎を解説します。
・目標:プログラム基礎とLSL文法を理解する。
●LSL初心者講習会(SIM)
・内容:LSLを用いてプログラムの基礎を解説します。既存のTipsを解読し改造します。簡単なTipsを制作します。
・目標:プログラム基礎とLSL文法を理解する。既存のTipsを解読し改造できる。簡単なTipsが作れる。
・期間:週1回(3ヶ月/全12回)、各80分、有料
現在、ブログ・HP・SIMを使用して各種講座・講習会を実施しています。少しゴチャゴチャしてきたので整理したいと思います。
●講座と講習会
ブログやHPの記事は「講座」と分類しました(例:LSL超初心者講座)。一方、SIMにおける実地講習は「講習会」と分類しました(例:Particle Drive 講習会)。
●スタディーとラーニング
「講座」は各自で勉強していただく教材となるように心がけています。ただ、「講座」ではどうしても伝えきれない部分が出てきてしまいます。そのため、「講座」を補完するために「講習会」を実施しています。
「講座」は自ら勉強する(スタディー)ためのもので、「講習」は講師や他の人と共に学ぶ(ラーニング)ためのものです。
講座 ⇒ スタディー(自習用)
講習 ⇒ ラーニング(教習用)
プログラムの制御構造には次の3種類がありました。
・順次処理
・分岐処理
・繰返処理
既に、順次処理と分岐処理については説明しました。今回は、制御構造の最後である「繰返処理」を解説します。
まず、オブジェクトをタッチすると、3回「Hello!」とチャットするプログラムを記述します。
default
{
touch_start(integer t_num)
{
llOwnerSay(“Hello!”);
llOwnerSay(“Hello!”);
llOwnerSay(“Hello!”);
}
}
順次処理(llOwnerSay)を3回記述しています。
●for文
上記プログラムを、「繰返処理」の一種類であるfor文で記述してみます。
default
{
touch_start(integer t_num)
{
integer i;
for (i = 0; i < 3; i++)
{
llOwnerSay(“Hello!”);
}
}
}
変数「i」 をカウンターとよび、後に続くfor文で使用します。for文にはカウンター変数が必要です。
変数名は任意です。
for文を使用した繰返処理は以下の構造となっています。
カウンター定義
for (カウンター初期化; 繰返条件; カウンター更新)
{
処理本体
}
プログラムから対応する部分を抜き出しますので、見比べてください。
integer i;
for (i = 0; i < 3; i++)
{
llOwnerSay(“Hello!”);
}
上記プログラム部分をフローチャートにしてみます。
実は、「繰返処理」を一つの記号で表現するようなフローチャート記号はありません。繰返処理のフローチャートは順次処理と分岐処理の組み合わせで表現します。
□インクリメント(復習)
記号「++」、プラスプラスをインクリメントとよびました。i++; は、i = i + 1; と同じ意味です。
すなわち、変数i の値に1を足しています。
上記フローチャートをフローに沿って解説します。
(1)カウンター定義:
カウンターを整数型で変数名i で定義します。integer i;
(2)カウンター初期化:
カウンターi に値0 を代入します。i = 0
(3)分岐条件:
カウンターi と値3を比較します。i < 3
(4)分岐条件が「Yes」の場合:
・処理本体を実行します。llOwnerSay(“Hello!”);
・カウンター更新。i++
・(3)に戻る
(5)分岐条件が「No」の場合:
・繰返処理終了
●定石
For文はいろいろな記述方法があります。10回繰返す場合、次の記述が考えられます。
・for (i=0; i<10; i++)
・for (i=1; i<=10; i++)
どちらも正しく動きますが、前者が推奨されます。これは定石として暗記しましょう!
●実習
タッチしたら「Ohayo!」チャットを10回繰返す箱オブジェクトを作成してください。
「週刊懸賞生活」の第21号(12月23日発行)で、Teleportation Panel を掲載していただけることになりました! danbo さんありがとうございます^^
Teleportation Panel はシム内テレポートをワンクリックで行う装置です。 
抽選で3名様にプレゼントです。
●Teleportation Panel の特徴
(1)ワンクリックでテレポート
(2)超簡単セッティング
(3)最大移動距離470メートル
(4)形・サイズ・テクスチャー変更可
(注)シム内テレポート専用。最大高低差300メートル
Teleportation Panel の詳細につきましては、
本ブログのカテゴリー(テレポテーション)をご参照ください。
●展示販売
MagSL - Tokyo2 - ToshimaKu の中央にあるSIROYA(レンガ壁)にてTeleportation Panel を展示販売しています。
http://slurl.com/secondlife/ToshimaKu/153/175/22
りんごやバナナに変形させたTeleportation Panel も展示しています。
●「週刊懸賞生活」マガジン
「週刊懸賞生活」マガジンはお近くの配付スタンドをクリックすることで入手できます。
SL Game Forum にも配付スタンドがありますのでご利用ください。
http://slurl.com/secondlife/Game%20Forum/146/123/22 
「週刊懸賞生活」への申込方法等は、
「セカンドライフ(Second Life)の懸賞生活日記」をご覧ください。
http://ameblo.jp/secondlife-kensho/
LSL超初心者講座もかなり進んできました。そこで、グローバル変数とif 文などを用いて、LSL-Tips(スイッチ) を作ってみます。
また、LSL-Tips(スイッチ)の応用例としてLSL-Tips(スライドドア)を解説します。
●Tips(スイッチ)
クリックの度に、スイッチのON・OFFが切り替わるようなスイッチを作ります。
プリムをクリックするとスイッチONとなり、もう一度クリックするとスイッチOFFとなります。
具体的には以下の仕様とします。
・最初クリックすると「ON」とチャットする
・次にクリックすると「OFF」とチャットする
・後は、クリック毎に「ON」・「OFF」を交互にチャットする
◇制作方針
クリックすると動作するので、今まで通りtouch_start イベントを使用します。そして、スイッチがONかOFFかを記憶するための変数を定義します。変数の型は何でもいいのですが、整数型を使用します。変数名はisON とします。
integer isON;
スイッチがON のとき変数isON の値は1とし、スイッチがOFFのとき変数isON の値は0とします(そのように変数を使うと決めます)。
変数isON はtouch_start イベントの中で宣言することもできます。
しかしそうすると、プリムをクリックする度に(touch_start イベントが発生する度に)、変数isON を宣言することとなり変数isON の値がクリアされてしまいます。
すなわち、スイッチがON(isON が1)かOFF(isON が0)かを記憶しておくことができません。
そのため、変数isON をグローバル変数として宣言します。
◇フローチャート
以下に、Tips(スイッチ)のフローチャートを示します。 .jpg)
フローに沿って説明します。
まず、プログラムをスクリプトエディターで記述し、スクリプトエディターの右下にある「保存」ボタンをクリックすることで、プログラムがコンパイルされリンデン社にあるサーバーに保存されます(Rez します)。
Rez されたオブジェクトは早速動き始めます。
最初、グローバル変数isON を宣言し値に0 を代入します。その後、defaultステートに移り、イベントが発生するのを待ちます。
オブジェクトをクリックすることでtouch_start イベントが発生します。
isONが0 ならば「ON」とチャットし、isON に1 を代入します。
isONが1 ならば「OFF」とチャットし、isON に0 を代入します。
Touch_start イベントを終了し、またイベントが発生するのを待ちます。
演習1:
クリックする度にON・OFFが切り替わることを、フローチャートをトレースして確認してください。ON・OFFが切り替わるアルゴリズムを理解してください。
◇プログラム
上記フローチャートをプログラムにします。
integer isON = 0;
default
{
touch_start(integer total_number)
{
if (isON == 0)
{
llOwnerSay("ON");
isON = 1;
}
else
{
llOwnerSay("OFF");
isON = 0;
}
}
}
実習1:
「箱」プリムをrez し、上記プログラムを実際に動かしてみてください。クリックすることで、ONとOFFが切り替わることを確認してください。
●スライドドアのヒナ型
Tips(スイッチ)は2つの状態をクリックで切り替える際に利用できます。
例えば、照明のオン・オフ、ドアの開閉、パーティクル効果の有無、などなど
◇プリムの制作
以下のサイズの「箱」プリムを作ります。スライド方向はX方向です。
・X方向に1.70メートル
・Y方向に0.07メートル
・Z方向に3.00メートル .jpg)
◇プログラム
スクリプトエディターを用いて、以下のプログラムを作ります。
integer isOpen = FALSE;
vector SLIDE_VEC = <1.5, 0.0, 0.0>; // meter
default
{
touch_start(integer total_number)
{
vector doorPos = llGetPos();
if (isOpen == FALSE)
{
llSetPos(doorPos + SLIDE_VEC);
isOpen = TRUE;
}
else
{
llSetPos(doorPos - SLIDE_VEC);
isOpen = FALSE;
}
}
}
プログラム解説:
プログラムの大筋(骨格)はTips(スイッチ)と同じです。TRUE、FALSE は定数でそれぞれの値は1と0 です。
グローバル変数として新たにベクトル型の変数を宣言しています。変数名はSLIDE_VEC とし、スライドするベクトル(長さと方向)を指定します。長さは1.50メートルで、方向はX方向です。
タッチした時の、ドアの位置をllGetPos関数で求めています。それを変数doorPos に代入します。
ドアが閉まっているときは、ドアの現在位置にSLIDE_VEC を足した位置にドアを移動させます。ドアプリムを移動させるために、llSetPos関数を使用します。
ドアが開いているときは、ドアの現在位置からSLIDE_VEC を引いた位置にドアを移動させます。
実習2:
実際にスライドドア・プリムを制作し、「スライドドアのヒナ型」を動かしてみてください。ドアの開閉ができることを確認してください。
●Tips(スライドドア)
実は、「スライドドアのヒナ型」はまだ一般的なスライドドアとしては使用できません。実習2の段階で気が付かれた方もいると思いますが、スライドドアを回転させた場合におかしな方向にスライドしてしまいます。
これは、スライドする方向が常にX方向となっているためです。
座標系には2種類あり、グローバル座標系とローカル座標系があります。
テレポートなでの際に指定する座標がグローバル座標です。
例:http://slurl.com/secondlife/Game%20Forum/35/63/25 の<35,63,25>
一方、オブジェクトに付随する座標系をローカル座標系といいます。
スライドするベクトル(大きさと方向)をグローバル座標からローカル座標に変換する必要があります。llGetRot関数でスライドドアの回転角度を求め、以下の掛け算をします。
SLIDE_VEC * llGetRot();
説明は省略しますが、グローバル座標からローカル座標への変換方法だと理解してください。
//
// Slide Door Ver.0.1
//
// This Script was produced by Second Life Planet
// prototype in 2007/08/16.
//
// http://gameworkshop.blog106.fc2.com/
//
integer isOpen = FALSE;
vector SLIDE_VEC = <1.5, 0.0, 0.0>; // meter
default
{
touch_start(integer total_number)
{
vector doorPos = llGetPos();
rotation doorRot = llGetRot();
if (isOpen == FALSE)
{
llSetPos(doorPos + SLIDE_VEC * doorRot);
isOpen = TRUE;
}
else
{
llSetPos(doorPos - SLIDE_VEC * doorRot);
isOpen = FALSE;
}
}
}
実習3:
Tips(スライドドア)を動かしてみてください。ドアを回転させて設置してもドアの開閉が正常に行えることを確認してください。
●スライドドアの配付
スライドドアを下記で無料配付しています。サイズやテクスチャーなど自由に変更できます。スクリプトも見れるので、いろいろと改良を加えてみてください。
Game Forum:http://slurl.com/secondlife/Game%20Forum/8/111/22
一般に、完結した短いスクリプトのことをTips とよびます。そのため、各Tips は何か一つの機能を実現している場合が多いです(単機能)。
単機能のTips を複数合成することで、多機能にすることができます。
2つのTips を合成する場合、簡単に合成する方法と複雑に合成する方法があります。
・簡単に合成する場合、2つのTips をそのまま使用します。
・複雑に合成する場合、2つのTips から1つのTips を作成します。
●簡単に合成する方法
オブジェクトには複数のスクリプトを入れることができます。
そのためオブジェクトに、Tips A という名前のスクリプトと、Tips B という名前のスクリプトを入れることでTips A の機能とTips B の機能を合成できます。 
例を挙げると、
Tips A が「雪を降らせる」スクリプトで、Tips B が「ジングルベルを演奏する」スクリプトだとします。
この場合、2つのTips を一つのオブジェクトのコンテンツに入れることで、そのオブジェクトは「雪を降らせながら、ジングルベルを演奏する」オブジェクトとなります。
このように、2つのTips を簡単に合成した場合、2つのTips は「独立して動き」ます。
●複雑に合成する方法
2つのTips が「協調して動く」ようにするには、2つのTips を1つのTips にする必要があります。
2つのTips を一旦分解して、1つのTips に再構成します。いわばTips を改造することになり、プログラミングの初歩的知識が必要となります。
例を挙げると、
Tips A が「センサーでアバターを検知する」スクリプトで、Tips B が「音をならす」スクリプトだとします。
(これらのTips はAipiro さんHPから引用させていただきました。快諾していただき有難うございます^^)
もう少し具体的には、各Tips の機能は以下のとおりです。
Tips A:「センサーでアバターを検知し、オーナーにお客さんが来たことをチャットで伝える」
Tips B:「オブジェクトをタッチすると、音をならす」
この2つのTips から新たなTips を作成します。
Tips C:「センサーでアバターを検知し、音をならす」
Tips A とTips B を先に説明した「簡単に合成する方法」で合成してもうまくいきません。
2つのTips は独立して動きますが、協調して動いてはくれません。
プログラムを見ていきます。
(各Tipsの詳細はAipiro さんHP をご参照ください)
□Tips A:
「センサーでアバターを検知し、オーナーにお客さんが来たことをチャットで伝える」
default
{
state_entry()
{
llSensorRepeat("", "", AGENT, 2, TWO_PI, 1.0);
}
sensor(integer total_number)
{
llOwnerSay("The guest arrived.");
}
}
・・・パラメータ説明
llSensorRepeat 関数の4番目パラメータは「センサー検知エリア」を半径で指定します。現在は2mです。
llSensorRepeat 関数の6番目パラメータは「センサー検知時間」を時間間隔で指定します。現在は1秒です。1秒に1回センサーを動かします。
□Tips B
「オブジェクトをタッチすると、音をならす」
default
{
state_entry()
{
llPreloadSound("Chime sound");
}
touch_start(integer total_number)
{
llPlaySound("Chime sound",1.0);
}
}
・・・パラメータ説明
llPlaySound 関数の2番目パラメータは「音量」です。0.0〜1.0の範囲の数値を指定します。最大音量は1.0 です。
□Tips C
「センサーでアバターを検知し、音をならす」
default
{
state_entry()
{
llSensorRepeat("", "", AGENT, 2, TWO_PI, 1.0);
llPreloadSound("Chime sound");
}
sensor(integer total_number)
{
llOwnerSay("The guest arrived.");
llPlaySound("Chime sound",1.0);
}
}
これらのプログラムを見ると、2つのプログラムをトランプのシャッフルのように混ぜ合わせて、新たなプログラムを作っていることがわかります。
●玄関センサー
以前、2つのTips の合成方法について、レイさんから相談を受けました。話を伺うと、訪問者履歴を取るような本格的なものではなく、カフェバー「天空」の玄関チャイムのような簡単なものをイメージしていました。
Tips C は玄関センサーとして使用可です。ただ、若干使いづらい点があるので、少し修正します。
修正1:連続検出の回避
Tips C をそのまま使用するとすぐに気がつくのは、同一アバターを連続して検出してしまうことです。
玄関に設置するので、「アバターは玄関を通過する」のでOKなのですが、玄関付近に立ち止まったりした場合にこの現象が起きます。
以下のように、llSleep 関数を使用して連続検出を回避します。
default
{
state_entry()
{
llSensorRepeat("", "", AGENT, 2, TWO_PI, 1.0);
llPreloadSound("Chime sound");
}
sensor(integer total_number)
{
llPlaySound("Chime sound",1.0);
llSleep(10.0); // sensor off time
}
}
・・・llSleep 関数はスクリプトの実行を停止させる関数です。パラメータはスクリプト停止の時間(秒)です。10秒間スクリプトを停止させています。
修正2:オーナー検出の回避
玄関センサーなので、オーナーを検出しても問題ないのですが、一応対策を記述しておきます。
Key ownerKey = llGetOwner();
と、ownerKey変数にオーナーのUUID を代入しておき、sensor イベントでセンサーが反応したアバターを一人ずつオーナーか否かをチェックすれば対応できます。
□設置場所とパラメータ調整
Tips は短いプログラムなのでなかなか融通は利きません。そこで、設置場所を工夫したり数少ないパラメータを調整したりして対応してみてください。
・・・検知エリア:2mは結構短いです。玄関サイズに合わせてください。
・・・反応時間間隔:0.5秒でも良いかもです。
・・・無反応時間:テストして調整してください。
玄関センサーなので、その精度は「訪問者をどの程度見落とし無く検出するか」です。
製品版であれば、訪問者の見落としがあると問題なのですが、今回のTips はそんなに精度良くないと思います。例えば、高速で(飛行して)訪問したアバターは見落とすことがあるでしょう。
あまり精度の良くないセンサーを使用する場合は、複数のセンサーを違う場所に設置することで、全体の精度を高めることができます。
センサーの設置場所などいろいろと工夫するのも楽しいですね^^
□別の方法
訪問者を検出する方法は別の方法があります。訪問者が通過する場所に、透過度の高いファントム物体を置いておきます。この物体とアバターとの衝突を検出するといった方法でシムへの負担も少なく良い方法です。
しかし、この方法は、アバターがちゃんと玄関から入ってきてくれる場合は良い方法ですが、アバターが壁を通過して来たり、オープンな造りのお店では工夫が必要になります。
パーティクルプロトタイプの新作(ともし火)をご紹介します。
Particle Drive HUD ユーザーさんからのご提供です。 
とても小さな灯りです。そのため、中心のプリムも半径1cmとなっています。
「風前のともし火」にピッタリのパーティクルです。
癖のないパーティクルなので、アイデア次第でいろいろと使えそうです。
●民家の灯り
民話の世界に登場するような、雪深い村はずれの民家にある灯りとして使えます。
●山小屋のランプ
遠くから見た山小屋のランプに使えます。光をもう少し強くするとよいかも。
●魂(霊魂)
これピッタリです。こんな妖精がゼルダの相棒だったような^^
●蛍の光
としても使えそうですが、ちょっと違うのでさらに調整が必要かと。
●テレポテーション効果
全身にまとい、テレポテーションした後の残像として使えます。ただし、パーティクルの寿命(age)の値を数秒に変更する必要があります。
●展示
以下の場所で展示しています。
・ToshimaKu の白屋(SIROYA)
http://slurl.com/secondlife/ToshimaKu/150/147/22
●Particle Prototype ベンダー
展示してある「灯火」の後方にベンダーがあります(上図の空色の☆マーク)
(Particle Drive HUD ユーザーの方のみ使用可)
Particle Prototype 形式で無償配布しています。
・・・Particle Prototype (Lamp)
Particle Drive HUD ユーザーは以下の手順で入手してください。
(1)Particle Drive HUD を装着する
(2)Particle Prototype ベンダー(壁の☆マーク)をクリックする
(3)30秒以内にParticle Drive HUD の左上☆マークをクリックする
Particle Prototype (Lamp) を装着し、オーナー認証するとそのままで使用できます。
変数の実体はメモリー上の領域であることを見てきました。変数は変数宣言によりメモリー上に確保されます。
例: integer a;
メモリー上に変数名a の領域が確保されます。
図1.メモリー領域の確保(変数宣言)
確保したメモリ領域は、他のプログラムで使用できません。
それではその領域はいつ開放されるのでしょうか?
開放されたメモリ領域はどのプログラムからも使用可となります。
図2.メモリ領域の開放
変数宣言した変数は、プログラムのどこででも使用できるわけではありません。
使用できる範囲のことをスコープとよびます。
スコープについて以下のプログラムで説明します。説明のために、プログラムに行番号を付けています。
順次処理により、プログラムは0行目から6行目まで上から番号順に実行していきます。
ブロックが1行目から5行目にかけてあります。
(ブロックとは開中括弧 { と閉中括弧 } のペアのことです)
ブロック内で宣言した変数は、処理がブロックを抜けたときに開放されます。
この場合、変数a のスコープは2行目から4行目となります。
●ルール1
ブロック内で変数宣言した変数のスコープはそのブロック内である。
例1.
例2.ブロックが入れ子(ネスト)になっている場合
実習1:
以下のプログラムをコンパイルしてください。
default
{
state_entry( )
{
{
string a = “Good morning, Master.”;
}
llOwnerSay( a );
}
}
llOwnerSay関数の変数a の後ろにカーソルが点滅し、以下のエラーメッセージが表示されます。
(7, 22) : ERROR : Name not defined within scope
コンパイルエラーです。
変数aを宣言したブロックの外では、変数aは開放されています。そのため、変数aを使用すると「定義されていません」とエラー表示されます。
llOwnerSay関数を正しい位置に修正してコンパイルしてください。
●ルール2
一般に同じ変数名は使用できないが、違うブロックであれば、同じ変数名を宣言できる。
例1.スコープが重ならない場合
例2.スコープが重なる場合
ブロックが入れ子(ネスト)になっている場合、より深い方のブロックが優先される。
実習2:
以下のプログラムをコンパイル・実行してください。
default
{
state_entry( )
{
string a = “Good morning.”
llOwnerSay( a );
{
string a = “Good night.”;
llOwnerSay( a );
}
llOwnerSay( a );
}
}
以下のようにチャット出力します。
Object: Good morning.
Object: Good night.
Object: Good morning.
変数a のスコープが重なっています。動作を確認してください。
●グローバル変数
default ステートなどのステートの外で宣言する変数をグローバル変数とよびます。
グローバル変数は全てのブロックの外で宣言されます。
それに対して、ブロックの中で宣言する変数をローカル変数とよびます。
ローカル変数はブロックによりスコープを制限されます。
実習3:
以下のプログラムをコンパイル・実行してください。
string a = “Morning.”
default
{
state_entry( )
{
llOwnerSay( a );
{
string a = “Night.”;
llOwnerSay( a );
}
}
}
グローバル変数を使用しています。
チャット出力を見て、動作を確認してください。
同じ変数名を使用する場合、スコープのネストが深い方が優先されることを確認してください。
リンデンスクリプト言語(Linden Script Language:LSL)のTips講習会やっています。
スクリプトを全く知らない人向けの実地講習です。南海の孤島でのんびりゆっくりやってます^^
●LSL Tips
Tipsとは単体で動作する短いプログラムのことです。
親切なサイトには面白いTisp がたくさん載っています。
(リンクを参照)
Tips を商品に組み込むことで、商品に何らかの「動き」や「変化」をつけることができます。商品にマッチしたTips は商品の魅力をアップさせます。
実は、Tips を手っ取り早く利用するのにプログラムの詳しい知識はいりません。
Tips を商品に「コピー&ペースト」すればそのまま動きます!
って、そうなのですが、このTips のコピペ作業自体がスクリプト初心者には難しいです。
●LSL Tips講習会(0L$)
そこで、この講習会では、Tips のコピー&ペーストを実地講習します。
具体的には、Tips を商品に組み込む方法を実習します。
場所:Game Forum のMember's Sandbox
対象:スクリプト初心者
日時:毎週水曜日・土曜日夜10時〜11時(終了時間は目安です)
目的:
・・・Tipsを商品に組み込む方法がわかります
・・・スクリプトの基礎の基礎がわかります
申込:
・・・事前申込は不要です。参加自由です
・・・当日Game Forum のサンドボックスに集合してください
当日のスケジュール:
・・・準備:Game Forum Member 登録(注1)
・・・前半:Tips「Hello, Avatar!」を動かします
・・・後半:Tips「雪パーティクル」をコンパイルして動かします(注2)
(注1)Game Forum Member's Sandbox が24時間利用可能になります。
自習や商品制作にご利用ください。
(注2)講習会後半の内容は順次変わります。今回は季節がら「雪」です。
進行:
会話はタイピング・チャットで行います。一通り講師が説明しますので、実際に作業してください。雑談・立ち歩き・踊り大歓迎です。作業がうまくいかないときは参加者どうしでも助け合ってみてください。 
こんな感じで、ひろーい場所で、のんびりまったりやってます^^
●LSL 入門講座
Tips を手軽に使用するにはプログラミングの知識は不要ですが、Tips を改造したりまた自分でTips を作成したりするにはLSLプログラミングの知識が必要です。
そのため、Game Forum では、LSL を用いたプログラミング入門講座を開講しています。
【SL Game Forum】http://slgameforum.ninja-web.net/page_learning1.html
こちらは有料となりますが興味のある方はお問い合わせください。
【連絡先】
・・・このブログにコメントをください。その際、「管理者にだけ表示を許可する」にチェックを入れてください。
Author:Aa
SLプラネットへようこそ!
Game Forumで物づくりしてます。
皆さん、遊びにきてください。
ブログの内容を整理更新して掲載していきます。ラーニングの際には必ずHPでご確認ください。
スターオフィス(日本語版:StarSuite)がGoogleパックにて無料配布開始!
Microsoft Officeと互換性あり!
パソコンの横において、疑問点をサッと調べられます!...
オブジェクト制作を基礎から解説!販売方法も詳しく記述!...
すぐに使えるサンプルプログラムを多数収録!...
関数の詳しい記述あり!辞書のように便利!...
ゲーム用パソコンならドスパラへ!Galleriaシリーズが大人気!