• cocos2d-x 2.2 study ------------------------ 双击事件(转)


    Cocos2d-x处理双击事件的两种方法!

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

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

    (一)方法一

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

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

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

     

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

    1
    2
    3
    long preTime;
    long nextTime;
    bool isClickTwo;</font></font>
    初始化为:
    1
    2
    3
    preTime = 0.0f;
    nextTime = 0.0f;
    isClickTwo  = false;
    接着就是要在  ccTouchesBegan( CCSet * touches, CCEvent * event) 这个方法中(注意要在began这个方法中进行,而非ended这个方法中)进行单击和双击的判断处理了。代码如下:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    void HelloWorld::ccTouchesBegan(CCSet* touches, CCEvent* event)
    {
        isClickTwo = false;
        nextTime = millisecondNow();
          
        if ((nextTime - preTime < 300) && (nextTime - preTime > 50)) {
            CCLog("double click");
            isClickTwo = true;
        }
        //在回调方法中处理单击事件
        scheduleOnce(schedule_selector(HelloWorld::ff), 0.25f);
        preTime = millisecondNow();
    }
      
    void HelloWorld::ff(float tt)
    {
        if (! isClickTwo) {
            CCLog("single click");
        }
    }
    这样,你单击和双击屏幕的时候就会在终端输出是单击还是双击了。

    (二)方法二

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

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

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

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

    转自:http://cocos2d.9tech.cn/news/2014/0324/40088.html

  • 相关阅读:
    找出字符串中最长的对称字符串
    spark 数据倾斜的一些表现
    executor.Executor: Managed memory leak detected; size = 37247642 bytes, TID = 5
    机器学习复习笔记
    博客园如何在侧边添加目录
    markdown画图
    用hexo搭建博客
    苏州大学2005-2019复试上机真题及保研期中期末习题
    考研复试面试:计算机网络面试题整理
    python进行日期计算
  • 原文地址:https://www.cnblogs.com/dudu580231/p/4972349.html
Copyright © 2020-2023  润新知