2008年07月03日

長押しクリック

お世話になります。

クリックを長押しでダイアログを表示させるのをよくみかけるのですが
「長押し」という関数があるんでしょうか・・
それともtouchイベントで作成する方法なんでしょうか。

やり方をご存知の方いらっしゃいましたらご教授いただけますでしょうか。
よろしくおねがいします。



Posted by mew3  at 12:22 │Comments(5)TrackBack(0)スクリプト関連

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

http://oshiete.slmame.com/t293031

この記事へのコメント
↓こちらの方の説明が参考になると思います。
http://ogasawara.slmame.com/e156117.html

touch_start()…マウスボタンがクリックされた瞬間
touch_end()…マウスボタンが放された瞬間
この両者のイベントが発生する時間差を調べます。llResetTime()とllGetTime()を使うと簡単です。
ここで、touch_end()の中で測定した時間差が一定以上である場合に「長押しされた」と判断し、処理をするという方法です。
Posted by asa Soyer at 2008年07月03日 13:28
mew3さん、こんにちは。

asa Soyerさんが、厳密な時間のもとでの「長押し」を回答していますので、もっとアバウトで簡単な方法を書きます。

適当な変数を定義してカウンターとして使いtouchイベントの回数をチェックします。

具体的には、

// グローバル変数定義
integer counter;

// 諸々の処理は省略

// 初期値を正の整数としデクリメントして0と比較してもいいのですが、分かりやすくするためにカウントアップ方式)

touch_start(integer num_detected)
{
counter = 0;
}

touch(integer num_detected)
{
counter ++;
if(counter == 60) // 試してみたら、60カウントするのに4~5秒長押しでした
{
llDialog(パラメーター省略);
}
}

これで「長押し」は可能ですが、このままでは問題が出るでしょう。
というのは、押している人を考慮していないということです。
誰かが押している最中に、別の人が押したらcounterはリセットされますし(初期値設定を別の場所でやればよいわけですが)、同じ人が押し続けているのかチェックしていないからです。

その辺は、イベントのパラメーターのnum_detectedと、llDetectedKey関数と、そのキーの保持の仕方を考えれば出来ますよ。
Posted by ささぴ at 2008年07月03日 14:12
いろんなやり方がありますね

私はこんなふうにします
※timerをほかの事に使いたい人には
 お勧めできません。

タッチして一秒たったら処理が始まります
ただし、その処理が始まるまでに
タッチをやめたら、タイマーがクリアされて
処理が始まりません。
結果的に1秒以上押しっぱでないとダメというコードです。

touch_start(){
llSetTimerEvent(1.0);
}
touch_end(){
llSetTimerEvent(0.0);
}
timer()
{
llSetTimerEvent(0.0);
//やりたい処理を書く
}
Posted by you Xiao at 2008年07月03日 20:19
私の製品は長押し使ってるの結構あります。基本的に上のyouさんとほぼ同じやり方ですねー^^

integer hold;

default
{
touch_start(integer total_number)
{
hold=FALSE;
llSetTimerEvent(0.5);
}

touch_end(integer total_number)
{
llSetTimerEvent(0);
if (!hold) llSetColor(<1,0,0>,ALL_SIDES); // タッチで赤色
}

timer()
{
llSetTimerEvent(0);
hold=TRUE;
llSetColor(<0,1,0>,ALL_SIDES); // 長押しは緑色
}
}
Posted by 千尋 at 2008年07月04日 00:46
いろいろ出たので軽く違いを。

asaさんのコード
・timerを他のことに使える
・touchをやめたときに発動
・時間を厳密にチェック

ささぴさんのコード
・timerを他のことに使える
・touchをやめたときに発動
※SIM状況にもよると思いますが
 その回数のtouchイベントが発生するのに
 4~5秒かかるというのは、ある種びっくりでした。
 やってみないとわからないものですね

私のやつ
・timerを他のことに使いにくい
・touchを続けたまま発動

千尋さんのコード
・timerを他のことに使いにくい
・touchを続けたまま発動
・通常のtouchと長押しを区別して処理できる

千尋さんのコードの
「通常のtouchと長押しを区別して処理できる」というのは
大きなポイントだと思います。
また、フラグをひとつ追加するだけで
asaさんやささぴさんのコードにも使えるのもいい感じですよね。
Posted by you Xiao at 2008年07月04日 07:45