2008年03月14日
【中級】センサースクリプトに挑戦
こんばんは、ジョビンです。
あしあとをたどってみたら MasterPoppy Amat さんという方が
センサースクリプトを公開されていました。
http://masterpoppy.slmame.com/e172204.html
なるほどなるほど。
こうやって方角を検知するんですね。
トラックバック歓迎とのことでしたので、
私もセンサーに挑戦してみました!
はじめましてのご挨拶にトラックバック。
ちなみに、決してどっちのスクリが正解とかそういうことを言いたいわけではありません。
私は、スクリプトを公開することはとてもいいことだと思っています。
スクリプター同士が、お互いの手法を見ながら学びあうのは、さらにすばらしいことだと思っています。
ですから、MasterPoppy さんから学ばせていただいたジョビンが
お返しに公開するエントリーです。
やってるもの同士お互いに刺激が受けられますし、
同じものを違う角度から見るとまた理解が深まるでしょう。
この記事を見られる方々に、そのように受け取っていただければ幸いです。
テストはしていないので、動作は保障しません。
動かした方、結果を教えていただければ幸いです。
実はこの記事は一週間前に公開したんですが
帰宅後インで実験したらひどい結果になったので
あわてて非公開にしたんでした^^;
違いはこの行だけです。
分解して順番に見ていきましょう。
この行は 元のソースのままです。
値は - PI ~ PI になります
こうすると - 0.5 ~ 0.5
になります。
ここまでは大丈夫でしょうか?
これで、 0~8 になりました
これを %8 で0~7にして
リストのインデックスとして使っています
if 文で 1から順番に8回比べるより、
こっちのほうが短くかけます。
このリストの使い方は、たいへん応用が利くし
計算の回数を減らすことのできるテクニックなので、
ぜひ紹介したいとおもいこのエントリーを書きました。
以上 センサー ジョビン風でした。
MasterPoppy Amat さん ありがとう!
あしあとをたどってみたら MasterPoppy Amat さんという方が
センサースクリプトを公開されていました。
http://masterpoppy.slmame.com/e172204.html
なるほどなるほど。
こうやって方角を検知するんですね。
トラックバック歓迎とのことでしたので、
私もセンサーに挑戦してみました!
はじめましてのご挨拶にトラックバック。
ちなみに、決してどっちのスクリが正解とかそういうことを言いたいわけではありません。
私は、スクリプトを公開することはとてもいいことだと思っています。
スクリプター同士が、お互いの手法を見ながら学びあうのは、さらにすばらしいことだと思っています。
ですから、MasterPoppy さんから学ばせていただいたジョビンが
お返しに公開するエントリーです。
やってるもの同士お互いに刺激が受けられますし、
同じものを違う角度から見るとまた理解が深まるでしょう。
この記事を見られる方々に、そのように受け取っていただければ幸いです。
// Work Space
vector direc_v;
integer dirc_idx;
string Text;
string line;
integer dist;
// Constant Value
list dirc_list = ["W","SW","S","SE","E","NE","N","NW"];
float RAD_TO_IDX;
default
{
on_rez(integer n){ llSetText("",<0,0,0>,1.0); llResetScript(); }
state_entry()
{
RAD_TO_IDX = 8 / (TWO_PI);
llSensorRepeat("", "", AGENT, 500, TWO_PI, 3.0);
}
sensor(integer num)
{
Text = "";
integer i;
for(i=0; i{
direc_v = llDetectedPos(i) - llGetPos();
dirc_idx = llRound(llAtan2(direc_v.y,direc_v.x)/TWO_PI*8+4); // dirc_idx = 0 ~ 7
dist = llRound(llVecMag(direc_v));
line += llDetectedName(i);
line += "[";
line += (string)dist+"m ";
line += llList2String(dirc_list,dirc_idx%8);
line += "]";
Text += line + "\n";
}
llSetText(Text, <1.0,1.0,1.0>, 1.0);
}
no_sensor()
{
llSetText("NO AVATAR", <0.8,0.5,0.5>, 1.0);
}
changed(integer c)
{
if(c & CHANGED_TELEPORT)
llSetText("",<0.0,0.0,0.0>,1.0);
}
}
動かした方、結果を教えていただければ幸いです。
実はこの記事は一週間前に公開したんですが
帰宅後インで実験したらひどい結果になったので
あわてて非公開にしたんでした^^;
ポイント
dirc_idx = llRound(llAtan2(direc_v.y,direc_v.x)/TWO_PI*8+4); // dirc_idx = 0 ~ 7
違いはこの行だけです。
分解して順番に見ていきましょう。
llAtan2(direc_v.y,direc_v.x)
この行は 元のソースのままです。
値は - PI ~ PI になります
llAtan2(direc_v.y,direc_v.x)/TWO_PI
こうすると - 0.5 ~ 0.5
になります。
ここまでは大丈夫でしょうか?
llAtan2(direc_v.y,direc_v.x)/TWO_PI*8+4
これで、 0~8 になりました
これを %8 で0~7にして
リストのインデックスとして使っています
line += llList2String(dirc_list,dirc_idx%8);
if 文で 1から順番に8回比べるより、
こっちのほうが短くかけます。
このリストの使い方は、たいへん応用が利くし
計算の回数を減らすことのできるテクニックなので、
ぜひ紹介したいとおもいこのエントリーを書きました。
お礼
以上 センサー ジョビン風でした。
MasterPoppy Amat さん ありがとう!
2008年02月26日
【講座】誰でもできるLSL touch
しばらくお休みしてました。jvnです。
風邪はなおったけど、いろいろと忙しくなってきちゃいました><
講座は 今までどおり毎日というわけにはいかなさそうです。。
普通のブログを毎日つけるようにがんばります。
最近、調べものがあって LSL Portal と LSL Wiki をみてました。
http://jvn.slmame.com/e147567.html
前者はリンデン公式だけど重く、後者は有志のもので軽いです。
関数のリストなどは、公式のものが正確なのですが、
関数の挙動に関しては Wiki のほうが情報量が細かく、正確なようでした。
とくに今回しらべていた物理系の情報は LSL Wiki がすごかったですね。
情報を拡散させるな!
IncSearch も対応しなくちゃいけないなぁ。。。
LSL 講座 リンク
ここをチェック。
Detected 関数を知ります
List の使いかたを学びます
先日おこなった Listen イベントでは、誰が発言したか、という情報を
引数で取得することができました。
では、タッチイベントも引数で 誰がタッチしたのか得られるか、、
と思いきゃ 引数は integer型がひとつだけ。。
実は、タッチやセンサーのイベントでは
llDetected○○○ という関数を使って、イベントを起こした人の情報を得ます。
Detected は 検出された という意味です
いま、英辞郎を調べました。 へ~
IncSearch で llDetected と検索してみましょう
10個の関数がありますね
これだけ 情報を得ることができるということです
こんかいは llDetectedName というのを使いましょう
引数について説明が必要です
integer number とは?
これは、イベントに入るときに検出されたものが
複数ある場合につかいます
こんかいは touch_start なので 一人しか検出されません
これが touch イベントだと タッチ中の人が複数人 同時に検出されることがあります。
センサーイベントの場合は 範囲に含まれる人がいっきに検出されるので、これも該当しますね。
イベントの引数の numberは検出された人の数になります
複数人いた場合は、0からはじまるインデックスが振られます
5人なら 0~4 のインデックスがふられますね
このインデックス番号を Detected の引数に渡すと、該当する人の情報が得られます
普通タッチは、一人より多く取得できると困ることがおおいので
touch_start をつかいましょう
一人だけなので 0~0 つまり、0 決め打ちで大丈夫です
取得した名前を
name_l というリスト型の変数にしまっています。
リストというのは、複数の(リスト以外の)変数をしまっておける型です。
変数が箱なら
リストは 棚です。
何番目の棚から値を取り出す、とか
何番目の棚に値を入れる とかできます。
棚と違ってリストの大きさはむにゅむにゅのびちぢみします。
リストに += でリストを足すと
リストは伸びます
リストの使い方は 一言で説明しにくいところがあるので
今回は リストに値をどんどん入れていく方法だけにします><
これも よくある機能です。
おぼえてしまいましょう。
そのほかのバリエーションを、Mizさんがこちらの記事にまとめてらっしゃいます。
http://bb2.atbb.jp/lslbbs/viewtopic.php?t=8
冒頭でも書いたとおり、あまりブログに時間がさけなくなってきました><
初心者用の記事は質問があったら書きます。
中級者以上の Tips を今後書いていきます。
いま、調べているのは物理関係の情報。
Havok4 が導入されたら今後メジャーになってきそうな予感です。
Wiki の裏側の話し等。
ソースはこちら
http://chiyosuke.slmame.com/e68741.html
ビューアをアセンブリ解析して、効率的なメモリの使い方や
動作速度の向上を図られています。
Chiyosuke さん かっこよすぎです。
あと、LSL Wiki や Portal にあるスクリプトライブラリ から
スクリプトをひっぱってきて挙動の勉強をしてみたいと思います。
こちらは より実践編ですね。
これからも よろしくお願いします。
LSL 講座 リンク
続きを読む
風邪はなおったけど、いろいろと忙しくなってきちゃいました><
講座は 今までどおり毎日というわけにはいかなさそうです。。
普通のブログを毎日つけるようにがんばります。
最近、調べものがあって LSL Portal と LSL Wiki をみてました。
http://jvn.slmame.com/e147567.html
前者はリンデン公式だけど重く、後者は有志のもので軽いです。
関数のリストなどは、公式のものが正確なのですが、
関数の挙動に関しては Wiki のほうが情報量が細かく、正確なようでした。
とくに今回しらべていた物理系の情報は LSL Wiki がすごかったですね。
情報を拡散させるな!
IncSearch も対応しなくちゃいけないなぁ。。。
LSL 講座 リンク
復習
list NAMES_l;
default
{
touch_start(integer num)
{
if(llDetectedKey(0) == llgetOwner()){
llSay(0,"君はオーナーだ");
}
if(llListFindList(NAMES_l, [llDetectedName(0)])>-1){
NAMES += llDetectedName(0);
}
}
}
ここをチェック。
- 流れはわかるか
- if文の条件式の中身がわかるか
今日学ぶこと
Detected 関数を知ります
List の使いかたを学びます
Detected関数
先日おこなった Listen イベントでは、誰が発言したか、という情報を
引数で取得することができました。
では、タッチイベントも引数で 誰がタッチしたのか得られるか、、
と思いきゃ 引数は integer型がひとつだけ。。
実は、タッチやセンサーのイベントでは
llDetected○○○ という関数を使って、イベントを起こした人の情報を得ます。
Detected は 検出された という意味です
いま、英辞郎を調べました。 へ~
IncSearch で llDetected と検索してみましょう
10個の関数がありますね
これだけ 情報を得ることができるということです
こんかいは llDetectedName というのを使いましょう
引数について説明が必要です
integer number とは?
これは、イベントに入るときに検出されたものが
複数ある場合につかいます
こんかいは touch_start なので 一人しか検出されません
これが touch イベントだと タッチ中の人が複数人 同時に検出されることがあります。
センサーイベントの場合は 範囲に含まれる人がいっきに検出されるので、これも該当しますね。
イベントの引数の numberは検出された人の数になります
複数人いた場合は、0からはじまるインデックスが振られます
5人なら 0~4 のインデックスがふられますね
このインデックス番号を Detected の引数に渡すと、該当する人の情報が得られます
普通タッチは、一人より多く取得できると困ることがおおいので
touch_start をつかいましょう
一人だけなので 0~0 つまり、0 決め打ちで大丈夫です
リスト
取得した名前を
name_l というリスト型の変数にしまっています。
リストというのは、複数の(リスト以外の)変数をしまっておける型です。
変数が箱なら
リストは 棚です。
何番目の棚から値を取り出す、とか
何番目の棚に値を入れる とかできます。
棚と違ってリストの大きさはむにゅむにゅのびちぢみします。
リストに += でリストを足すと
リストは伸びます
リストの使い方は 一言で説明しにくいところがあるので
今回は リストに値をどんどん入れていく方法だけにします><
オーナーだけ使える機能
これも よくある機能です。
おぼえてしまいましょう。
そのほかのバリエーションを、Mizさんがこちらの記事にまとめてらっしゃいます。
http://bb2.atbb.jp/lslbbs/viewtopic.php?t=8
まとめ
- Detected を使いこなす
- リストに値を格納する
- 権限別機能の基本
今後のこと
冒頭でも書いたとおり、あまりブログに時間がさけなくなってきました><
初心者用の記事は質問があったら書きます。
中級者以上の Tips を今後書いていきます。
いま、調べているのは物理関係の情報。
Havok4 が導入されたら今後メジャーになってきそうな予感です。
Wiki の裏側の話し等。
ソースはこちら
http://chiyosuke.slmame.com/e68741.html
ビューアをアセンブリ解析して、効率的なメモリの使い方や
動作速度の向上を図られています。
Chiyosuke さん かっこよすぎです。
あと、LSL Wiki や Portal にあるスクリプトライブラリ から
スクリプトをひっぱってきて挙動の勉強をしてみたいと思います。
こちらは より実践編ですね。
これからも よろしくお願いします。
LSL 講座 リンク
続きを読む
2008年02月23日
【講座】誰でもできるLSL Listen
こんにちは、jvnです。
昨日は久しぶりに夜更かしして眠いです。
Zzzzz
LSL 講座 リンク
理解できているか確認しましょう。
llListen でチャットの受信を開始できます。
なんでもかんでも受信したら大変なので、
フィルタをかけることができます。
引数は全部フィルタのかけかたを示しています。
ひとつひとつの意味を調べましょう。
channel チャンネル。
チャットにはチャンネルがあります。
ふつうの会話は チャンネル0 です。
−2,147,483,648 〜 +2,147,483,647
が指定できます。
+の値は、クライアント画面からチャットで発言することができます。
は 「/1 あいうえお」 と発言すると、そのチャンネルで話せます。
よく市販のスクリプト入りオブジェクトで使われていますね。
-の値は、LSLからしか発言できないので、
プリム同士の会話に使われます。
name 名前。
発言者の名前です。
誰の発言を取得するか セットすることができます。
id UUID
発言者の UUID です。
キーで だれの発言を取得するか指定できます。
ここでは llGetOwner で オブジェクトの所有者をセットしています。
string msg
発言内容でフィルタを書けます。
これは あまりつかうことはないですね。
特定のコマンドを指定する場合なんかに使えそうです。
以上です。
サンプルでは3つのリッスンをセットしています。
1スクリプトは最大65までリッスンを受信できます。
なお、リッスンで 0チャンネルのフィルタ無しを指定するのはやめましょう。
これはだめ
近くにいる人全員のチャットを拾ってしまうので、サーバーに負荷をかけます。
スクリプターの掟です。絶対にやめましょう。
また、フィルターがあっても
リッスンイベントの内部にたくさんの処理がかかれていると
負荷をかける、という話しもあります。
必要なときだけ リッスンするように心がけましょう。
短時間リッスンを使いたい場合は、次のように
リッスンを止める処理を書きましょう。
これらのように、確実にリッスンを止める処理を書くならば、
フィルターなしのリッスンを使っても問題はないでしょう。
以前私が働いているBARの自動ドアは
リッスンでコマンドを受ける高機能自動ドアでした。
しかし、常時リッスンが動きっぱなしでした。
ある日お客さんたちと騒いでいたら、長い発言を受信してドアが壊れてしまいました^^;
運が悪くマスターが長期お休み中だったので1週間ドアがつかえずえらく不便だったのを覚えています。
LSL覚え始めだったのですが、この仕様はおかしい、と怒って
リッスンを使わない(あともうひとつ工夫をして)自動ドアを作ってマスターに差し替えてもらいました。
スクリプト覚えたてで苦労したのも、今はいい想い出です。
こういうスクリプトを書いて、平気であちこちで売るスクリプターには
怒りすら覚えます。
知らないで人に迷惑をかけないように気をつけましょう。
横道にそれましたが、フィルター無しのリッスン、開きっぱなしのリッスンはやめましょう。
リッスンイベントを使います。
イベントに引数が設定されてますね?
これは、イベントを引き起こしたものが
何なのかがセットされています。
どのチャンネルで
なんて名前の人で
なんてキーをもっている人が
どんなメッセージを送ったのか
がすべてこれらの変数に入っています。
今回のサンプルスクリプトでは、チャンネルで発言の範囲を変えています。
先日説明したときは、
条件式は一回変数に結果を入れてからつかっていましたが、
このように条件式を直接書くこともできます。
むしろ、ふつうはこのように書くので
この形で覚えましょう。
チャンネルが
1の場合 llWhisper
3の場合 llSay
5の場合 llShout
で、発言してますね。
第一引数が 今日覚えたチャンネルです。
マイナスチャンネルはスクリプトから発言する以外に
発言方法はない、とさきほど書きましたが
ここにマイナスをセットすると、
マイナスチャンネルで会話ができます。
チャットのリッスンの仕方を覚えました。
チャンネルの指定方法は新しい概念だったと思います。
開きっぱなしのリッスン、フィルター無しのリッスンはやめましょう。
リッスンを止める処理を書くようにしましょう。
リッスンの受信は、引数に発言内容が入ってきました。
ふつうの変数として使うことができます。
おまけで、IF文の条件式を直接書く方法も学びました。
チャット関係の関数は、ほかにも少しあります。
IncSearch で [chat]で検索してみましょう。
今日学んだ内容が頭に入っていれば、他の関数も使えると思いますよ^^
タッチした人の情報を得る llDetectedXXX 系の関数を学びます。
それから、リストという型について学びましょう。
リストが使えると、情報をためることができてこれまた便利です。
みなさま、よい週末を^^
LSL 講座 リンク
昨日は久しぶりに夜更かしして眠いです。
Zzzzz
LSL 講座 リンク
サンプルソース
default{
state_entry(){
llListen(1, "", llGetOwner(), "");
llListen(3, "", llGetOwner(), "");
llListen(5, "", llGetOwner(), "");
}
listen(integer channel, string name, key id, string message){
if(channel == 1){
llWhisper(0,message);
}else if(channel == 3){
llSay(0,message);
}else if(channel == 5){
llShout(0,message);
}
}
}
復習
理解できているか確認しましょう。
- 処理の流れがわかるか
- if文の条件式の意味
今日学ぶこと
- オブジェクトでチャットを受信開始する方法
- 受信したチャットを使う方法
- オブジェクトで話す方法
チャット受信セット
llListen でチャットの受信を開始できます。
なんでもかんでも受信したら大変なので、
フィルタをかけることができます。
引数は全部フィルタのかけかたを示しています。
ひとつひとつの意味を調べましょう。
channel チャンネル。
チャットにはチャンネルがあります。
ふつうの会話は チャンネル0 です。
−2,147,483,648 〜 +2,147,483,647
が指定できます。
+の値は、クライアント画面からチャットで発言することができます。
は 「/1 あいうえお」 と発言すると、そのチャンネルで話せます。
よく市販のスクリプト入りオブジェクトで使われていますね。
-の値は、LSLからしか発言できないので、
プリム同士の会話に使われます。
name 名前。
発言者の名前です。
誰の発言を取得するか セットすることができます。
id UUID
発言者の UUID です。
キーで だれの発言を取得するか指定できます。
ここでは llGetOwner で オブジェクトの所有者をセットしています。
string msg
発言内容でフィルタを書けます。
これは あまりつかうことはないですね。
特定のコマンドを指定する場合なんかに使えそうです。
以上です。
サンプルでは3つのリッスンをセットしています。
1スクリプトは最大65までリッスンを受信できます。
なお、リッスンで 0チャンネルのフィルタ無しを指定するのはやめましょう。
これはだめ
llListen(0,"",NULL_KEY,"");
近くにいる人全員のチャットを拾ってしまうので、サーバーに負荷をかけます。
スクリプターの掟です。絶対にやめましょう。
また、フィルターがあっても
リッスンイベントの内部にたくさんの処理がかかれていると
負荷をかける、という話しもあります。
必要なときだけ リッスンするように心がけましょう。
短時間リッスンを使いたい場合は、次のように
リッスンを止める処理を書きましょう。
touch_start(integer num)
{
integer HANDLE_LISTEN;
touch_start(integer num){
HANDLE_LISTEN = llListen(0,"",NULL_KEY,"");
llSay(0,"発言してください 私は聞きます");
}
listen(integer channel, string name, key id, string message){
// 何か処理を行う
llListenRemove(HANDLE_LISTEN);
}
}
default
{
integer HANDLE_LISTEN;
touch_start(integer num){
HANDLE_LISTEN = llListen(0,"",NULL_KEY,"");
llSay(0,"10秒以内に発言してください 私ちょっと忙しいの");
llSetTimerEvent(10);
}
timer(){
llSay(0,"リッスンを終了します");
llListenRemove(HANDLE_LISTEN);
}
}
これらのように、確実にリッスンを止める処理を書くならば、
フィルターなしのリッスンを使っても問題はないでしょう。
以前私が働いているBARの自動ドアは
リッスンでコマンドを受ける高機能自動ドアでした。
しかし、常時リッスンが動きっぱなしでした。
ある日お客さんたちと騒いでいたら、長い発言を受信してドアが壊れてしまいました^^;
運が悪くマスターが長期お休み中だったので1週間ドアがつかえずえらく不便だったのを覚えています。
LSL覚え始めだったのですが、この仕様はおかしい、と怒って
リッスンを使わない(あともうひとつ工夫をして)自動ドアを作ってマスターに差し替えてもらいました。
スクリプト覚えたてで苦労したのも、今はいい想い出です。
こういうスクリプトを書いて、平気であちこちで売るスクリプターには
怒りすら覚えます。
知らないで人に迷惑をかけないように気をつけましょう。
横道にそれましたが、フィルター無しのリッスン、開きっぱなしのリッスンはやめましょう。
受信の仕方
リッスンイベントを使います。
listen(integer channel, string name, key id, string message){
}
イベントに引数が設定されてますね?
これは、イベントを引き起こしたものが
何なのかがセットされています。
どのチャンネルで
なんて名前の人で
なんてキーをもっている人が
どんなメッセージを送ったのか
がすべてこれらの変数に入っています。
今回のサンプルスクリプトでは、チャンネルで発言の範囲を変えています。
条件式
listen(integer channel, string name, key id, string message){
if(channel == 1){
llWhisper(0,message);
}else if(channel == 3){
llSay(0,message);
}else if(channel == 5){
llShout(0,message);
}
}
先日説明したときは、
条件式は一回変数に結果を入れてからつかっていましたが、
このように条件式を直接書くこともできます。
むしろ、ふつうはこのように書くので
この形で覚えましょう。
チャンネルが
1の場合 llWhisper
3の場合 llSay
5の場合 llShout
で、発言してますね。
第一引数が 今日覚えたチャンネルです。
マイナスチャンネルはスクリプトから発言する以外に
発言方法はない、とさきほど書きましたが
ここにマイナスをセットすると、
マイナスチャンネルで会話ができます。
まとめ
チャットのリッスンの仕方を覚えました。
チャンネルの指定方法は新しい概念だったと思います。
開きっぱなしのリッスン、フィルター無しのリッスンはやめましょう。
リッスンを止める処理を書くようにしましょう。
リッスンの受信は、引数に発言内容が入ってきました。
ふつうの変数として使うことができます。
おまけで、IF文の条件式を直接書く方法も学びました。
チャット関係の関数は、ほかにも少しあります。
IncSearch で [chat]で検索してみましょう。
今日学んだ内容が頭に入っていれば、他の関数も使えると思いますよ^^
次回予告
list NAMES_l;
default
{
touch_start(integer num)
{
if(llDetectedKey(0) == llgetOwner()){
llSay(0,"君はオーナーだ");
}
list name_l = [llDetectedName(0)];
if(llListFindList(NAMES_l, name_l)>-1){
NAMES += name_l;
}
}
}
タッチした人の情報を得る llDetectedXXX 系の関数を学びます。
それから、リストという型について学びましょう。
リストが使えると、情報をためることができてこれまた便利です。
みなさま、よい週末を^^
LSL 講座 リンク
2008年02月22日
【講座】誰でもできるLSL timer
jvnです。
治りそう治りそうといいながら、風邪がなかなか治りません。
今年の風邪は長引くなぁ、と思って検索してみたら
毎年同じことが言われているようです。。。
LSL 講座 リンク
今回はtimer を使った処理を考えましょう。
実践編です。
次の点がわかるか、確認しましょう。
今日は、タイマーイベントの使い方を学びます。
まず、タイマーのセットの仕方を学びます。
続いて、タイマーで起動されるイベントを学びます。
最後に、タイマーを使う上での注意点を学びます。
最後の注意点は、SIMに負荷をかけないために
とても大事なことなので必ず学んでください。
タッチイベントがおこると
1回目は①
2回目は②
3回目は①
・
と交互に関数が実行されますね。
わからない方は、前回の LSL講座 IF を復習してください。
ここで実行されている関数が timer をセットする関数です。
引数に、何秒置きにタイマーを実行するかセットします。
5 がセットされれば、5秒置きにタイマーが実行されます。
0 がセットされれば、タイマー解除になります。
セットの仕方、以上。
察しの良い方はソースを見ただけでわかったかもしれません。
timerの時間がたつと、timer() イベントの中が実行されます。
10回 timer() が実行されたら、NUMBER の値を0にして、
タイマーをとめています。
これは、次のタイマーの注意点を考えているからです。
LSL Portal にLSL でおこなってはいけないことについて書いてあります。
http://www.slmame.com/admin/entry.php
5秒以内のタイマーは使わないようにしましょう。
これは、今回のように動かしてすぐとめるようなものならば、該当しないと思います。
しかし、常に動かすものならば、1秒に一回処理なんてことはやめるようにしましょう。
理由は、SIMの負荷を軽減するためです。
どうして、SIMに負荷をかけてはいけないのでしょうか?
SIMは みなさんが使っているパソコンと同じコンピューターです。
最近はパソコンの性能があがってきているので、
サーバー専用機をつかわないでパソコンを使うことが増えてきているので
言葉どおり、サーバーも同じパソコンを使っているかもしれません。
LSLはサーバー上で実行されます。
ですから、重いプログラムや動きっぱなしのプログラムがあると
サーバーは処理が重くなってしまいます。
ラグや、ひどくなるとサーバー落ちの原因になることもあります。
みなさんがよかれと思ってつくったLSLが、
サーバーを落としてしまったら悲しいですよね。
LSLをつくるときは、サーバーに負荷をかけないように工夫しましょう。
今回は、テクニックが2つ使われています。
これは、キャストという技です。
型を変換したい場合は、このように行います。
これは、整数型を 文字型に変換しています。
llSay の2番目の引数は stringなので、
integer を渡したい場合はこのように行わなければいけません。
これは、 NUMBER = NUMBER + 1; と同じです。
NUMBER に 1 足すという意味です。
この2つのテクニックもよく使うテクニックなので覚えてしまいましょう^^
今回は タイマーのセットの仕方、
タイマーイベントの呼び出されるタイミング、
キャストと 整数に数字を足す方法を学びました。
あまり新しいことはありません。
わからないことがあったら、今のうちに復習してわかるようにしましょう。
質問することはとてもよいことです。
遠慮なくコメントなりトラックバックなりしてください。
手を動かしてコーディングすることは、理解の助けになります。
コピーで終わりでなく、コーディングしましょう。
次回はLSLでチャットの発言をしたり、
他の人の発言を聞くための仕組みについて解説します。
サンプルソースは以前紹介したマイクスクリプトです。
こいつも見逃せませんね!
LSL 講座 リンク
治りそう治りそうといいながら、風邪がなかなか治りません。
今年の風邪は長引くなぁ、と思って検索してみたら
毎年同じことが言われているようです。。。
LSL 講座 リンク
今回はtimer を使った処理を考えましょう。
実践編です。
サンプルソース
integer FLAG = TRUE;
integer NUMBER = 0;
default
{
touch_start(integer num){
if(FLAG)
{
llSetTimerEvent(5); // ①
}else{
llSetTimerEvent(0); // ②
}
FLAG = !FLAG;
}
timer() // ③
{
llSay(0,(string)NUMBER);
NUMBER += 1;
if(NUMBER==10)
{
llSetTimerEvent(0);
NUMBER=0;
}
}
復習
次の点がわかるか、確認しましょう。
- 最初のステートはどこか
- タッチするたびに、どの部分が実行されるか
今日学ぶこと
今日は、タイマーイベントの使い方を学びます。
まず、タイマーのセットの仕方を学びます。
続いて、タイマーで起動されるイベントを学びます。
最後に、タイマーを使う上での注意点を学びます。
最後の注意点は、SIMに負荷をかけないために
とても大事なことなので必ず学んでください。
タイマーセットの仕方
タッチイベントがおこると
1回目は①
2回目は②
3回目は①
・
と交互に関数が実行されますね。
わからない方は、前回の LSL講座 IF を復習してください。
ここで実行されている関数が timer をセットする関数です。
引数に、何秒置きにタイマーを実行するかセットします。
5 がセットされれば、5秒置きにタイマーが実行されます。
0 がセットされれば、タイマー解除になります。
セットの仕方、以上。
タイマーの実行
察しの良い方はソースを見ただけでわかったかもしれません。
timerの時間がたつと、timer() イベントの中が実行されます。
10回 timer() が実行されたら、NUMBER の値を0にして、
タイマーをとめています。
これは、次のタイマーの注意点を考えているからです。
タイマーの注意点
LSL Portal にLSL でおこなってはいけないことについて書いてあります。
http://www.slmame.com/admin/entry.php
5秒以内のタイマーは使わないようにしましょう。
これは、今回のように動かしてすぐとめるようなものならば、該当しないと思います。
しかし、常に動かすものならば、1秒に一回処理なんてことはやめるようにしましょう。
理由は、SIMの負荷を軽減するためです。
どうして、SIMに負荷をかけてはいけないのでしょうか?
SIMは みなさんが使っているパソコンと同じコンピューターです。
最近はパソコンの性能があがってきているので、
サーバー専用機をつかわないでパソコンを使うことが増えてきているので
言葉どおり、サーバーも同じパソコンを使っているかもしれません。
LSLはサーバー上で実行されます。
ですから、重いプログラムや動きっぱなしのプログラムがあると
サーバーは処理が重くなってしまいます。
ラグや、ひどくなるとサーバー落ちの原因になることもあります。
みなさんがよかれと思ってつくったLSLが、
サーバーを落としてしまったら悲しいですよね。
LSLをつくるときは、サーバーに負荷をかけないように工夫しましょう。
テクニック1
今回は、テクニックが2つ使われています。
llSay(0,(string)NUMBER);
これは、キャストという技です。
型を変換したい場合は、このように行います。
これは、整数型を 文字型に変換しています。
llSay の2番目の引数は stringなので、
integer を渡したい場合はこのように行わなければいけません。
NUMBER += 1;
これは、 NUMBER = NUMBER + 1; と同じです。
NUMBER に 1 足すという意味です。
この2つのテクニックもよく使うテクニックなので覚えてしまいましょう^^
まとめ
今回は タイマーのセットの仕方、
タイマーイベントの呼び出されるタイミング、
キャストと 整数に数字を足す方法を学びました。
あまり新しいことはありません。
わからないことがあったら、今のうちに復習してわかるようにしましょう。
質問することはとてもよいことです。
遠慮なくコメントなりトラックバックなりしてください。
手を動かしてコーディングすることは、理解の助けになります。
コピーで終わりでなく、コーディングしましょう。
次回のサンプルソース
次回はLSLでチャットの発言をしたり、
他の人の発言を聞くための仕組みについて解説します。
サンプルソースは以前紹介したマイクスクリプトです。
こいつも見逃せませんね!
default{
state_entry(){
llListen(1, "", llGetOwner(), "");
llListen(3, "", llGetOwner(), "");
llListen(5, "", llGetOwner(), "");
}
listen(integer channel, string name, key id, string message){
if(channel == 1){
llWhisper(0,message);
}else if(channel == 3){
llSay(0,message);
}else if(channel == 5){
llShout(0,message);
}
}
}
LSL 講座 リンク
2008年02月21日
【講座】誰でもできるLSL IF 質問
LSL 講座 リンク
こなさんより質問いただきましたので、回答させていただきます^^
llTargetOmega に渡している引数
例文からみると (<1,0,0>,PI,.5) の部分。 それぞれどういう意味なのでしょうか。
それとも意味を気にすることなく「そういうものだから」と入力するものなのでしょうか?
大変いい質問です。
説明を簡略化させるために、省いた部分でした。
質問をいただけたので、解説します^^
ソースの該当の部分はこちらですね。
llTargetOmega(<1,0,0>, PI, .5);
この関数に渡している値の意味を考えて見ましょう。
llTargetOmega をクリックすると、次のような構文が出てきます。
llTargetOmega(vector axis, float spinrate, float gain)
括弧の中の名前は引数の名前ですね。
axis = <1,0,0>
spinrate = PI
gain = .5
と、設定してあります。
もう一歩踏み込んで、下の LSL Portal 英 という部分をクリックしましょう。
リンデン公式の LSL 解説がでてきます。
同じ構文と、その下に関数の解説、引数の説明が書いてあります。
Rotates the object around axis at spinrate * llVecMag(axis) in radians per second with strength gain.
- vector axis – arbitrary axis to rotate the object around
- float spinrate – rate of rotation in radians per second
- float gain – needs to be non-zero
jvnは英語が苦手なので、辞書をひきながら意味をなんとなく捉えてみましょう。
vector axis
オブジェクトを回転させるための、任意の軸
float spinrate
回転率 [ラディアス/秒]
float gain
0じゃない値が必要
axis
1つめは、回転の軸を示します。
<1,0,0> はこなさんのお察しのとおり x,y,z の値です。
これは、こう考えてください。
0,0,0 の点と
1,0,0 の点を結んだ線
軸に長さは関係ないので、長さは無視します。
そうすると、X軸(オブジェクトをつくるときに出てくる赤い線のこと)
がでてきますね?
この軸を中心にして回転するといってるようです。
この引数が一番難しいです。
<0,1,0>
とか
<0,0,1>
を軸に指定すると、回る方向がどうなるか 考えて見ましょう。
実際にやったらどう回転しましたか??
<1,1,0> とか設定すると、どういう回転になるでしょうか。
まるで数学みたいな話しですが、数学です。
でも、LSLはわからなかったら実際に試して実験することができます。
これは勉強をするためにはとてもいい点です。
数学の授業ではなかなかそうはいきませんでしたよね。
ぜひいろいろ考えて実際の動きとくらべてみてください。
spinrate
回転率 [ラディアス/秒]
とあります。
ここには、1秒当たりに回転する角度を指定しなさい、って意味ですね。
1秒に360度まわるなら、360?
そう書きたいのはヤマヤマなんですがぐっとがまんです><
ここでは ラディアス で度を示しなさい、となっています。
ラディアスというのは 180度を パイで示す角度指定方法です。
パイって3.1415.。。。。。 ってやつですね。
最近の小学生は 3 と習います。 なげかわしい。
ここで設定している PI はそういうわけで、180度という意味です。
1秒間に180度回転する速さでまわす!
ってわけですね。
1秒間に360度回転させたい場合は、こう書きます。
llTargetOmega(<1,0,0>,PI*2,.5);
* は掛け算です。
PI*2 は 180度 ×2 なので 360度ということになります。
ではでは、1秒間に90度まわしたいときは、どう指定すればよいでしょう?
割り算は / とかきます。
1/2 は 0.5 ですね。
まぁ、正確にどのくらいの速さでまわしたいってことはあまりありませんよね。
私は、値を適当にセットしてみて、気分的に早かったり遅かったりしたら調整しています。
なので、こういうことがわかるようになっておきましょう。
1秒間に360度まわすときと
1秒間に180度まわすときは、どちらが早いでしょうか?
これさえわかれば、2*PI にしたり 0.5*PI にしたり、0.45*PI にしたりして、調整できますね^^
いちいち何度っていうのはあまり考えなくても大丈夫になります。
gain
3つめの説明は馬鹿にしてますね。
強さを示すようですが、「0以外でないといけない」としか書いていません。
jvnも意味がよくわからないので、適当な値をいつもいれています。
今回いれた.5 は 0.5 の意味です。
よくある変数の名前
FGってなに?
あとinteger FGの「FG」っていう単語の意味はなんでしょうか?
これは、フラグ の意味です。
0か1か示すのに、旗をイメージしてこの名前がついています。
旗が揚がっていれば1、さがっていれば0。
なので、慣れている人がみれば、 FG=TRUE となっていなくても、
FG には 0か1しか入らないのだな、とわかることができます。
そのほか、よくある変数名
変数名は自分の好きな名前で、もちろんかまわないのですが
LSLを書くたびにルールが変わると自分のためにもわかりにくいので、
自分ルールを決めちゃいましょう。
FG 以外によくありそうな変数名を思いつくまま列挙してみます。
integer KIND
種類
integer NUM
数
integer IDX
インデックス
何番目の~ というのを示す
string MESSAGE
チャットで話す言葉か
チャットから受信した言葉
うーん もっとたくさんあるんですが、全部書いても頭にはいりませんね><
LSL IncSearch でざーっとみると、関数の引数名がいろいろ書いてあると思います。
こういうのを見て意味をいろいろ考えて見ましょう。
そうすると、自然とどういう名前が適当かみえてくるんじゃないでしょうか^^
ちなみに、FG で検索したらでてきませんでした。
FLAG なら出てきます。
あまり略称使うのはよくないですね。
気をつけます。
以上で質問の答えになったでしょうか?
ここのところ、まだわからないという点がありましたら 聞いてください。
また、有識者の方も そこは違うだろ というつっこみや補足がありましたら
トラバなりコメントなりぜひしてください^^
LSL 講座 リンク
2008年02月21日
【講座】誰でもできるLSL IF
LSL 講座 リンク
jvnです。
前回の講座はいかがだったでしょうか?
ペースが早い、わからないと思う方はコメントかメッセージをください。
その部分をもう一度解説します。
こういうのは聞いた方が、教える側にとっても教わる側にとってもプラスだと思います。
遠慮せずに聞いてくださいね。
integer FG = TRUE; // ①
default
{
touch_start(integer num){
if(FG) // ②
{
llTargetOmega(<1,0,0>,PI,.5);
}else{
llTargetOmega(<1,0,0>,0,0);
}
FG = !FG; // ③
}
}
復習
今日のサンプルコードです。
前回の予告から、②が書き換えられています。
また変更です。ごめんなさい。
まず、流れはわかりますか?
何を行ったときに、
どこが実行されるか(実行の内容はわからなくてもいいです)
把握できてますか?
まずは流れを理解することが大事です。
これは、講座の 基本 を見たらわかるはずですね。
変数は何が宣言されていますか?
その変数の型は 何ですか?
integer 型 は 整数です。
今日学ぶこと
今日は IF の使い方を学びます。
これを覚えると
変数の値の変化に応じて、処理を変えることができます。
今日のサンプルは、タッチを押す毎に、
回転が始まったり止まったりするスクリプトです。
これは応用が利きますね^^
その前に、型 integer の 1と0 の関係 と 定数を学びます。
1と0の関係は、コンピュータ特有の考え方なので、覚えましょう。
コンピュータの歴史
昔々のお話です。
最初のコンピュータは、真空管をたっくさんつなげてつくられていました。
真空管一個一個を ON か OFF にして、その状態を組み合わせて処理を行っていました。
この ON か OFF かという考え方は 今も生きています。
コンピュータは すべて 1か0 で判断する。
という話し、聞いたことありませんか?
この 1 が ON のこと
0 が OFF のことです。
1 を TRUE
0 を FALSE とも呼びます。
まずは、前提知識として、昔話しでした。
定数
①を見てみましょう。
integer FG = TRUE;
TRUE て変数?
でも宣言してないよ??
実は、よく使う値は あらかじめ リンデンさんが宣言しています。
この値は変数の様に変化することができないので、
定数と言います。
変数はころころ変わりますが、
定数はゆうづうがきかない頑固者です。
TRUE の正体を知るには、TRUE をクリックして、LSL PORTAL 英 をクリックしましょう。
これは、リンデン公式 の LSL サイトです。
integer TRUE = 1;
と書いてあります。
そうか、TRUE は1なんだ!
他の定数はどんなのがあるの?
という方は、 LSL IncSearch で [constants] と打ってください。
でてきたのが 定数の一覧です。
ほー
①では、integer FG を宣言して TRUE ( 1 ) をセットしました。
これは、こう書いても動作は同じです。
integer FG = 1;
じゃぁ、なんで わざわざ TRUE を使うのでしょう?
それは、意味が違うからです。
1 をセットしていたら、
ただの整数なので これは 2 とか 10 とか 24とか(jvnの年齢) 4096 とかがはいるかもしれないですね。
だけれど、 TRUE をセットしていたら
ははぁ、これは TRUE か FALSE しかはいらないんだな、と
勘でわかります。
このように、プログラムを自分以外の人が見たときにわかりやすくする
このことは、とても大事なことです。
自分しか見ないよ、というときも同じです。
半年後の自分が見てもわかるように書こう、と思いましょう。
半年後に 何か動作を変えたくなったとき、わかりにくいプログラムだと 全部書き直したほう早いです。
もしかしたら、一カ所変えるだけでいいのかもしれないのに!
定数と、基本編で話したインデントを使ってわかりやすいプログラムを書きましょう。
!
③の行は何をやっているんでしょうか?
FG = !FG;
FG に !FG を入れていますね。
! は 逆 という意味です。
TRUE の逆は FALSE です。
実は、この逆は TRUE と FALSE の場合だけ使えます。
3 の逆 とか 4 の逆というのも求められますが、
話しがややこしくなりますし、上級な技なので、この講座では説明をはぶきます。
0と1の逆 は定番なので覚えましょう。
ここでは
FG に TRUE が入っていれば、!FG は FAlSE。
FG に FALSE が入っていれば、!FG は TRUE。
③をとおるたびに、FG が TRUE,FALSE,TRUE,FALSE と交互に代わっていくのがわかりますね。
IF
さぁ、最後です。
②の IF 。
今回の目玉です。
IF ってどういう仕組みでしょう?
if(TRUE){
// TRUE のときはここをとおる
}else{
// FALSE のときはここをとおる
}
これだけです。
覚えるしかありません。
こんな変形技もあります。
if(TRUE){
// TRUE のときはここをとおる
}
TRUE の時だけ とおる。
今回のソースでは、タッチされるたびに、③で FG が交互に TRUE、FALSE と代わっていくので
IFで実行する関数がかわりますね。
なので、回転がON/OFF代わるわけです。
なるほど。
じつは、このTRUE とFALSE は条件式という式で得ることもできます。
FG = (NUMBER == 10);
if(FG){
}
== は 等しいとき、です。
変数 NUMBER が 10 と等しいとき、FG に TRUE が入ります。
それ以外のときは、FALSEが入ります。
【世界のナベアツ】 さんは 3の倍数のとき 馬鹿になるそうですね。
これを プログラムで書くなら こうです。
FG = ((NUMBER % 3) == 0);
if(FG){
llSay(0,"BAYO----NN"); // ばかになる!
}else{
llSay(0,"HUM"); // ばかにならない!
}
NUMBER % 3 は ナンバーを 3で割った余り という意味です。
余りが 0 なら FG = TRUE、
それ以外なら FG = FALSE
ですね。
このように、IFを使うと変数の値に応じて いろいろプログラムの動作をかえられます。
まずは、ON/OFF で動作を変えられる技 マスターしてみてください^^
今日のまとめ
今日は 0 と 1 の関係を学びました。
0 と 1 は FALSE と TRUE。
これは覚えましょう。
FALSE と TRUE は定数で、正体はinteger の 0 と 1。
(5 == 4) は FALSE
(1 == 1) は TRUE
ですね。
TRUE と FALSE を使うと IF で条件ごとに違う処理ができました。
if(FG){
// TRUE のとき
}else{
// FALSE のとき
}
この書き方は丸暗記しましょう。
次回予告
次回は、timer を使った処理を考えましょう。
実践編です。
integer FG = TRUE;
integer NUM = 0;
default
{
touch_start(integer num){
if(FG)
{
llSetTimerEvent(1);
}else{
llSetTimerEvent(0);
}
FG = !FG;
}
timer()
{
llSay(0,(string)NUM);
NUM += 1;
}
タイマーを使った処理の行いかた
タイマーを使うときの注意(SIMに負荷をかけないこと)
を学びましょう。
LSL 講座 リンク
2008年02月20日
【講座】誰でもできるLSL 変な数
LSL 講座 リンク
こんにちは。
風邪がなおりつつある jvnです。
はじめに
今日もサンプルソースを変更します。。。
予習している人、ごめんなさい。
でも、その予習は無駄じゃない!
string MESSAGE = "Jvn love"; // ①
default
{
touch_start(integer num)
{
llSay(0,MESSAGE); // ②
MESSAGE = MESSAGE + " more love"; // ③
}
}
復習
ソースの流れがわからない人は 前回の講習をもう一度読んでください。
まず、○○ というステートに入るんでしたね。
それから イベントが起きると イベントの中の関数が実行されるんですよね。
こんかいは touch_start というイベントをつかっています、
touch_start イベント と llSay関数 の意味は自分で調べましょう。
簡単です 上のサンプルソースをクリックすればわかりますね?
変数
変な数
前回学んだステートの前に、変な行があります。①
llSay関数の引数(ひきすう)に変な値を渡しています。②
これはいったいなんでしょう。
こいつは変な数だから 変数といいます。
嘘です。
変数という名前は本当ですが、変な数だから というのは嘘です。
数学ででてきた x とか y と同じものです。
変数とは プログラムの実行中に変わる値のことです。
変値にしたほうがわかりやすいのに、と思いますが
変数と呼ぶことになっているので、変数と呼びましょう。
変数の宣言
変数を使うときは、 変数をこの名前で使うよ という宣言を書きます。①
ここでは string という型の MESSAGE という変数を使うよ ということを宣言しています。
LSLでは default ステートの前に書くことになっています。
おや
型 また新しい言葉が出てきました。
型ってなんでしょう。
llSay 関数をクリックしてみてください。
llSay(integer channel, string text)
なんて出てきますね。
この太字の部分が型です。
integer は整数をここに入れる、という意味です。
string は文字をここに入れる、という意味です。
channel と text は引数の意味をわかりやすくするための名前です。
ここは別に (integer a, string b) でもいいんですが、こういう名前のほうがわかりやすいですよね?
冒頭の宣言では MESSAGE と名づけていますが、この名前も 自由です。
できるだけ役割がはっきりわかる名前をつけるようにしましょう。
プログラムに出てくる変数は 方程式に出てくる変数のように いろいろなものが入ります。
整数、少数、文字、ベクトル値、回転値。。。
なので、この変数には どういう 型の値が入るか、というのを明確にする仕組みになっています。
この仕組みのおかげで、整数がほしいところに ”今日はいい日だった” なんて文字をいれるとちゃんとエラーを教えてくれます。
しばりを多くすることで、予想外のエラーを防ぐのがプログラムの考え方です。
なんだか窮屈に感じられるかもしれませんが、
覚えてくると、作法が決まっているのはわりと心地よいものです。
今日、覚える言葉は次の2つです。
変数
型
セットで覚えましょう。
変数ってなに?
型ってなに?
この質問に答えられるようになるまで、
ここまでの文章を読み直してください。
if( 答えられない質問がある ){
jump First;
}
あ、↑このソースはまだ気にしないでいいですw
変数に値を入れる
変数を宣言しただけでは、実際の値として使えません。
変数の中に値を入れなければいけません。
今回のサンプルソースで値を入れているのは、
①と③ のところです。
① では
文字の MESSAGE という変数を宣言するのと同時に "Jvn love" をセットしています。
宣言するときに 値を入れなくても問題はありません。
string MESSAGE;
これでも十分です。
③ はちょっとわかりにくいです。
MESSAGE に MESSAGE + "love " をセットしています。
これは "Jvn love more love" になります。
つけたしてるんですね。
文字の付け足しは
MESSAGE += "love "
ともかけます。
覚えているとちょっとかっこいい使い方です。
タッチというイベントが起こるたびに
- llSay が実行されて
- MESSAGE に " more love" が付け足される
以上、それだけです。
変数の値を読む
変数の値を関数に渡すと
関数は実行されます。
llSay(0,MESSAGE);
1回目はこう書いたのと同じ結果になります。
llSay(0,"Jvn love");
2回目はこう書いたのと同じ結果になります。
llSay(0,"Jvn love more love");
このように、変化する値をプログラムに書くには
変数は便利ですね。
変数 変な数って言ってごめんよ。お前はいいやつだ。
実行結果はどうなる?
では、実行してみましょう。
スクリプトをプリムに入れて タッチしてください。
もう一度タッチしてください。
もう一度タッチしてください。
他の人がいないところでやるのがお勧めです。
日本中のサンドボックスでjvnへの愛がささやかれるわけですね。
にやにや
何が表示されましたか??
どうしてそのように表示されるか説明できますか??
愛をささやく相手の名前を、あなたのLover(もしくは想い人(もしくは自分))の名前にしてみましょう。
小さな声でささやくなら llSay を llWhisper にしてみましょう。
愛を叫ぶなら どうすればいいですか? IncSearch の出番です chat で検索してみましょう。
まとめ
今日は、変数と型を学びました。
integer、string 以外にも 型はありますが、おいおい説明しましょう。
functions や events を IncSearch して、引数の型に思いを馳せてみましょう。
次回予告
次回は IF と 型 integer を学びます。
前回、次回予告で出したサンプルを今度こそ使います。
タッチするたびに 回転のON/OFFが切り替わるスクリプトを勉強しましょう。
integer FG = TRUE;
default
{
touch_start(integer num){
if(FG)
{
llTargetOmega(<1,0,0>,PI,.5);
}else{
llTargetOmega(<1,0,0>,0,0);
}
FG = !FG;
}
}
毎回言ってますが、コードは
手を動かして、打つべし、打つべし、打つべし。
体で学びましょう^^
LSL 講座 リンク
2008年02月19日
【講座】誰でもできるLSL 基本
LSL 講座 リンク
こんにちは jvnです。
風邪なおったかなぁ、と思ったら
具合が悪くて、会社を初早退です。
しばらくSLお休みしよう。。。と思いつつブログは更新
昨日の予告どおり、サンプルソースの解説をします
コメントで要望があったので、実行している関数が違います。
基本は同じだと思ってください。
このスクリプトを プリムの中に書くと
おもむろにプリムがまわります。
ぐるぐる
今日の目標
単純に実行されるだけのLSLを書けるようになる
もう実現しましたね。
あなた天才。
では、解説です。
LSLに限らず、プログラムは
書いてあることを順番にコンピュータが実行します。
なので
・どのタイミングで
・なにを行うか
これさえ書けば、
実際に動くプログラムができあがります。
文字をプリムに表示するのも
タッチしてノートを渡すベンダーを作ることも
回転するスクリューをつくるのも
LSLで動いているものは すべてこの原理で動いています。
タイミングについて
ステート
イベント
の項で説明します。
なにかを行う について
関数
で説明します。
タイミングは軽く流すつもりですが
書いていたら長くなりました。
文字は多いですが、中身は薄いです。
さらっといきましょう。
まず、LSLを実行すると
default という ステートに入ります。
① から ①ー1 までが defaultステートです。
ステートとはなんぞや という話しはまた今度。
「実行すると」 というのは次のタイミングです。
これらのタイミングで
default ステートに入ります。
おじゃまします
いらっしゃいませ
ステートにはいると
イベントがいくつか書いてあります。
イベントというのは タイミングを決めるものです。
タッチしたときに ここを実行
座ったときに ここを実行
rezされたときに ここを実行
なんて感じに、イベントを設定することができる というわけ。
LSLでは どんなイベントが書けるのかなぁ と思った人は
LSL IncSearch で [events] と打ち込んでみましょう。
LSLで実行できるイベントの一覧がでてきます。
②に書いてあるのは 「ステートに入ったとき」というイベントです。
default に入ると、
default に入る
state_entry() に入る
こんなタイミングで処理が動きます。
ステートのことは触れません、といいましたが触れます。
ひとつのステートに 同じイベントをいくつも書くことは出来ません。
だから、同じイベントで違う処理を行いたいときは
ステートを複数書きます。
あーあ 説明しちゃった。
ステートも イベントも
{ から始まって
} で終わります。
この中括弧の使い方は覚えましょう。
LSLの基本です。
始まりと終わりの {} はスペースや改行無しで書いてもかまいませんが、
見にくくなるので、 スペースで頭をそろえましょう。
jvnは
ステートの {} は行の頭
イベントの {} はタブを1ついれてから書く
とやっています。
スペースの数は各々の勝手ですが、
ひとつのプログラムの中では統一したルールにしましょう。
これは 別にやらなくてもプログラムは動きますが
ソースを見やすくするためには とても重要な点です。
これを 「インデントを入れる」 と言います。
友達のソースを見て
とか
とか書いてあったら
「インデントをそろえてみたら 見やすくなるんじゃない?」
と言うとちょっと出来る人っぽくなります。
実際に言ったら ムッ とされました。
気をつけましょう。
出来るひとはねたまれます。
イベント という タイミング で LSLの実行の順番が決まる
ステート は イベント の セット である。
ということを覚えましょう。
実際に何を実行するか 見てみましょう。
イベントの中には
関数 というものを書きます。
関数 は何を行うか を書くものです。
サンプルソースの ③ のところですね。
LSLで使える関数を 例のごとく LSL IncSearch で検索してみましょう。
[functions] で出てくるのが関数の一覧です。
334 個もでてきました。
これ全部覚えるのは大変です。
なので、関数の基本的な使い方を覚えたら あとはリファレンスを見ましょう。
それで十分です。
jvnも全部覚えていません。
ていうか、覚えられないから 検索ツールを作りました。
やっているうちによく使う関数は 覚えてしまいます。
何回も手で打ってるうちに覚えちゃうからです。
今後のこの講座では
主だったイベントについての説明
関数の使い方の説明
をやる、と思ってください。
さて、今日のサンプルソースは
llTargetOmega(<1,0,0>, PI, 0.5);
を実行しています。
プリムを回転させる関数ですね。
関数名();
関数名( 値 );
が、関数の書き方です。
; は関数のおしまいに書きます。
これがないと エラーが出ます。
意外にはまるので 気をつけましょう。
関数に渡す値のことは 引数 といいます。
jvnはこれをずっと いんすう と読んでいました。
会社に入ってばかにされました。
これは ひきすう と読みます。
いいですか ひきすう ですよ。
牛がもぐもぐするのは はんすう です。
ひきすう 覚えましょう。
引数が必要な関数があれば、必要ない関数もあります。
関数の説明と一緒に、引数の説明も必ずあるので
リファレンスを調べましょう。
関数の説明と 引数の説明は マウスでクリックしたら出ます。
以上。
わはは。
関数 は 実行すること を書く。
実行の仕方を 引数 で設定しなきゃいけないこともあります。
次は タッチイベント の説明と
変数 というものを勉強します。
変数は 引数に渡す値をちょっと工夫して持つための仕組みです。
くれぐれも、ソースをコピーすることなく
実際に手を動かして打ち込みましょう!
では また次回。
LSL 講座 リンク
こんにちは jvnです。
風邪なおったかなぁ、と思ったら
具合が悪くて、会社を初早退です。
しばらくSLお休みしよう。。。と思いつつブログは更新
まずは基本
昨日の予告どおり、サンプルソースの解説をします
default // <-- ① デフォルトステート
{
state_entry() // ② イベント
{
llTargetOmega(<1,0,0>, PI, 0.5); // ③ここに好きな関数を入れてみよう
} // -->②ー1 state_entry イベントはここまで
} // -->①ー1 default ステートはここまで
コメントで要望があったので、実行している関数が違います。
基本は同じだと思ってください。
このスクリプトを プリムの中に書くと
おもむろにプリムがまわります。
ぐるぐる
今日の目標
単純に実行されるだけのLSLを書けるようになる
もう実現しましたね。
あなた天才。
では、解説です。
導入
LSLに限らず、プログラムは
書いてあることを順番にコンピュータが実行します。
なので
・どのタイミングで
・なにを行うか
これさえ書けば、
実際に動くプログラムができあがります。
文字をプリムに表示するのも
タッチしてノートを渡すベンダーを作ることも
回転するスクリューをつくるのも
LSLで動いているものは すべてこの原理で動いています。
タイミングについて
ステート
イベント
の項で説明します。
なにかを行う について
関数
で説明します。
タイミングは軽く流すつもりですが
書いていたら長くなりました。
文字は多いですが、中身は薄いです。
さらっといきましょう。
LSL の実行タイミング
ステート
まず、LSLを実行すると
default という ステートに入ります。
① から ①ー1 までが defaultステートです。
ステートとはなんぞや という話しはまた今度。
「実行すると」 というのは次のタイミングです。
- スクリプトをプリムに入れたとき
- スクリプトのリセットを押したとき
- スクリプトを変更して保存したとき
これらのタイミングで
default ステートに入ります。
おじゃまします
イベント
いらっしゃいませ
ステートにはいると
イベントがいくつか書いてあります。
イベントというのは タイミングを決めるものです。
タッチしたときに ここを実行
座ったときに ここを実行
rezされたときに ここを実行
なんて感じに、イベントを設定することができる というわけ。
LSLでは どんなイベントが書けるのかなぁ と思った人は
LSL IncSearch で [events] と打ち込んでみましょう。
LSLで実行できるイベントの一覧がでてきます。
②に書いてあるのは 「ステートに入ったとき」というイベントです。
default に入ると、
default に入る
state_entry() に入る
こんなタイミングで処理が動きます。
ステートのことは触れません、といいましたが触れます。
ひとつのステートに 同じイベントをいくつも書くことは出来ません。
だから、同じイベントで違う処理を行いたいときは
ステートを複数書きます。
あーあ 説明しちゃった。
ステートも イベントも
{ から始まって
} で終わります。
この中括弧の使い方は覚えましょう。
LSLの基本です。
始まりと終わりの {} はスペースや改行無しで書いてもかまいませんが、
見にくくなるので、 スペースで頭をそろえましょう。
jvnは
ステートの {} は行の頭
イベントの {} はタブを1ついれてから書く
とやっています。
スペースの数は各々の勝手ですが、
ひとつのプログラムの中では統一したルールにしましょう。
これは 別にやらなくてもプログラムは動きますが
ソースを見やすくするためには とても重要な点です。
これを 「インデントを入れる」 と言います。
友達のソースを見て
default
{
state_entry
{
llSay(0,"Uhehehehee");
}
}
とか
default{state_entry{llSay(0,"Uhehehehee");}}
とか書いてあったら
「インデントをそろえてみたら 見やすくなるんじゃない?」
と言うとちょっと出来る人っぽくなります。
実際に言ったら ムッ とされました。
気をつけましょう。
出来るひとはねたまれます。
タイミング のまとめ
イベント という タイミング で LSLの実行の順番が決まる
ステート は イベント の セット である。
ということを覚えましょう。
何を行うか
関数
実際に何を実行するか 見てみましょう。
イベントの中には
関数 というものを書きます。
関数 は何を行うか を書くものです。
サンプルソースの ③ のところですね。
LSLで使える関数を 例のごとく LSL IncSearch で検索してみましょう。
[functions] で出てくるのが関数の一覧です。
334 個もでてきました。
これ全部覚えるのは大変です。
なので、関数の基本的な使い方を覚えたら あとはリファレンスを見ましょう。
それで十分です。
jvnも全部覚えていません。
ていうか、覚えられないから 検索ツールを作りました。
やっているうちによく使う関数は 覚えてしまいます。
何回も手で打ってるうちに覚えちゃうからです。
今後のこの講座では
主だったイベントについての説明
関数の使い方の説明
をやる、と思ってください。
さて、今日のサンプルソースは
llTargetOmega(<1,0,0>, PI, 0.5);
を実行しています。
プリムを回転させる関数ですね。
関数名();
関数名( 値 );
が、関数の書き方です。
; は関数のおしまいに書きます。
これがないと エラーが出ます。
意外にはまるので 気をつけましょう。
関数に渡す値のことは 引数 といいます。
jvnはこれをずっと いんすう と読んでいました。
会社に入ってばかにされました。
これは ひきすう と読みます。
いいですか ひきすう ですよ。
牛がもぐもぐするのは はんすう です。
ひきすう 覚えましょう。
引数が必要な関数があれば、必要ない関数もあります。
関数の説明と一緒に、引数の説明も必ずあるので
リファレンスを調べましょう。
llTargetOmega(<1,0,0>, PI, 0.5);
関数の説明と 引数の説明は マウスでクリックしたら出ます。
以上。
わはは。
まとめ
関数 は 実行すること を書く。
実行の仕方を 引数 で設定しなきゃいけないこともあります。
次回予告
次は タッチイベント の説明と
変数 というものを勉強します。
変数は 引数に渡す値をちょっと工夫して持つための仕組みです。
integer FG;
default
{
touch_start(integer num)
{
llSay(0,(string)FG);
FG = !FG;
}
}
くれぐれも、ソースをコピーすることなく
実際に手を動かして打ち込みましょう!
では また次回。
LSL 講座 リンク
2008年02月18日
【講座】誰でもできるLSL 予告
LSL 講座 リンク
こんばんは、jvnです。
今日は会社があるので風邪薬を飲みませんでした。
そしたら調子がよかったので お治ったかな、と思って
いちおうさっき風邪薬を飲んだらまた調子が悪くなりました。
もしかして 風邪治ってる? 薬のせい?
今日からLSL講座をひらこうかな、と思ってます。
LSL色つけツールも使ってみようかと。
といっても ためになるブログやホームページはたくさんあるので
特徴となる点が必要ですね。
なので こうしましょう。
誰でもできる LSL ということで 全くプログラム経験のない人を対象とします!
次のような人たちを対象とします。
できるだけ、動くサンプルを提示します。
ただ動くだけではなくて、組み合わせて実際に使える仕組みにします。
動いて うわ おもしろい って経験すると絶対に学ぶ速度があがります。
講座を受けるみなさんは、ソースをコピーするのではなく、
実際に手を動かしてコードを書いてください。
まねでもいいです。
手を動かすことが大事なんです。
LSL IncSearch と LSL 色つけツール を活用して
わからない点はどんどん調べてください。
日本語解説では Blacksheep Wiki の右にでるサイトはありません。
また、英語と少しながら日本語の説明もある 公式 LSL Wiki の情報は一番確実な情報です。
jvn のつくったツールはこの2つのサイトをソースにしています。
できるだけあっちこち見ないですむように つくったツールでもあります。
出来る人は自分であちこちみられるとおもいますが、
慣れない人はあちこちみつけるのが大変だと思うからです。
ということで 明日から講座を始めたいと思いますが
みなさん、ぜひコメントしてください。
質問したほうがみなさんの理解を助けることになるでしょうし
私としても、どのあたりで みなさんがつまづくかわかりませんから、
質問していただけると 説明しやすいです。
あと、コメントがあるとやる気がでますのでw
解説は明日します。
というか、マウスでなでまくれば理解出来ると思います。
まずは 予習。
それから、解説を読んでください。
くれぐれも 手を動かしてコードを書いてください。
それでは、また明日。
LSL 講座 リンク
こんばんは、jvnです。
今日は会社があるので風邪薬を飲みませんでした。
そしたら調子がよかったので お治ったかな、と思って
いちおうさっき風邪薬を飲んだらまた調子が悪くなりました。
もしかして 風邪治ってる? 薬のせい?
LSL講座をはじめます
今日からLSL講座をひらこうかな、と思ってます。
LSL色つけツールも使ってみようかと。
といっても ためになるブログやホームページはたくさんあるので
特徴となる点が必要ですね。
なので こうしましょう。
誰でもできる LSL ということで 全くプログラム経験のない人を対象とします!
対象者
次のような人たちを対象とします。
- プログラム経験したことがない
- ものはつくれるけど LSLはちょっと><
- jvn大好き
内容
できるだけ、動くサンプルを提示します。
ただ動くだけではなくて、組み合わせて実際に使える仕組みにします。
動いて うわ おもしろい って経験すると絶対に学ぶ速度があがります。
講座を受けるみなさんは、ソースをコピーするのではなく、
実際に手を動かしてコードを書いてください。
まねでもいいです。
手を動かすことが大事なんです。
LSL IncSearch と LSL 色つけツール を活用して
わからない点はどんどん調べてください。
日本語解説では Blacksheep Wiki の右にでるサイトはありません。
また、英語と少しながら日本語の説明もある 公式 LSL Wiki の情報は一番確実な情報です。
jvn のつくったツールはこの2つのサイトをソースにしています。
できるだけあっちこち見ないですむように つくったツールでもあります。
出来る人は自分であちこちみられるとおもいますが、
慣れない人はあちこちみつけるのが大変だと思うからです。
コメントしてください
ということで 明日から講座を始めたいと思いますが
みなさん、ぜひコメントしてください。
質問したほうがみなさんの理解を助けることになるでしょうし
私としても、どのあたりで みなさんがつまづくかわかりませんから、
質問していただけると 説明しやすいです。
あと、コメントがあるとやる気がでますのでw
最後にサンプルソース
default{
state_entry(){
llSetText("study! lsl!",<1,0,0>,1.0);
}
}
解説は明日します。
というか、マウスでなでまくれば理解出来ると思います。
まずは 予習。
それから、解説を読んでください。
くれぐれも 手を動かしてコードを書いてください。
それでは、また明日。
LSL 講座 リンク