2008年07月03日
長押しクリック
お世話になります。
クリックを長押しでダイアログを表示させるのをよくみかけるのですが
「長押し」という関数があるんでしょうか・・
それともtouchイベントで作成する方法なんでしょうか。
やり方をご存知の方いらっしゃいましたらご教授いただけますでしょうか。
よろしくおねがいします。
クリックを長押しでダイアログを表示させるのをよくみかけるのですが
「長押し」という関数があるんでしょうか・・
それともtouchイベントで作成する方法なんでしょうか。
やり方をご存知の方いらっしゃいましたらご教授いただけますでしょうか。
よろしくおねがいします。
この記事へのトラックバックURL
http://oshiete.slmame.com/t293031


http://ogasawara.slmame.com/e156117.html
touch_start()…マウスボタンがクリックされた瞬間
touch_end()…マウスボタンが放された瞬間
この両者のイベントが発生する時間差を調べます。llResetTime()とllGetTime()を使うと簡単です。
ここで、touch_end()の中で測定した時間差が一定以上である場合に「長押しされた」と判断し、処理をするという方法です。
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関数と、そのキーの保持の仕方を考えれば出来ますよ。
私はこんなふうにします
※timerをほかの事に使いたい人には
お勧めできません。
タッチして一秒たったら処理が始まります
ただし、その処理が始まるまでに
タッチをやめたら、タイマーがクリアされて
処理が始まりません。
結果的に1秒以上押しっぱでないとダメというコードです。
touch_start(){
llSetTimerEvent(1.0);
}
touch_end(){
llSetTimerEvent(0.0);
}
timer()
{
llSetTimerEvent(0.0);
//やりたい処理を書く
}
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); // 長押しは緑色
}
}
asaさんのコード
・timerを他のことに使える
・touchをやめたときに発動
・時間を厳密にチェック
ささぴさんのコード
・timerを他のことに使える
・touchをやめたときに発動
※SIM状況にもよると思いますが
その回数のtouchイベントが発生するのに
4~5秒かかるというのは、ある種びっくりでした。
やってみないとわからないものですね
私のやつ
・timerを他のことに使いにくい
・touchを続けたまま発動
千尋さんのコード
・timerを他のことに使いにくい
・touchを続けたまま発動
・通常のtouchと長押しを区別して処理できる
千尋さんのコードの
「通常のtouchと長押しを区別して処理できる」というのは
大きなポイントだと思います。
また、フラグをひとつ追加するだけで
asaさんやささぴさんのコードにも使えるのもいい感じですよね。