Harayokiさんのダブルクリックモジュールのエントリを読んで、
http://harayoki.slmame.com/e4781.html
自分でもちょっと作ってみました。
シングルクリック、ダブルクリックの区別に加えて、長押しもできるようにするあたりがねらいです。
というわけで、とりあえずスクリプトはこんな感じ…
------------------------------------------------
↓ここから
float MOUSE_DOWN_TIMER = 0.8;
float MOUSE_UP_TIMER = 0.25;
integer NO_SELECT = -5;
integer iTouchedLinkNum;
integer iClickCount;
integer bOnPress;
SingleClick(integer num)
{
llOwnerSay("click " + (string)num);
}
DoubleClick(integer num)
{
llOwnerSay("dclick " + (string)num);
}
Press(integer num)
{
llOwnerSay("press " + (string)num);
}
Init(){
iTouchedLinkNum = NO_SELECT;
iClickCount = 0;
bOnPress = FALSE;
}
default
{
state_entry()
{
Init();
}
touch_start(integer detected)
{
bOnPress = TRUE;
integer num = llDetectedLinkNumber(0);
if(iTouchedLinkNum != num){
iClickCount = 0;
iTouchedLinkNum = num;
}
llSetTimerEvent(MOUSE_DOWN_TIMER);
}
touch_end(integer detected)
{
bOnPress = FALSE;
if(NO_SELECT == iTouchedLinkNum)
return;
iClickCount += 1;
llSetTimerEvent(MOUSE_UP_TIMER);
}
timer()
{
llSetTimerEvent(0);
if(bOnPress){
Press(iTouchedLinkNum);
}
else if(1 == iClickCount){
SingleClick(iTouchedLinkNum);
}
else if(1 < iClickCount){
DoubleClick(iTouchedLinkNum);
}
iTouchedLinkNum = NO_SELECT;
iClickCount = 0;
}
}
↑ここまで
-----------------------------------------------------
(PREタグ中にBR改行が入って間延びしてしまうので、CSSでPREタグのline-heightを70%程度にしてみました。大丈夫かな?)
と、いうわけで
シングル・ダブルクリック、長押しの各イベントをどう考えて定義してるか以下に図を交えて説明してみます。
■シングルクリック
シングルクリックですが、まずは図の説明をすると…
・下矢印で表しているのが、タッチしたときのイベント。「touch_start」
・上矢印で表しているのは、タッチをやめたときのイベント。「touch_end」
・touch_startイベントと同時にMOUSE_DOWNタイマー(直線、0.8秒間)を走らせます。
・touch_end時にはMOUSE_UPタイマー(点線、0.25秒間)が走ります。
というイメージです。
普通はクリックの検出なんて単純なもので、touch_start時、またはtouch_end時に処理を入れればいいのですが、今回はダブルクリックの検出を考慮しているのでちょっと違います。
「シングルクリックである」ということはつまり「ダブルクリックではない」こと。マウスアップから一定時間経過したら初めてシングルクリックと判定しています。
■長押し
長押しについては、touchし始めると同時にMOUSE_DOWNタイマーを走らせて、マウスが離される前にタイマーが経過した場合に「長押しである」と判定しています。
この場合タイマー経過後にtouch_endイベントが来るのですが、そこは無視するような作りにしてます。
■ダブルクリック
続いてダブルクリックのほうはこんな感じです。
マウスアップと同時にMOUSE_UPタイマーが走って、そのタイマーが経過する前に新しいマウスダウンが来ると継続されていくというイメージです。このときにクリックカウントを加算していて、1回なら即ちシングルクリック、2回ならダブルクリックという振り分け。作りとしてはシングルもダブルもカウント数が違うだけで同じ検出の仕方をしています。
今回は2回以上をダブルクリックとみなすようにしてますが、必要であればトリプルクリック、4回クリックといったカウント別のイベントを定義することも出来ます。(だからといってそのへん細かくしても決して実用的ではないけど…。ただ秀丸エディタなんかだとトリプルクリックでURLを開いたりもするので、1回押し/2回押し/ガチャガチャ押し、というくらいの意識でユーザーが区別して操作できればわりと使えるかな。あ…、というかWindows自体がダブルクリックで一部選択、トリプルクリックで全体選択になってるから、けっこう一般的なのか)
あと今回はHUD用に作ってるので、ルートにこれを仕込んで、どのパーツが押されているか?という判定をしており、ダブルクリックの場合は1,2回目ともに同一のパーツが押されていることも条件になってます。