ソラマメブログ
< 2008年07>
S M T W T F S
    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31    
Mail

2007年05月10日

ソース2:ダブルクリックモジール(4)

doubleClick links


戻りました...。
それではダブルクリックモジュールver2のソースコードを公開します。

ver1との違いや使用方法は前のエントリーを見てください。


ちなみに例のハコにもダブルクリックmodule2.00を組み込みました。
むしろ組み込むためにバージョンアップしたのでした。
--
ポイントをかいつまんで解説します。

・ダブルクリックされると"harayoki.event.doubleClick"イベントをllMessageLinked経由で投げてきます。

・シングルクリックされると"harayoki.event.singleClick"イベントをllMessageLinked経由で投げてきます。
その際、integer型の引数部分に、1回目のシングルクリックなのか、
2回目のシングルクリックなのかを表す整数が渡されます。

・同時に複数人のダブルクリック判定はできません。

・SIMが重くラグが大きい場合などは、うまくダブルクリックを取得できない事がありえます。

また、モジュール的使い方ではない事になってしまいますが
このソースを直接変更して微調整を行う事ができます。

・MAX_PRESS_TIMEの値を変更する事でクリックとして扱う
最大のボタンを押している時間(秒)を設定できます。

・同じくMAX_BETWEEN_CLICK_TIMEの値で、
ダブルクリックとして扱う1回目と2回目のクリックの合間の
最大時間(秒)を設定できます。

ダブルクリックしづらい場合などはこれらの値を調整してみてください。

◆DoubleClickModule
//DoubleClickModule (Double Click Event Dispather) ver 2.00
// by harayoki
//2007/5/6 release
//2007 5/9 singleClick event available
integer debug = FALSE;
Trace(string s){
if(debug) llOwnerSay(s);
}
string EVENT_NAME1 = "harayoki.event.doubleClick";
string EVENT_NAME2 = "harayoki.event.singleClick";

key toucher;
float MAX_PRESS_TIME = 0.4;
float MAX_BETWEEN_CLICK_TIME = 0.4;
integer bTimeOuted = FALSE;
Init(){
Trace("Double Click Event Dispather Initialized.");
}
DispatchEvent1(){
llMessageLinked(LINK_SET,0,EVENT_NAME1,toucher);
}
DispatchEvent2(integer num){
llMessageLinked(LINK_SET,num,EVENT_NAME2,toucher);
}
default{
state_entry(){
Init();
state waitPress1;
}
}
state waitPress1{
state_entry(){
Trace("---- waitPress1 ----");
toucher = NULL_KEY;
}
touch_start(integer num){
toucher = llDetectedKey(0);//first one
state waitRelease1;
}
}
state waitRelease1{
state_entry(){
Trace("---- waitRelease1");
bTimeOuted = FALSE;
llSetTimerEvent(MAX_PRESS_TIME);
}
timer(){
Trace("timeout1");
llSetTimerEvent(0);
bTimeOuted = TRUE;
}
touch_end(integer num){
if(toucher != llDetectedKey(0)) return;
if(bTimeOuted){
DispatchEvent2(1);
state waitPress1;
}
state waitPress2;
}
}
state waitPress2{
state_entry(){
Trace("---- waitPress2");
llSetTimerEvent(MAX_BETWEEN_CLICK_TIME);
}
timer(){
Trace("timeout2");
DispatchEvent2(1);
state waitPress1;
}
touch_start(integer num){
if(toucher != llDetectedKey(0)) return;
state waitRelease2;
}
}
state waitRelease2{
state_entry(){
Trace("---- waitRelease2");
bTimeOuted = FALSE;
llSetTimerEvent(MAX_PRESS_TIME);
}
timer(){
Trace("timeout3");
//state waitPress1;
llSetTimerEvent(0);
bTimeOuted = TRUE;
DispatchEvent2(1);
}
touch_end(integer num){
if(toucher != llDetectedKey(0)) return;
if(bTimeOuted){
DispatchEvent2(2);
state waitPress1;
}
DispatchEvent1();
state waitPress1;
}
}


※ご利用は自己責任で!
このscriptが原因で何か問題がおきた場合でも
自分は責任を負いませんので、よろしくお願いします。



この記事へのトラックバックURL