Cocos2dx-3.x触摸事件之实现人机交互(一)

        /**************************单点触摸——重写虚函数方法*******************************/
	// 创建一个事件监听器类型为 OneByOne 的单点触摸
	auto listener = EventListenerTouchOneByOne::create();

	// 设置是否吞没事件,在 onTouchBegan 方法返回 true 时吞没
	listener->setSwallowTouches(true);

	// 触摸开始时,用调用函数的方式
	listener->onTouchBegan = CC_CALLBACK_2(TouchExa::onTouchBegan, this); // 触摸开始
	listener->onTouchMoved = CC_CALLBACK_2(TouchExa::onTouchMoved, this); // 触摸移动
	listener->onTouchEnded = CC_CALLBACK_2(TouchExa::onTouchEnded, this); // 触摸结束
	listener->onTouchCancelled = CC_CALLBACK_2(TouchExa::onTouchCancelled, this); // 触摸中断

	// 用事件分发器给对象添加监听器,this表示本场景
	_eventDispatcher->addEventListenerWithSceneGraphPriority(listener, sprite1);

	// 监听器克隆
	_eventDispatcher->addEventListenerWithSceneGraphPriority(listener->clone(), sprite2);
	/****************************************************************************************/
方法实现如下
/**************************单点触摸——重写虚函数方法*******************************/
bool onTouchBegan(Touch* touch, Event* event){
	// 获取当前监听事件所绑定的 target 
	auto target = static_cast<Sprite*>(event->getCurrentTarget());

	// 获取当前点击点所在相对按钮的位置坐标
	Point locationInNode = target->convertToNodeSpace(touch->getLocation());

	// 得到事件绑定的target的原始面积
	Size s = target->getContentSize();
	// 创建矩形
	Rect rect = Rect(0, 0, s.width, s.height);

	// 点击范围判断检测
	if (rect.containsPoint(locationInNode))
	{
		log("onTouchBegan... x = %f, y = %f", locationInNode.x, locationInNode.y);
		target->setOpacity(100);
		return true;
	}
	return false; // 信息向下传递,false则表示信息不向下传递
}

void onTouchMoved(Touch *touch, Event * event){
	log("onTouchMoved");
}

void onTouchEnded(Touch *touch, Event * event){
	// 获取当前监听事件所绑定的 target 
	auto target = static_cast<Sprite*>(event->getCurrentTarget());
	target->setOpacity(255);
	log("onTouchEnded");
}

void onTouchCancelled(Touch *touch, Event * event){
	log("onTouchCancelled");
}
/****************************************************************************************/

而使用Lambda函数方法,只不过是把虚函数里的方法放入Lambda中,且不用在头文件中加入重写虚函数的声明

	/**************************单点触摸——Lambda函数方法*******************************/
	// 创建一个事件监听器类型为 OneByOne 的单点触摸
	auto listener = EventListenerTouchOneByOne::create();

	// 设置是否吞没事件,在 onTouchBegan 方法返回 true 时吞没
	listener->setSwallowTouches(true);

	// 触摸开始时,用调用函数的方式
	listener->onTouchBegan = [&](Touch *touch, Event * event){// 获取当前监听事件所绑定的 target 
		auto target = static_cast<Sprite*>(event->getCurrentTarget());

		// 获取当前点击点所在相对按钮的位置坐标
		Point locationInNode = target->convertToNodeSpace(touch->getLocation());

		// 得到事件绑定的target的原始面积
		Size s = target->getContentSize();
		// 创建矩形
		Rect rect = Rect(0, 0, s.width, s.height);

		// 点击范围判断检测
		if (rect.containsPoint(locationInNode))
		{
			log("onTouchBegan... x = %f, y = %f", locationInNode.x, locationInNode.y);
			target->setOpacity(100);
			return true;
		}
		return false; // 信息向下传递,false则表示信息不向下传递
	};  // 触摸开始
	listener->onTouchMoved = [&](Touch *touch, Event * event){log("onTouchMoved"); }; // 触摸移动
	listener->onTouchEnded = [&](Touch *touch, Event * event){
		auto target = static_cast<Sprite*>(event->getCurrentTarget());
		target->setOpacity(255);
		log("onTouchEnded"); 
	}; // 触摸结束
	listener->onTouchCancelled = [&](Touch *touch, Event * event){log("onTouchCancelled"); }; // 触摸中断

	// 用事件分发器给对象添加监听器,this表示本场景
	_eventDispatcher->addEventListenerWithSceneGraphPriority(listener, sprite1);

	// 监听器克隆
	_eventDispatcher->addEventListenerWithSceneGraphPriority(listener->clone(), sprite2);
	/****************************************************************************************/
上面的单点触摸Lambda函数实现,化简一下主要部分如下

        /************************************Lambda函数精简****************************************/
	auto listener = EventListenerTouchOneByOne::create();

	listener->onTouchBegan = [](Touch *touch, Event * event){};
	listener->onTouchMoved = [](Touch *touch, Event * event){};
	listener->onTouchEnded = [](Touch *touch, Event * event){};
	listener->onTouchCancelled = [](Touch *touch, Event * event){};

	_eventDispatcher->addEventListenerWithSceneGraphPriority(listener, this);
	/******************************************************************************************/


多点触摸与单点触摸差不多,下面我就给出多点触摸用的Lambda函数实现的精简

        /******************************多点触摸——Lambda函数精简*************************************/
	auto listener = EventListenerTouchAllAtOnce::create();

	listener->onTouchesBegan = [](const std::vector<Touch*>& touch, Event* event){};
	listener->onTouchesMoved = [](const std::vector<Touch*>& touch, Event* event){};
	listener->onTouchesEnded = [](const std::vector<Touch*>& touch, Event* event){};
	listener->onTouchesCancelled = [](const std::vector<Touch*>& touch, Event* event){};

	_eventDispatcher->addEventListenerWithSceneGraphPriority(listener, this);
	/******************************************************************************************/
大家发现了吧,多点触摸的事件监听器用的是EventListenerTouchAllAtOnece,而单点的是EventListenerTouchOneByOne;

同时把回调函数从单数变为了复数,如onTouchBegan变成了onTouchesBegan,在Touch后面多加了个es;

最后就是函数的Touch参数发生了变化,从Touch变为了const std::vector<Touch*>&,整个触摸点的队列地址




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值