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

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

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

Cocos2d-x 处理双击事件的两种方法的更多相关文章

  1. 在Activity中响应ListView内部按钮的点击事件的两种方法!!!

    在Activity中响应ListView内部按钮的点击事件的两种方法 转载:http://www.cnblogs.com/ivan-xu/p/4124967.html 最近交流群里面有人问到一个问题: ...

  2. Android实现双击事件的两种方式

    Work around的方法是先监听onTouch事件来监听连续点击次数,每次点击都布置一个间隔时间的延时任务,延时任务执行时判断间隔内是否还有点击,如果没有则发布点击次数,重置计数. 实现代码如下: ...

  3. 一、winForm-DataGridView操作——控件绑定事件的两种方法

    在winForm窗体中绑定(注册)事件的方法有两种: 一.绑定事件 双击控件,即进入.cs的代码编辑页面,会出现 类似于“ private void 控件名称_Click(object sender, ...

  4. 在Activity中响应ListView内部按钮的点击事件的两种方法

    转载:http://www.cnblogs.com/ivan-xu/p/4124967.html 最近交流群里面有人问到一个问题:如何在Activity中响应ListView内部按钮的点击事件,不要在 ...

  5. C#Winform ListView中没有Item双击事件的两种实现方法!

    第一种: //if (this.listView1.FocusedItem != null) //{ // if (this.listView1.SelectedItems != null) // { ...

  6. Cocos Creator 为Button添加事件的两种方法

    Button添加事件 Button 目前只支持 Click 事件,即当用户点击并释放 Button 时才会触发相应的回调函数.通过脚本代码添加回调方法一这种方法添加的事件回调和使用编辑器添加的事件回调 ...

  7. vue中触发键盘事件的两种方法和如何自定义键位事件,完整代码!

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. Cocos Creator EditBox(编辑框/输入框)添加事件的两种方法

    EditBox添加事件方法一这种方法添加的事件回调和使用编辑器添加的事件回调是一样的,通过代码添加, 你需要首先构造一个 cc.Component.EventHandler 对象,然后设置好对应的 t ...

  9. Cocos Creator scrollview添加事件的两种方法

    scrollview添加事件 方法一这种方法添加的事件回调和使用编辑器添加的事件回调是一样的,通过代码添加, 你需要首先构造一个 cc.Component.EventHandler 对象,然后设置好对 ...

随机推荐

  1. 2017广东工业大学程序设计竞赛决赛--Problem B: 占点游戏

    Description 众所周知的是,TMK特别容易迟到,终于在TMK某次又迟到了之后,Maple怒了,Maple大喊一声:"我要跟你决一死战!"然后Maple就跟TMK玩起了一个 ...

  2. 埃及分数 a* 搜索 知识点mark

    题意 在古埃及,人们使用单位分数的和(即1/a,a是自然数)表示一切有理 数. 例如,2/3=1/2+1/6,但不允许2/3=1/3+1/3,因为在加数中不允许有相同的. 对于一个分数a/b,表示方法 ...

  3. [Codeforces 1060F] Shrinking Tree

    Link: 传送门 Solution: 原来CF的官方题解也能鸽啊…… 详细题解 该题思路: 1.对于每个点删边方案数为$fac[n-1]$,总贡献为每种方案下满足的概率的和,接下来直接求贡献 2.每 ...

  4. ACM -- 算法小结(一)利用数组存放实现排序

    利用数组存放实现排序    hodj1425   321MS   2011/08 题意:输入n个数字,要求输出从大到小排序的前m个数 解题技巧:利用大数存储在数组后面,小数存储在前面,倒序输出完成从大 ...

  5. python开发_python日期操作

    在python中对日期进行操作的库有: import datetime import time 对日期格式化信息,可以参考官方API: time.strftime datetime 下面是我做的dem ...

  6. PAT甲级1018. Public Bike Management

    PAT甲级1018. Public Bike Management 题意: 杭州市有公共自行车服务,为世界各地的游客提供了极大的便利.人们可以在任何一个车站租一辆自行车,并将其送回城市的任何其他车站. ...

  7. ASP.NET中在一般处理程序中使用session的简单介绍

    这篇文章介绍了ASP.NET中在一般处理程序中使用session,有需要的朋友可以参考一下 <%@ WebHandler Language="C#" Class=" ...

  8. jsonp和jsonpcallback的使用

    1. jsonp.jsonpCallback  jsonp跨域时可以自定义的两个参数 2. jsonp: 回掉函数名的参数名,默认callback,服务端通过它来获取到回掉函数名 3. jsonpCa ...

  9. IntelliJ IDEA导出设置

    导出: [File]->[Export Settings] 导入: [File]->[Import Settings]

  10. JAVA-数据类型、变量、常量

    http://blog.csdn.net/yuhailong626/article/details/7245571 http://www.cnblogs.com/JackieADBM/p/534222 ...