实现方法,直接上代码了:
用如下方法检测监听是否有效:
virtual void onTouchesBegan(const std::vector<Touch*>& touches, Event *unused_event) override;
virtual void onTouchesMoved(const std::vector<Touch*>& touches, Event *unused_event) override;
virtual void onTouchesEnded(const std::vector<Touch*>& touches, Event *unused_event) override;
virtual void onTouchesCancelled(const std::vector<Touch*>&touches, Event *unused_event) override;
继承Layer的MyNode init中的代码:
this->setTouchMode(Touch::DispatchMode::ALL_AT_ONCE);
EventDispatcher* eventDispatcher = Director::getInstance()->getEventDispatcher();
auto listener = EventListenerTouchAllAtOnce::create();
listener->onTouchesBegan = CC_CALLBACK_2(RockerNode::onTouchesBegan, this);
listener->onTouchesMoved = CC_CALLBACK_2(RockerNode::onTouchesMoved, this);
listener->onTouchesEnded = CC_CALLBACK_2(RockerNode::onTouchesEnded, this);
listener->onTouchesCancelled = CC_CALLBACK_2(RockerNode::onTouchesCancelled, this);
eventDispatcher->addEventListenerWithSceneGraphPriority(listener, this);
void MyNode::onTouchesBegan(const std::vector<Touch*>& touches, Event *unused_event)
{
CCLOG("onTouchesBegan");
for (auto &item: touches)
{
auto touch = item;
auto location = touch->getLocation();
CCLOG("==%d,(%f,%f)",(int)this->getRockerID(),location.x,location.y);
}
}
}
void MyNode::onTouchesMoved(const std::vector<Touch*>& touches, Event *unused_event)
{
CCLOG("onTouchesMoved");
}
void MyNode::onTouchesEnded(const std::vector<Touch*>& touches, Event *unused_event)
{
CCLOG("onTouchesEnded");
}
void MyNode::onTouchesCancelled(const std::vector<Touch*>&touches, Event *unused_event)
{
CCLOG("onTouchesCancelled");
}
用如下方法检测监听是否有效:
CCLOG("====%d",listener->checkAvailable());
打印的结果是“====0”,恭喜你,有救了,打开AppController.mm,查找到:
[eaglView setMultipleTouchEnabled:NO];
这下明白了吧?!将NO改成YES就可以了