セカンドライフでタッチしている時間によって動作を変える

セカンドライフ制作
スポンサーリンク

はじめに

セカンドライフでタッチしている時間によって動作をかえます。

タイマーを測って動作を切り替える

フラグとllResetTimeとllGetTimeを組み合わせるサンプルです。
作り方によっては、細かく時間を区切ることができます。

なお、ユーザーが一人の場合を想定しています。
複数の場合は、作りを変えた方がいいかもしれません。

integer	is_touching			= FALSE;

touchStart() {
	llOwnerSay("touchStart");
}

shortTouchEnd() {
	llOwnerSay("shortTouchEnd");
}

longTouchEnd() {
	llOwnerSay("longTouchEnd");
}

longlongTouch() {
	llOwnerSay("longlongTouch");
}

default {
	
	touch_start(integer num_detected){
		is_touching		= TRUE;
		touchStart();
		llResetTime();
	}
	
	// 押し続け
	touch(integer num_detected) {
		float timeSec = llGetTime();
		// 1秒以上の押し続け
		if(is_touching && (timeSec >= 3.0)) {
			longlongTouch();
			is_touching = FALSE;
		}
	}
	 
	touch_end(integer num_detected){
		// 1秒未満の押し終わり
		if(is_touching) {
			float timeSec = llGetTime();
			if(timeSec < 1.0) {
				shortTouchEnd();
			}
			else if(timeSec < 3.0) {
				longTouchEnd();
			}
			is_touching = FALSE;
		}
	}
}

タイマーイベントで押した時間を測る

細かいことはできませんが、タイマーイベントを使用しても作ることができます。

ちなみに、これもまた複数ユーザーのことは考えていません・・・

touchStart() {
	llOwnerSay("touchStart");
}

longlongTouch() {
	llOwnerSay("longlongTouch");
}

default {
	
	touch_start(integer num_detected){
		touchStart();
		llSetTimerEvent(0);
		llSetTimerEvent(3);
	}
	
	// 3秒以上押し続けた場合
	timer() {
		llSetTimerEvent(0);
		longlongTouch();
	}
	
	touch_end(integer num_detected){
		llSetTimerEvent(0);
	}
}

複数ユーザーの対応方法

まずどんな場合でも初期状態に戻す初期化関数を作っておきましょう。

クリックされると引数に値が入ってきます。
1つであれば1人かクリックした場合です。
1人がクリックした場合にllDetectedKeyでユーザーのUUIDを内部メモリに保存しましょう。
2人以上がもしクリックした場合は初期化関数を呼びましょう。

クリックが始まったらtouch_startのイベントを締め切りましょう(誰かがクリックするの防止)
あとは、touch関数の引数は1人のときのみのUUIDを確認して、
最初に保存したUUIDと一致するか調べて処理を行います。

タッチが終了したら、内部メモリのUUIDを解放しましょう。

なお、タイミングにより内部メモリにUUIDが残り続ける場合があるので、
タイムアウトできれいにするようにしておくとよいでしょう。

コメント

タイトルとURLをコピーしました