/**************************单点触摸——重写虚函数方法*******************************/
// 创建一个事件监听器类型为 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*>&,整个触摸点的队列地址