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

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

注:本文引于此也是为了学员分析我的拇指接龙游戏源码所参考的。另外,我的游戏中正是使用了与下面基本一致的第二种方法。

FROM:http://blog.csdn.net/crayondeng/article/details/9961745


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

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

(一)方法一

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

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

[cpp]

  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类型的变量记录是否是双击。

[cpp]

  1. long preTime;  

  2.     long nextTime;  

  3.     bool isClickTwo;  

初始化为:

[cpp]

  1. preTime = 0.0f;  

  2.    nextTime = 0.0f;  

  3.    isClickTwo  = false;  

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

[cpp]

  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。

[cpp]

  1. bool clicked;  

初始化为:

[cpp]

  1. clicked = false;  

处理的代码如下:

[cpp]

  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. }  

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

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

你可能感兴趣的文章
从零开始实现一个简易的Java MVC框架
查看>>
【java解惑】Unicode转义符的使用
查看>>
spring线程池ThreadPoolTaskExecutor与阻塞队列BlockingQueue
查看>>
服务器同步
查看>>
visio图片导入word和PPT的最清晰的方式
查看>>
DataGuard 环境rman恢复主库坏块一例
查看>>
邮件服务器最常见的安全问题及解决办法
查看>>
交换机真的只工作在第二层吗?
查看>>
走向DBA[MSSQL篇] 针对大表 设计高效的存储过程【原理篇】 附最差性能sql语句进化过程客串...
查看>>
Python条件判断和循环
查看>>
15年编程生涯,资深架构师总结的7条经验
查看>>
第三节课作业
查看>>
最长回文子串问题
查看>>
ssh客户端及基于key登陆
查看>>
echo命令
查看>>
图形语言 Kgo
查看>>
兄弟连第10节课
查看>>
调整Virtual Box硬盘大小
查看>>
case 格式
查看>>
Windows下Apache服务器中自动配置二级子域名
查看>>