zoukankan      html  css  js  c++  java
  • Cocos2d-x 处理双击事件的两种方法

    在cocos2d-x的开发过程中有些时候也是需要用到双击的事件处理,那么由于在cocos2d-x中没有实现对双击的事件的处理,那么我们就需要自己用代码实现。

    下面介绍两种方式实现双击事件的处理。

     

    (一)方法一

    第一种方法就是利用两次touch之间的时间间隔来判定是单击或者是双击,一般来说,双击,两次touch之间的时间间隔为250ms~300ms(毫秒)。所以利用这个条件就可以对双击进行判断处理了。

    注意到由于要获取两次touch之间的touch时间,而且是以毫秒为单位,所以需要用到下面这个方法:

    1 //获取系统的毫秒时间
    2 long millisecondNow()
    3 {
    4     struct cc_timeval now;
    5     CCTime::gettimeofdayCocos2d(&now, NULL);
    6     return (now.tv_sec * 1000 + now.tv_usec / 1000);
    7 }

    由于要获取两次touch的时间,所以要定义两个long类型的变量用于记录时间;而且定义了一个bool类型的变量记录是否是双击。

    1 long preTime;
    2     long nextTime;
    3     bool isClickTwo;

    初始化为:

    1  preTime = 0.0f;
    2     nextTime = 0.0f;
    3     isClickTwo  = false;

    接着就是要在 ccTouchesBegan(CCSet* touches,CCEvent* event) 这个方法中(注意要在began这个方法中进行,而非ended这个方法中)进行单击和双击的判断处理了。代码如下:

     1 void HelloWorld::ccTouchesBegan(CCSet* touches, CCEvent* event)
     2 {
     3     isClickTwo = false;
     4     nextTime = millisecondNow();
     5     
     6     if ((nextTime - preTime < 300) && (nextTime - preTime > 50)) {
     7         CCLog("double click");
     8         isClickTwo = true;
     9     }
    10     //在回调方法中处理单击事件
    11     scheduleOnce(schedule_selector(HelloWorld::ff), 0.25f);
    12     preTime = millisecondNow();
    13 }
    14 
    15 void HelloWorld::ff(float tt)
    16 {
    17     if (! isClickTwo) {
    18         CCLog("single click");
    19     }
    20 }

    这样,你单击和双击屏幕的时候就会在终端输出是单击还是双击了。

     

     

    (二)方法二

    下面这种方法较第一种方法而言,比较简洁,其并不是采用直接比较双击中两次touch的时间间隔,而是比较巧妙的解决这个问题。解决的思路是这样的,我们知道双击的时间间隔是0.25ms,所以设置了一个延时为0.25ms的schedule,如果在这0.25ms中又touch,那么表示的是双击,否则表示的是单击。具体的实现过程看代码实现,应该是可以理解的。

    这种方法只需要使用到一个bool变量表征是否touch。

    1 bool clicked;
    2 
    3 //初始化为:
    4 clicked = false; 

    处理的代码如下:

     1 void  HelloWorld::ccTouchesBegan(CCSet* touches, CCEvent* event)
     2 {
     3     if (clicked) {
     4         clicked = false;
     5         CCLog("double click");
     6     }
     7     else
     8     {
     9         //延时0.25s执行(注意在这0.25s的延时过程中clicked已经为true),
    10         //如果在这个过程中再次click,那么就执行上面的双击事件处理了
    11         //否则,那么就执行下面的回调函数了,处理单击事件
    12         scheduleOnce(schedule_selector(HelloWorld::ff), 0.25f);
    13         clicked = true;
    14     }
    15 }
    16 
    17 //在回调函数中处理单击事件
    18 void HelloWorld::ff(float tt)
    19 {
    20     if (clicked) {
    21         clicked = false;
    22         CCLog("single click");
    23     }
    24 }

    同样还是在终端中输出是单击还是双击的信息。

     

    通过比较二者实现的方法可以看到,其实二者的实现过程还是有点类似的,只不过判断单击,双击的具体实现过程有点差异,在实际使用过程中建议是使用第二种方法,比较简洁。

  • 相关阅读:
    python json 和 pickle的补充 hashlib configparser logging
    go 流程语句 if goto for swich
    go array slice map make new操作
    go 基础
    块级元素 行内元素 空元素
    咽炎就医用药(慢性肥厚性咽炎)
    春季感冒是风寒还是风热(转的文章)
    秋季感冒 咳嗽 怎么选药
    解决IE浏览器“无法显示此网页”的问题
    常用的 css 样式 记录
  • 原文地址:https://www.cnblogs.com/atong/p/3310038.html
Copyright © 2011-2022 走看看