はい、こんにちは。わたくしです。今回も自分のための忘備録です。
こんなことがよくあります。タッチしたらある処理が始まる。
しかしその処理の途中で違う人がタッチしたら困る。 それが以下の例です。
===========================================
touch_start(integer x){
key id = llDetected(0);
string your_name = llKey2Name(id);
//処理
llSay(0,"お前の名前を当ててやろう");
llSleep(3.0);
llSay(0, "お前の名前はズバリ! 「" + your_name + "」でしょう~~");
}
===========================================
これはタッチした人のアバタ名を当てるスクリプトです。
ここで困ったことに//処理以下をしているときに違う人がオブジェクトにタッチしたら、
llDetectedKey(0)が違う人のUUIDになってしまいます。
なので最初にタッチした人の名前が返ってこなくなります。
これをどうにか防ぎたい。
後からタッチした人は無視できるようにしたい。
それが以下のやり方です。
後からタッチした人を無視する方法
===========================================
state_entry(){
list idlist = [];//idlistというのを作って最初は中身カラッポ
}
touch_start(integer x){
integer i;
for(i = 0; i>x; i++){//i>xの間、iを1づつ増やす。つまり永遠に増やし続ける
idlist += llDetectedKey(i);//タッチした人のUUIDリストを作りまくる
}
if(llDetectedKey(i) != llDetectedKey(0)){//タッチした人が最初の人(llDetectedKey(0))じゃなかったとき return;//以下の処理はしない
}
else if(llDetectedKey(i) == llDetectedKey(0)){//タッチした人が最初の人だったとき
key id = llDetected(0);//最初にタッチした人のUUIDを取得
string your_name = llKey2Name(id);//UUIDをstring型に変換
//処理
llSay(0,"お前の名前を当ててやろう");
llSleep(3.0);
llSay(0, "お前の名前はズバリ! 「" + your_name + "」でしょう~~");
llResetScript();//タッチした人が複数人いたらinteger iに数値が入っているので全てリセットする
}
}
===========================================
以上です。
つまりはタッチした人のリストを作って、
その人が0番目にタッチした人(=最初にタッチした人)じゃなかったらガン無視。
0番目にタッチした人(=最初にタッチした人)だったら
以下の処理を続けるというあんばいです。
これ、結構使えます。
こちらのブログもよろしくお願いします。 ブロガーの方のやつ
0 コメント:
コメントを投稿