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
;
|
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