2007年05月13日
2007/05/13 マウスイベント試作(2)
作成中のマウスイベントモジュール。
harayokiさんの作りにならって、
MessageLinkを使ってまとめてみました。
■イベント通知側
■イベント受け手側サンプル
・定義したイベント
・mouseUp
・mouseDown
・mouseHeld(一定時間長押しで発生)
・singleClick
・doubleClick
・tripleClick(3回以上連続クリックで発生)
・いちおう標準でトリプルクリックまで定義してみました。
・リンク全体に対して、イベント名と、touchされているlinknumber、それとtouchしている人のkeyが通知されます。
・あと、マルチクリックイベントの判定とは別に単純なマウスアップ・ダウンも通知するようにしてみた。ユーザーへのフィードバックとしてのボタン表示ハイライトとか用に。
・今回のマウスイベントは処理の都合から1ユーザーのみの排他処理としているけど、たとえば長押し途中でその人が落ちたりするとmouseUpが通知されなくてholdされたままだったりするので対処が必要。touchイベントで連続押しを判定するか、一定時間後に強制リリースかなあ。

(各種イベントの確認。中段がハイライト中)
harayokiさんの作りにならって、
MessageLinkを使ってまとめてみました。
■イベント通知側
//MouseEventGenerator
float MOUSE_DOWN_TIMER = 0.8;
float MOUSE_UP_TIMER = 0.25;
integer NO_SELECT = -5;
integer iTouchedLinkNum;
integer iClickCount;
integer bOnPress;
key kToucher;
//mouse events
MouseDown()
{
llMessageLinked(LINK_SET, iTouchedLinkNum, "miyaoka.event.mouseDown", kToucher);
}
MouseUp()
{
llMessageLinked(LINK_SET, iTouchedLinkNum, "miyaoka.event.mouseUp", kToucher);
}
SingleClick()
{
llMessageLinked(LINK_SET, iTouchedLinkNum, "miyaoka.event.singleClick", kToucher);
}
DoubleClick()
{
llMessageLinked(LINK_SET, iTouchedLinkNum, "miyaoka.event.doubleClick", kToucher);
}
TripleClick()
{
llMessageLinked(LINK_SET, iTouchedLinkNum, "miyaoka.event.tripleClick", kToucher);
}
MouseHeld()
{
llMessageLinked(LINK_SET, iTouchedLinkNum, "miyaoka.event.mouseHeld", kToucher);
}
Init(){
iTouchedLinkNum = NO_SELECT;
iClickCount = 0;
bOnPress = FALSE;
kToucher = NULL_KEY;
}
default
{
state_entry()
{
Init();
}
touch_start(integer detected)
{
//set link num
integer num = llDetectedLinkNumber(0);
if(iTouchedLinkNum != num){
iTouchedLinkNum = num;
iClickCount = 0;
}
//set toucher key
key toucher = llDetectedKey(0);
if(NULL_KEY == kToucher){
//first toucher
kToucher = toucher;
iClickCount = 0;
} else if(toucher == kToucher){
//same toucher
} else{
//another toucher
return;
}
//raise mouseDown event
MouseDown();
//mouseDown start
bOnPress = TRUE;
llSetTimerEvent(MOUSE_DOWN_TIMER);
}
touch_end(integer detected)
{
//is same toucher?
if(llDetectedKey(0) != kToucher) return;
//raise mouseUp event
MouseUp();
//after mouseHeld event?
if(!bOnPress) {
Init();
return;
}
//add click
iClickCount += 1;
//mouseUp start
bOnPress = FALSE;
llSetTimerEvent(MOUSE_UP_TIMER);
}
timer()
{
llSetTimerEvent(0);
if(bOnPress){
MouseHeld();
//release mousePress
bOnPress = FALSE;
}
else if(1 == iClickCount){
SingleClick();
Init();
}
else if(2 == iClickCount){
DoubleClick();
Init();
}
else if(2 < iClickCount){
TripleClick();
Init();
}
}
}
■イベント受け手側サンプル
default {
link_message(integer sender, integer num, string message, key id)
{
if (message == "miyaoka.event.mouseDown")
{
HighlightColor(num);
llOwnerSay("mouseDown:" + (string)num);
}
else if (message == "miyaoka.event.mouseUp")
{
ResetColor(num);
llOwnerSay("mouseUp:" + (string)num);
}
else if (message == "miyaoka.event.mouseHeld")
{
// ResetColor(num);
llOwnerSay("mouseHeld:" + (string)num);
}
else if (message == "miyaoka.event.singleClick")
{
ResetColor(num);
llOwnerSay("singleClick:" + (string)num);
}
else if (message == "miyaoka.event.doubleClick")
{
ResetColor(num);
llOwnerSay("doubleClick:" + (string)num);
}
else if (message == "miyaoka.event.tripleClick")
{
ResetColor(num);
llOwnerSay("tripleClick:" + (string)num);
}
}
}
・定義したイベント
・mouseUp
・mouseDown
・mouseHeld(一定時間長押しで発生)
・singleClick
・doubleClick
・tripleClick(3回以上連続クリックで発生)
・いちおう標準でトリプルクリックまで定義してみました。
・リンク全体に対して、イベント名と、touchされているlinknumber、それとtouchしている人のkeyが通知されます。
・あと、マルチクリックイベントの判定とは別に単純なマウスアップ・ダウンも通知するようにしてみた。ユーザーへのフィードバックとしてのボタン表示ハイライトとか用に。
・今回のマウスイベントは処理の都合から1ユーザーのみの排他処理としているけど、たとえば長押し途中でその人が落ちたりするとmouseUpが通知されなくてholdされたままだったりするので対処が必要。touchイベントで連続押しを判定するか、一定時間後に強制リリースかなあ。

(各種イベントの確認。中段がハイライト中)
Posted by みやおか at 08:40
│Comments(0)
│
