タッチイベントの途中に違う人にタッチを割り込ませない方法

はい、こんにちは。わたくしです。今回も自分のための忘備録です。

こんなことがよくあります。タッチしたらある処理が始まる。

しかしその処理の途中で違う人がタッチしたら困る。 それが以下の例です。

===========================================

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 コメント:

コメントを投稿