cocos2dx学习之自定义你的CCSprite(二)监测长按和双击

cocos2dx学习之自定义你的CCSprite(二)监测长按和双击,第1张

概述http://www.xuebuyuan.com/358129.html   上一篇我们介绍了如何给你自定义的CCSprite添加Touch监听,但是你会发现无论你点击屏幕的哪里,我们的精灵都会收到Touch事件,为什么会这样呢,主要是CCTouchDispatcher只是实现触摸事件分发,所以每一个添加到CCTouchDispatcher上的CCTouchDelegate,都是一层,屏幕大小,这 http://www.xuebuyuan.com/358129.HTML

  上一篇我们介绍了如何给你自定义的CCSprite添加touch监听,但是你会发现无论你点击屏幕的哪里,我们的精灵都会收到touch事件,为什么会这样呢,主要是CCtouchdispatcher只是实现触摸事件分发,所以每一个添加到CCtouchdispatcher上的CCtouchDelegate,都是一层,屏幕大小,这也是为什么有时候我们点击到层的外面也能接受到touch监听的原因。不管怎么说,这是我们不想看到的。其实这里cocos2dx的源代码中已经给出了解决办法,那就是Ccmenu,看看它的源代码你会发现它是做了判断touch区域的 *** 作。我们这里也这么做。代码如下

  

boolTestSprite::isInsprite(CCtouch*thetouch){

// 返回当前触摸位置在OpenGL坐标

CCPointtouchPoint=thetouch->getLocation();

// 将世界坐标转换为当前父VIEw的本地坐标系

CCPointreallyPoint=this->getParent()->convertToNodeSpace(touchPoint);

// 获取当前基于父vIEw的坐标系

CCRectrect=this->boundingBox();

// CCnode->convertToNodeSpace或者 convertToWorldspace是基于当前Node与当前Node相关

if(rect.containsPoint(reallyPoint)){

returntrue;

}

returnfalse;

}

这样子我们就能知道我们点击是不是我们的精灵了。下面我们来判断双击。代码如下

// 获取当前时间 精确到毫秒数

staticinlinelongmillisecondNow()

{

structcc_timevalNow;

CCTime::gettimeofdayCocos2d(&Now,NulL);

return(Now.tv_sec* 1000 + Now.tv_usec/ 1000);

}

//判断是不是双击

staticinlineboolisDoubletouch(){

staticlonglasttouchTime=0;

longthistouchTime=millisecondNow();

if(abs(thistouchTime-lasttouchTime)<250){

lasttouchTime=0;

returntrue;

}

else{

lasttouchTime=millisecondNow();

returnfalse;

}

}

就是简单的做一下两次点击的时间间隔,如果小于250毫米,就算做双击。单机我们给解决了,那么现在就是长按了,长安其实也是很简单就是,如果你touch的时间长于两秒,那么我们算做它长按。或不多说,上代码

voIDTestSprite::checkLongPress(){

this->unschedule(schedule_selector(TestSprite::checkLongPress));

if(isIntouch&&!isInMove) {

cclog("LONGLONG");

this->setScale(2);

this->setopacity(200);

afterLongPress=true;

}

}

boolTestSprite::cctouchBegan(CCtouch*ptouch,CCEvent*pEvent){

if(this->isInsprite(ptouch)) {

  isIntouch=true;

if(isDoubletouch()) {

this->doubleClickSprite();

this->touchBeginTime=millisecondNow();

}else{

this->singleClickSprite();

this->touchBeginTime=millisecondNow();

this->schedule(schedule_selector(TestSprite::checkLongPress),2);

}

returntrue;

}

returnfalse;

}

voIDTestSprite::cctouchmoved(CCtouch*ptouch,CCEvent*pEvent) {

CCPointdeltaPoint=ptouch->getDelta();

cclog("x=%f,y=%f",deltaPoint.x,deltaPoint.y);

if(fabs(deltaPoint.x)>1||fabs(deltaPoint.y)>1){

isInMove=true;

}

}

voIDTestSprite::cctouchended(CCtouch*ptouch,CCEvent*pEvent) {

isIntouch=false;

isInMove=false;

afterLongPress=false;

// 恢复精灵

this->setScale(1);

this->setposition(orignalPoint);

this->setopacity(255);

}

voIDTestSprite::cctouchCancelled(CCtouch*ptouch,CCEvent*pEvent){

isIntouch=false;

isInMove=false;

afterLongPress=false;

// 恢复精灵

this->setScale(1);

this->setposition(orignalPoint);

this->setopacity(255);

}

当然我们这里也是做了一个简单的判断,如果touch了一直没有move超过两秒我们才算做长按的。

总结

以上是内存溢出为你收集整理的cocos2dx学习之自定义你的CCSprite(二)监测长按和双击全部内容,希望文章能够帮你解决cocos2dx学习之自定义你的CCSprite(二)监测长按和双击所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1023675.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-23
下一篇 2022-05-23

发表评论

登录后才能评论

评论列表(0条)

保存