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 講座 リンク
この記事へのトラックバックURL
http://jvn.slmame.com/t151275