1. 屏幕触摸事件
EventListenerTouchOneByOne :单点触控
- std::function<bool(Touch*, Event*)> onTouchBegan; //触摸开始事件
- std::function<void(Touch*, Event*)> onTouchMoved; //触摸移动事件
- std::function<void(Touch*, Event*)> onTouchEnded; //触摸结束事件
- std::function<void(Touch*, Event*)> onTouchCancelled; //触摸中断事件
- std::function<void(const std::vector<Touch*>&, Event*)> onTouchesBegan; //触摸开始事件
- std::function<void(const std::vector<Touch*>&, Event*)> onTouchesMoved; //触摸移动事件
- std::function<void(const std::vector<Touch*>&, Event*)> onTouchesEnded; //触摸结束事件
- std::function<void(const std::vector<Touch*>&, Event*)> onTouchesCancelled; //触摸中断事件
- bool TouchTest::init()
- {
- if ( !Layer::init() )
- {
- return false;
- }
- //允许接收触摸事件
- this->setTouchEnabled(true);
- EventDispatcher* eventDispatcher = Director::getInstance()->getEventDispatcher();
- auto listen = EventListenerTouchAllAtOnce::create();
- listen->onTouchesBegan = CC_CALLBACK_2(TouchTest::onTouchesBegan,this);
- listen->onTouchesMoved = CC_CALLBACK_2(TouchTest::onTouchesMoved,this);
- listen->onTouchesEnded = CC_CALLBACK_2(TouchTest::onTouchesEnded,this);
- listen->onTouchesCancelled = CC_CALLBACK_2(TouchTest::onTouchesCancelled,this);
- eventDispatcher->addEventListenerWithSceneGraphPriority(listen,this);
- return true;
- }
- //触摸事件开始,手指按下时
- void TouchTest::onTouchesBegan(const std::vector<Touch*>& touches, cocos2d::Event *event)
- {
- for(auto &item : touches)
- {
- auto touch = item;
- auto pos1 = touch->getLocation();
- auto pos2 = touch->getLocationInView();
- auto pos3 = Director::getInstance()->convertToUI(pos2);
- log("pos1 x: %f, y: %f",pos1.x,pos1.y);
- log("pos2 x: %f, y: %f",pos2.x,pos2.y);
- log("pos2 x: %f, y: %f",pos3.x,pos3.y);
- }
- }
- //触摸移动事件,也就是手指在屏幕滑动的过程
- void TouchTest::onTouchesMoved(const std::vector<Touch*>& touches, cocos2d::Event *event)
- {
- log("TouchTest onTouchesMoved");
- }
- //触摸事件结束,也就是手指松开时
- void TouchTest::onTouchesEnded(const std::vector<Touch*>& touches, cocos2d::Event *event)
- {
- log("TouchTest onTouchesEnded");
- }
- //打断触摸事件,一般是系统层级的消息,如来电话,触摸事件就会被打断
- void TouchTest::onTouchesCancelled(const std::vector<Touch*>& touches, cocos2d::Event *event)
- {
- log("TouchTest onTouchesCancelled");
- }
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);
单点触控触摸监听代码:
- this->setTouchMode(Touch::DispatchMode::ONE_BY_ONE);
- auto oneTouch = EventListenerTouchOneByOne::create();
- oneTouch->onTouchBegan = CC_CALLBACK_2(TouchTest::onTouchBegan,this);
- oneTouch->onTouchMoved = CC_CALLBACK_2(TouchTest::onTouchMoved,this);
- oneTouch->onTouchEnded = CC_CALLBACK_2(TouchTest::onTouchEnded,this);
- oneTouch->onTouchCancelled = CC_CALLBACK_2(TouchTest::onTouchCancelled,this);
- eventDispatcher->addEventListenerWithSceneGraphPriority(oneTouch,this);
多点触控的触摸监听代码:
- //设置多点触控
- this->setTouchMode(Touch::DispatchMode::ALL_AT_ONCE);
- auto listen = EventListenerTouchAllAtOnce::create();
- listen->onTouchesBegan = CC_CALLBACK_2(TouchTest::onTouchesBegan,this);
- listen->onTouchesMoved = CC_CALLBACK_2(TouchTest::onTouchesMoved,this);
- listen->onTouchesEnded = CC_CALLBACK_2(TouchTest::onTouchesEnded,this);
- listen->onTouchesCancelled = CC_CALLBACK_2(TouchTest::onTouchesCancelled,this);
- eventDispatcher->addEventListenerWithSceneGraphPriority(listen,this);
3. 屏蔽触摸向下传递
listen->setSwallowTouches(true);
setSwallowTouches用于设置是否吞没事件,也就是当某个触摸事件回调的时,截断该事件,让它不能继续传递给其他人。