« タップ数でダイレクトにセレクトしたい… | トップページ | 『Zippoカイロ』って一回幾ら? »

2010年2月13日 (土)

タップのインターバルってどのぐらい?

前回の『タップ数でダイレクトにセレクトしたい…』で
タップインターバルを0.5秒としたが…
実際に0.5秒と明確に書いてあるものが無い…。(汗)

アップルのヘルプにも書いてないっぽい。

でもインターバルが分からん事には、ディレイの設定ができん…。

こっちには、0.5秒だとある。

Double Tap Detection

説明に
「ダブルタップインターバルのデフォルトは、0.5でしょう。
0.2では、早すぎるし1.0では、遅すぎる。」
みたいな事が書いてある。

本当か?

それをどうしたら確認できる?

ゴロゴロ…

ゴロゴロ…

ゴロゴロ…

ピコン♪

タップをプログラムで発生させどのタイミングで
ダブルタップになるか測定する!

ってのは、どうだろう?

まずは、タッチをどう発生させるか…?

色々、大変そうなのでやめ…。(汗)

もっと簡単な方法は無いかなぁ~?

じゃあ、アトランダムにタップを行い
それを計測するのはどうだろう?

これなら簡単に出来そうだ…。

『touchesBegan』に来た時に時間を取得する。
次の『touchesBegan』に来た時の時間と比較する。
タップと認識している、していない時の時間を
ストックしていって最終的にこの辺りと
絞り込む処理を作成してみよう。

『GetTickCount』みたいな関数が無い…!?

タイマースレッドを立ち上げて自前でカウンターを作るのか!?

精度に難がありそうだけど…
取り合えずやってみる。

[TapTestViewController.h]
- ( void )touchesBegan:( NSSet* )touches withEvent:( UIEvent* )event;

[TapTestViewController.m]
...
NSTimer            *timer;
unsigned int tmerCount;
-(void)timerFunc
{
    tmerCount++;
}
...
- (void)viewDidLoad {
    timer = [NSTimer scheduledTimerWithTimeInterval:0.001 target:self selector:@selector( timerFunc ) userInfo:nil repeats:YES];
    [super viewDidLoad];
}
...
//******************************************************************************
//    タッチ処理
//******************************************************************************
//**************************************
//    Work
//**************************************
unsigned int    countBackup;
unsigned int    onTap;
unsigned int    noTap    = 10000;
//**************************************
//    touchesBegan
//**************************************
- ( void )touchesBegan:( NSSet* )touches withEvent:( UIEvent* )event
{
    unsigned int    between;
    int                tap;
    UITouch            *touch        = [touches anyObject];

    between        = tmerCount - countBackup;
    countBackup    = tmerCount;
    tap            = [touch tapCount];

    if( tap > 1 )
    {// 連続タップ
        if( onTap < between )
            onTap    = between;
    } else
    {// 非連続タップ
        if( noTap > between )
            noTap    = between;
    }

    char            string[512];
    sprintf( string, "taps:%2d\nget sec:%4d\non sec:%4d\nno sec:%4d", tap, between, onTap, noTap );
    [infoTextView setText:[NSString stringWithUTF8String:string] ];
}

//******************************************************************************
//    End
//******************************************************************************

で試しに動かしてみた…。

※シミュレータでの動作だけどね…。

でこんな感じになった。

20100211001

あれ?

0.6秒を連続タップと認識するのか?

でも0.4秒をシングルタップって認識する?

もしかしてタップインターバルが変動している?

連続タップした時の間から次のタップインターバルを
算出しているのならインターバルの定数が無いのもうなずける。

早く連続タップすると次のシングルタップ判定の
インターバルが0.5を切るみたいだし…。

本当にそう言う処理をしているか謎だけどね。

単に精度が悪いって事もあるけどね…。

実記じゃなくシミュレータってのも多分に影響しているだろうし。

でも個人差をこう言う形で吸収しているのなら凄いかも…。

音楽ゲームやタイミングゲームでタップを主体にした
ものは、誤作動するかもしれないのでこの方式は取らない方が無難そうだ。

でもタップインターバルは、0.5秒辺りに収束するっぽいので
0.5秒で良いんじゃない?

で、結論は…

0.5秒って事にしよう♪

てす…。

PS.

試しにタップ回数ごとの時間を取ってみた。

20100211002

他にソースをこんな感じに直して
ダブルタップ限定で時間を取得してみた。

    if( tap == 2 )
    {// 連続タップ
        if( onTap < between )
            onTap    = between;
    } else
    if( tap == 1 )
    {// 非連続タップ
        if( noTap > between )
            noTap    = between;
    }

20100211003

まあ、0.5秒ぐらいが適当かと思う。

まあ、処理を間違えてないければ…

だけどね…。(汗)

サンプルは、こちら。

「TapTest.zip」をダウンロード

|

« タップ数でダイレクトにセレクトしたい… | トップページ | 『Zippoカイロ』って一回幾ら? »

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/108365/47551500

この記事へのトラックバック一覧です: タップのインターバルってどのぐらい?:

« タップ数でダイレクトにセレクトしたい… | トップページ | 『Zippoカイロ』って一回幾ら? »