cocos2dx3.0触摸机制

1. 屏幕触摸事件

EventListenerTouchOneByOne :单点触控

[html]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. std::function<bool(Touch*, Event*)> onTouchBegan; //触摸开始事件  
  2. std::function<void(Touch*, Event*)> onTouchMoved; //触摸移动事件  
  3. std::function<void(Touch*, Event*)> onTouchEnded; //触摸结束事件  
  4. std::function<void(Touch*, Event*)> onTouchCancelled; //触摸中断事件  
 EventListenerTouchAllAtOnce:多点触控

[html]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. std::function<void(const std::vector<Touch*>&, Event*)> onTouchesBegan; //触摸开始事件  
  2. std::function<void(const std::vector<Touch*>&, Event*)> onTouchesMoved; //触摸移动事件  
  3. std::function<void(const std::vector<Touch*>&, Event*)> onTouchesEnded; //触摸结束事件  
  4. std::function<void(const std::vector<Touch*>&, Event*)> onTouchesCancelled; //触摸中断事件  

[html]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. bool TouchTest::init()  
  2. {  
  3.     if ( !Layer::init() )  
  4.     {  
  5.         return false;  
  6.     }  
  7.     //允许接收触摸事件  
  8.     this->setTouchEnabled(true);  
  9.   
  10.     EventDispatcher* eventDispatcher = Director::getInstance()->getEventDispatcher();  
  11.   
  12.     auto listen = EventListenerTouchAllAtOnce::create();  
  13.     listen->onTouchesBegan = CC_CALLBACK_2(TouchTest::onTouchesBegan,this);  
  14.     listen->onTouchesMoved = CC_CALLBACK_2(TouchTest::onTouchesMoved,this);  
  15.     listen->onTouchesEnded = CC_CALLBACK_2(TouchTest::onTouchesEnded,this);  
  16.     listen->onTouchesCancelled = CC_CALLBACK_2(TouchTest::onTouchesCancelled,this);  
  17.     eventDispatcher->addEventListenerWithSceneGraphPriority(listen,this);  
  18.   
  19.     return true;  
  20. }  
  21.               
  22. //触摸事件开始,手指按下时  
  23. void TouchTest::onTouchesBegan(const std::vector<Touch*>& touches, cocos2d::Event  *event)  
  24. {  
  25.     for(auto &item : touches)  
  26.     {  
  27.         auto touch = item;  
  28.         auto pos1 = touch->getLocation();  
  29.         auto pos2 = touch->getLocationInView();  
  30.         auto pos3 = Director::getInstance()->convertToUI(pos2);  
  31.   
  32.         log("pos1 x: %f, y: %f",pos1.x,pos1.y);  
  33.         log("pos2 x: %f, y: %f",pos2.x,pos2.y);  
  34.         log("pos2 x: %f, y: %f",pos3.x,pos3.y);  
  35.     }  
  36. }  
  37. //触摸移动事件,也就是手指在屏幕滑动的过程  
  38. void TouchTest::onTouchesMoved(const std::vector<Touch*>& touches, cocos2d::Event  *event)  
  39. {  
  40.     log("TouchTest onTouchesMoved");  
  41. }  
  42. //触摸事件结束,也就是手指松开时  
  43. void TouchTest::onTouchesEnded(const std::vector<Touch*>& touches, cocos2d::Event  *event)  
  44. {  
  45.     log("TouchTest onTouchesEnded");  
  46. }  
  47. //打断触摸事件,一般是系统层级的消息,如来电话,触摸事件就会被打断  
  48. void TouchTest::onTouchesCancelled(const std::vector<Touch*>& touches, cocos2d::Event  *event)  
  49. {  
  50.     log("TouchTest onTouchesCancelled");  
  51. }  

setTouchEnabled(); //设置是否允许接收触摸事件

获取单击屏幕时的坐标方式:

(1)touch->getLocation(); 获得单击坐标,基于3D

(2)touch->getLocationInView(); 获取单击坐标,是屏幕坐标系的坐标

(3)Director::getInstance()->convertToUI(pos2); //将屏幕坐标系的坐标,转为cocos2dx的坐标

坐标系:cocos2d-x是基于openGLES的,所以遵循openGL的坐标系,也就是说是以屏幕的左下角为坐标原点。屏幕坐标系一般是以左下角为坐标原点。


2. 修改触控方式

//设置多点触控

this->setTouchMode(Touch::DispatchMode::ALL_AT_ONCE);

//设置单点触控

//this->setTouchMode(Touch::DispatchMode::ONE_BY_ONE);

单点触控触摸监听代码:

[html]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. this->setTouchMode(Touch::DispatchMode::ONE_BY_ONE);  
  2. auto oneTouch = EventListenerTouchOneByOne::create();  
  3. oneTouch->onTouchBegan = CC_CALLBACK_2(TouchTest::onTouchBegan,this);  
  4. oneTouch->onTouchMoved = CC_CALLBACK_2(TouchTest::onTouchMoved,this);  
  5. oneTouch->onTouchEnded = CC_CALLBACK_2(TouchTest::onTouchEnded,this);  
  6. oneTouch->onTouchCancelled = CC_CALLBACK_2(TouchTest::onTouchCancelled,this);  
  7. eventDispatcher->addEventListenerWithSceneGraphPriority(oneTouch,this);  

多点触控的触摸监听代码:

[html]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. //设置多点触控  
  2. this->setTouchMode(Touch::DispatchMode::ALL_AT_ONCE);  
  3. auto listen = EventListenerTouchAllAtOnce::create();  
  4. listen->onTouchesBegan = CC_CALLBACK_2(TouchTest::onTouchesBegan,this);  
  5. listen->onTouchesMoved = CC_CALLBACK_2(TouchTest::onTouchesMoved,this);  
  6. listen->onTouchesEnded = CC_CALLBACK_2(TouchTest::onTouchesEnded,this);  
  7. listen->onTouchesCancelled = CC_CALLBACK_2(TouchTest::onTouchesCancelled,this);  
  8. eventDispatcher->addEventListenerWithSceneGraphPriority(listen,this);  


3. 屏蔽触摸向下传递

listen->setSwallowTouches(true);

setSwallowTouches用于设置是否吞没事件,也就是当某个触摸事件回调的时,截断该事件,让它不能继续传递给其他人。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值