cocos2dx游戏开发之利用多点触摸(实现缩放功能或者简单的手势识别)

其实cocos2d-x的多点触摸事件可以实现很多功能:譬如缩放 和简单的手势识别

在windows7 或者在OS X平台中暂时还不支持多点触控 请将项目部署到windows8,ios,或者安卓平台中

 既然用到多点触控 不管什么功能 肯定要在初始化函数中 设置SetTouchEnable(true)  之后便是重载registerWithTouchDispatcher等五个函数



实现缩放功能:

[cpp]  view plain copy
  1. void HelloWorld::registerWithTouchDispatcher(void)  
  2. {  
  3.     CCDirector::sharedDirector()->getTouchDispatcher()->addStandardDelegate(this, 0);  
  4. }  
  5.   
  6. void HelloWorld::ccTouchesBegan(CCSet *pTouches, CCEvent *pEvent)  
  7. {  
  8.     if(pTouches->count() >= 2){  
  9.        CCSetIterator iter = pTouches->begin();  
  10.        CCPoint mPoint1 = ((CCTouch*)(*iter))->locationInView();  
  11.        mPoint1 = CCDirector::sharedDirector()->convertToGL(mPoint1);  
  12.        iter ++;  
  13.        CCPoint mPoint2 = ((CCTouch*)(*iter))->locationInView();  
  14.        mPoint2 = CCDirector::sharedDirector()->convertToGL(mPoint2);  
  15.           
  16.        distance = sqrt((mPoint1.x - mPoint2.x) * (mPoint1.x - mPoint2.x) + (mPoint1.y - mPoint2.y) * (mPoint1.y - mPoint2.y));   
  17.   
  18.        deltax = (mPoint1.x + mPoint2.x)/2 - pSprite->getPositionX();  
  19.        deltay = (mPoint1.y + mPoint2.y)/2 - pSprite->getPositionY();  
  20.     }  
  21. }  
  22. void HelloWorld::ccTouchesMoved(CCSet *pTouches, CCEvent *pEvent)  
  23. {  
  24.     if(pTouches->count() >= 2){   
  25.         CCSetIterator iter = pTouches->begin();  
  26.         CCPoint mPoint1 = ((CCTouch*)(*iter))->locationInView();  
  27.         mPoint1 = CCDirector::sharedDirector()->convertToGL(mPoint1);  
  28.         iter ++;  
  29.         CCPoint mPoint2 = ((CCTouch*)(*iter))->locationInView();  
  30.         mPoint2 = CCDirector::sharedDirector()->convertToGL(mPoint2);  
  31.           
  32.         float mdistance = sqrt((mPoint1.x - mPoint2.x) * (mPoint1.x - mPoint2.x) + (mPoint1.y - mPoint2.y) * (mPoint1.y - mPoint2.y));   
  33.           
  34.         mscale = mdistance / distance * mscale;  
  35.           
  36.         distance = mdistance;  
  37.           
  38.         pSprite->setScale(mscale);  
  39.           
  40.         float x = (mPoint1.x + mPoint2.x)/2 - deltax;  
  41.         float y = (mPoint1.y + mPoint2.y)/2 - deltax;  
  42.         pSprite->setPosition(ccp(x,y));  
  43.         deltax = (mPoint1.x + mPoint2.x)/2 - pSprite->getPositionX();  
  44.         deltay = (mPoint1.y + mPoint2.y)/2 - pSprite->getPositionY();      
  45.     }  
  46. }  
  47. void HelloWorld::ccTouchesEnded(CCSet *pTouches, CCEvent *pEvent)  
  48. {  
  49. }  
  50. void HelloWorld::ccTouchesCancelled(CCSet *pTouches, CCEvent *pEvent)  
  51. {  
  52. }  
[cpp]  view plain copy
  1.   
Summayr:实现缩放的逻辑 就是再触摸函数中 判断是是否是大于两个 如果是取前面两个 计算出两点之间的距离  再在触摸移动函数中 继续监测触摸点是否大于两个 如果是计算再计算出两个点之间的距离 然后得到缩放比例 然后调用setScale设置缩放比例

ps:在苹果电脑中的iphone模拟器中可以使用Option键加鼠标模拟两点触摸来测试


游戏识别简单的手势:

现在移动终端很多只含有一个触摸屏 这就意味缺少必要的按键帮助用户简便的操作 这时候就需要游戏识别简单的手势  比如:在屏幕中有三个或者四个手指在屏幕上滑动就会更改一些界面或者节点的属性 其实就是上面缩放功能的一个发散 同样是在触摸开始函数中setTouchEnable(true)  然后重载registerWithTouchDispatcher五个函数  只是在触摸函数中 判断的不再是两个触摸点 而是三个或者四个触摸点 然后在触摸移动函数中改变某些节点属性

实际实现这个功能的时候 需要在触摸开始函数中和触摸移动的函数中 判断这三个或者四个的触摸点之间的距离 还有这三个或者四个触摸点是否移动的方向大概是否是平行的等细节 其实我们可以抽象出一个单点触摸管道 反应一个触摸点的运动轨迹 这样不管是三个还是四个触摸点 只要检测数量和触摸轨迹是否相似就可以

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值