2008年05月02日
名前から位置を取得
お世話になります。
センサーで周りにいる人を取得して、ダイアログに表示して
選択した人の位置の座標を取得する
ということをやりたいのですが、sensorでUUIDを取得して
UUIDを名前に変換してlistにいれダイアログを表示するとこまではできました。
その後、選択された名前(UUIDでない)から座標を取得したいのですが
名前からUUIDに変換して、UUIDから位置の座標を取得する以外に方法はないものかと悩んでます。
名前からUUIDへの変換はとても複雑のようで、Makapuさんのサイト
(http://miz.slmame.com/e28137.html#llHTTPRequest)
こちらの方法でも名前が小文字だとうまく変換できなかったり・・・・で
何かよい方法はないものかとおもってます。
ご教授よろしくおねがいします。
センサーで周りにいる人を取得して、ダイアログに表示して
選択した人の位置の座標を取得する
ということをやりたいのですが、sensorでUUIDを取得して
UUIDを名前に変換してlistにいれダイアログを表示するとこまではできました。
その後、選択された名前(UUIDでない)から座標を取得したいのですが
名前からUUIDに変換して、UUIDから位置の座標を取得する以外に方法はないものかと悩んでます。
名前からUUIDへの変換はとても複雑のようで、Makapuさんのサイト
(http://miz.slmame.com/e28137.html#llHTTPRequest)
こちらの方法でも名前が小文字だとうまく変換できなかったり・・・・で
何かよい方法はないものかとおもってます。
ご教授よろしくおねがいします。
この記事へのトラックバックURL
http://oshiete.slmame.com/t226216


センサーで探知したアバターということであれば、探知したときに
・対象のキー(llDetectedKey)
・対象の名前(llDetectedName)
・対称の位置(llDetectedPos)
で、それぞれ取得できます。
センサーイベントの中で、イベントの引数の探知数でループして、必要な情報を取得すればご希望の処理になります。
位置はリージョン座標ですので、相対位置を出したければ基準位置との差分を求めれば相対位置になります。
sensor(integer num_detected)
{
integer i;
list avatar_key = [];
list avatar_name = [];
list avatar_position = [];
for(i = 0; i < num_detected; i ++)
{
avatar_key += [llDetectedKey(i)];
avatar_name += [llDetectedName(i)];
avatar_position += [llDetectedPos(i)];
}
}
alist avatar_name のリストをダイアログで表示して
リストの中の name を選択された場合
そのnama に対する positionを取得したいのですが
listのどれが選択されたか などを認識する方法があるんでしょうか。
(listの何番目とか)
よろしくおねがいします
一から百まで教えてあげることがQuadさんのためになるとは限りません。
ダイアログに表示している名前から、使用しているリスト変数のインデックスを生成する方法です。
先にあげたサンプルの続きとして説明すると、ダイアログに表示するボタン名は、関数
llDialog(key avatar, string message, list buttons, integer chat_channel);
のlist buttonsで渡します。
このときに先のサンプルのlist avatar_nameを渡せば、そのまま探知したアバター名でボタンが表示されます。
※探知された人数が13人以上の場合、ダイアログのボタン数からあふれてしまいますので、なんらかの処理が必要です。
※ダイアログのボタンに表示される文字数には制限がありますので、やたらと長い名前の場合はどうするか考えなければなりません。(そのまま表示でもいいと思いますけど)
ユーザーがダイアログのボタンを押した場合、listenイベントが発生し、ボタン名がそのまま「発言」として引数に渡されます。
表示しているボタンのリストから発言された名前がリストの何番目(インデックス)にあるかというのはllListFindList関数で取得できます。
キー、名前、位置のそれぞれのリスト変数は同じインデックスならば、同一アバターの情報なので(それぞれのリスト変数に格納している時に、そのように格納している)、このインデックスで参照できます。
sensorイベントの中でキー、名前、位置を取得した後の処理
list_number = llGetListLength(avatar_name); // リスト内のデータ数取得
if(list_number <= 12) // 12個以下の場合
{
hundle = llListen(チャンネル, "", ダイアログを表示する人のキー, "");
llSetTimerEvent(時間) // ダイアログを放置されたらタイムアウトするため
llDialog(ダイアログを表示する人のキー, "アバターを選択", avatar_name, チャンネル);
}
else
{
// 13個以上の場合はどうするか?
}
// リッスンイベント
listen(integer chan, string name, key id, string msg)
{
llListenRemove(hundle); // リッスンの解放
llSetTimerEvent(0.0); // タイマー停止
index = llListFindList(avatar_name, [msg]); // インデックス取得
select_key = llList2Key(avatar_key, index); // インデックスからキー取得
select_position = llList2Vector(avatar_position, index); // インデックスから位置取得
}
timer() // ダイアログの放置タイムアウト処理
{
llListenRemove(hundle); // リッスンの解放
llSetTimerEvent(0.0); // タイマー停止
}
とすればよいわけです。(記述の都合上、変数宣言していません。あと日本語で変数名も書いちゃってます)
ここでllListFindList関数で該当しなかった場合、-1が戻り値として返ってくるのですが、この場合ダイアログに表示しているボタン名は、先にリストを作成しているわけですから、該当しないということはあり得ないので、エラーチェックはしていません。
もっともなご指摘です。
そして、「一から百まで教えてあげることが・・・のためになるとは限りません。」ということも分かっています。故意犯です。
自分でスクリプトを作っている人が分からないところがあれば、がっちり教えてあげてスクリプトを組むスキルを上げさせない。
そして、スクリプトは一部のスクリプターの専門技術として確立し、SL内でスクリプトが必要な場合はスクリプターに依頼するのが当然という世界にしてしまい、スクリプターがリンデン$を荒稼ぎする時代に向けて、芽は早いうちに摘んでいるのです。
(ウソです)
うろ覚えですが、24文字を超えているとダイアログ自体が生成できなかったはず・・。
アバター名ならほぼ大丈夫とは思いますが、たまに長い名前+長い苗字な人もいるので、注意して下さいね。
・・と、親切なふりしてハードルを上げて、リンデン$荒稼ぎの時代に・・・・うそです(*´ェ`*)
例えばセンサーを一定周期で動かしていると
センサーで探知→ダイアログ表示→(1)→ユーザー入力→入力された名前でリスト検索
という流れで、思惑としては(1)の部分は何も起こっていないはずなのに、ダイアログが開いてから間があると(1)の部分に次のセンサーの探知イベントが発生してしまいます。
センサーは1発だけの探知にするか、探知したらセンサーを停止して、リッスン処理(またはタイムアウトのタイマー処理)で、センサーを再設定する必要があります。
スクリプトって難しいなぁ。やっぱりスクリプターにお願いした・・・ウソです。
http://zero2000.slmame.com/e198991.html