はい、こんにちは。わたくしです。
今回も例によって例のごとく、自分が忘れないようにするためのスクリプトの忘備録です。
ダイアログとリッスンについて書きます。
ダイアログとリッスンは同時に使われます。
最初、ダイアログになんでリッスンがくっついてくるのか分かりませんでした。
でも分かったことは、ダイアログのボタンを押すとオブジェクトがその内容を発言している、ということです。
発言したものを聞くのがllListen命令であり、それが実行されるとlistenイベントが起こるということです。
ダイアログの命令を見てみると、
llDialog(key id, string message, list buttons, integer chat_channel)となっています。
ダイアログを使うとこの()の中身をダイアログが発言します。
()の中身をそれぞれ見て見ましょう。
・key id 誰のSLビューアの画面上にダイアログを表示されるか
・string message ダイアログに表示される言葉
・list buttons ダイアログに表示されるボタンの名前
・integer chat_channel どのチャンネルでダイアログが発言するか 以上のような感じになります。
key idの部分はアバタのUUIDを書くことになりますが、そのアバタそれぞれのUUIDなんかどこにも表示されません。
ではどうするか?便利な命令が用意されています。
例えばタッチしたアバタのUUIDならllDetectedKey(0)と書けばOKです。
オブジェクトのオーナーならllGetOwner()と書けばOKです。
これでいちいちUUIDを打ち込まなくてもよくなります。
string messageの部分はダイアログに表示される文章、例えば「色を選んでくだされ。」などと書きます。
ここの部分には文字であるstring型を入れないといけないのでそのお約束として文章を""ではさみます。
list buttonsにはダイアログのボタンに表示される名前を書きます。
integer chat_channelにはダイアログがどのチャンネルでしゃべるかを自分で好きなのを勝手に選んで入れます。
integer型なので整数の数字を入れます。
125とか9813とかなんでもいいです。
TVとかラジオのチャンネルと同じ感覚です。
周りの他の人との混線を防ぐためにその都度乱数を発生させるという方法があります。
乱数発生にはllFrand()という命令を使います。
llFrand()はfloat型(小数点付きの数字)なのでそれを防ぐために整数(integer型)になおすといいです。
これにはllFloor()という命令を使います。
実際のやり方は llFloor(llFrand(512))などと書きます。
混線を防ぐためには llFloor(llFrand(512) + 6541)などと書きます。
これをすると0から512の範囲内の数字(整数)がランダムに決定されてそのランダムな数に6541が足されます。
こうすると0から512までの合計513個のランダムな数字にさらに6541なんていう数が足されることになるので混線するのをかなりの確立で防ぐことができると思います。
ちなみにチャンネル0は公共電波です。
すべての人が自動的に聞いているチャンネルが0なのです。
だからよく使うllSayはllSay(integer channel, string message)というつくりなのですが、
みんなに発言が聞こえるようにチャンネルの部分を0にして
llSay(0, "こにゃにゃちは")と書くことが多いのです。
ちなみに上に書いたようにllFloor(llFrand(512) + 6541)と書いたのは
公共チャンネルの0を使わないようにした工夫です。
llFloor(llFrand(512) )だけだと0から512までの数字をランダムで拾います。
0を避けるために後ろに+6541などという0以上の数値を足しているのです。
こうすればllFloor(llFrand(512) )の値が0だとしても後ろに正の数を足してるので
決して0チャンネルになることはありません。
さて次に聞くという命令のllListenを見ましょう。
llListen(integer channel, string name, key id, string msg)
・integer channel 聞き取るチャンネルです。
・string name 誰の発言を聞くかです。
・key id これも誰の発言を聞くかですが、こちらはUUID指定です。
・string msg 何という文章を聞くかです。
integer channnelですが、ダイアログの命令を聞きたければllDialogで指定したのと同じチャンネルを書けばOK。
string nameは誰の発言を聞くかなのでアバタとかオブジェクトの名前を書きます。
全てのアバタ、オブジェクトの発言を聞いてもいいっていう場合は""と書きます。
しかし全てのアバタ、オブジェクトの発言と言っても上のchannelでチャンネルを指定してるので、そのチャンネル以外のアバタ、オブジェクトの発言は聞こえないので安心です。
key idも誰の発言を聞くかを書きます。
string nameと違ってこっちはUUIDでの指定になります。
全てのアバタ、オブジェクトの発言を聞くにはNULL_KEYというのを書いとけばOKです。
これもチャンネル指定されてるのでstring nameのときと同じようにそのチャンネル以外のアバタ、オブジェクトの発言は聞こえないので安心です。
オブジェクトのオーナーのみの発言を聞くときはこれまた便利なllGetOwner()を書けばOKです。
string msgは何という文章を聞くかを書きます。
これもまた全ての発言を聞くには""を書けばOKです。
すべての発言を聞くといってもまたまたチャンネル指定されてるのでそのチャンネル以外の発言は聞かないので安心です。
さて、llListen命令がされたらlistenイベントが発生します。
listenイベントは以下のようになってます。
listen(integer ch, string name, key id, string msg){ 処理 }
意味はinteger chのチャンネルでstring nameさんまたはkey idさんのstring msgという発言を聞いたら {}内の処理をするということです。
「ダイアログのあるボタンを押したら」というのはstring msgの部分に入ってきます。
これが最初はよく分かりませんでした。
ダイアログのボタンを押したらっていう命令はなんなのかというのを以前は悩んでました。
ちなみにllListenは負荷が強いらしいのでどっかでllListenRemoveという命令を使って切らないといけないらしいです。
切り方はダイアログが出て30秒後に切るという方法などがいいようです。
簡単に書くと、
=======================================
touch(integer x){
integer handle = llListen(~);//リッスン開始
llDialog(~);//ダイアログの表示
llSetTimerEvent(30.0);//30秒ごとにタイマー発動
}
timer(){//タイマーが発動したら、
llSetTimerEvent(0.0);//タイマーを切る
llListenRemove(handle);//リッスンを切る
llSay(0, "時間切れじゃ!");//時間切れだと発言して知らせる
} =======================================
みたいな感じです。
こちらのブログもよろしくお願いします。 ブロガーの方のやつ
2 コメント:
ちゃんねるは、負の数値を入れるとスクリプト以外は発言できないチャンネルになるので、マイナスを入れるとよりいいかもしれません。
英語と一緒w
なんとなく文法覚えて、それで組み立て方をそこはかとなく把握して、
あとは単語(関数)をそのつど調べて書いていく感じ。
基本の文法がわかってればなんとかかんとか応用はきくよね。っていう。
じゃないと複雑なものが組み立てられんくなるぜw
コメントを投稿