cocos2dx 3.x 屏幕触摸事件的认识

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; //触摸中断事件
 EventListenerTouchAllAtOnce:多点触控

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值