博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Cocos2d-x 处理双击事件的两种方法
阅读量:4839 次
发布时间:2019-06-11

本文共 2089 字,大约阅读时间需要 6 分钟。

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

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

(一)方法一

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

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

 

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

 

 

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

 

long preTime;    long nextTime;    bool isClickTwo;

初始化为:

 

 

preTime = 0.0f;    nextTime = 0.0f;    isClickTwo  = false;

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

 

 

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。

 

 

bool clicked;

初始化为:

 

 

clicked = false;

处理的代码如下:

 

 

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");    }}

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

 

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

 

 

转载于:https://www.cnblogs.com/james1207/p/3258353.html

你可能感兴趣的文章
iOS10 App适配权限 Push Notifications 字体Frame 遇到的坑!!!!
查看>>
一语道破项目管理知识体系五大过程组
查看>>
Mac连接远程Linux管理文件(samba)
查看>>
WPF变换详解
查看>>
flash player 请求本地存储为无限制
查看>>
程序逻辑的组织方式
查看>>
今天正式开通博客
查看>>
javascript逗号添加函数
查看>>
Codeforces Round #307 (Div. 2) E. GukiZ and GukiZiana 分块
查看>>
hdu 5452 Minimum Cut 树形dp
查看>>
perf4j @Profiled常用写法
查看>>
配置的热更新
查看>>
ios view的frame和bounds之区别(位置和大小)
查看>>
USB小白学习之路(11) Cy7c68013A驱动电路设计注意事项(转)
查看>>
Luogu 2530 化工厂装箱员
查看>>
自定义webUI实例
查看>>
用NSAttributedString实现简单的图文混排
查看>>
多语境的操作
查看>>
SNS营销——网商成功之道
查看>>
jqgrid 加载时第一页面只显示多少条数据
查看>>