void HelloWorld::onEnter()
{
Layer::onEnter();
log("HelloWorld onEnter");
// 创建一个事件监听器 OneByOne 为单点触摸
auto listener = EventListenerTouchOneByOne::create();
// 设置是否吞没事件,在 onTouchBegan 方法返回 true 时吞没
listener->setSwallowTouches(true);
// onTouchBegan 事件回调函数
listener->onTouchBegan = CC_CALLBACK_2(HelloWorld::touchBegan, this);
// onTouchMoved 事件回调函数
listener->onTouchMoved = CC_CALLBACK_2(HelloWorld::touchMoved, this);
// onTouchEnded 事件回调函数
listener->onTouchEnded = CC_CALLBACK_2(HelloWorld::touchEnded, this);
// 注册监听器
EventDispatcher* eventDispatcher = Director::getInstance()->getEventDispatcher();
eventDispatcher->addEventListenerWithSceneGraphPriority(listener, getChildByTag(kBoxA_Tag));
eventDispatcher->addEventListenerWithSceneGraphPriority(listener->clone(), getChildByTag(kBoxB_Tag));
eventDispatcher->addEventListenerWithSceneGraphPriority(listener->clone(), getChildByTag(kBoxC_Tag));
}
bool HelloWorld::touchBegan(Touch* touch, Event* event)
{
// 获取事件所绑定的 target
auto target = static_cast<Sprite*>(event->getCurrentTarget());
// 获取当前点击点所在相对按钮的位置坐标
Vec2 locationInNode = target->convertToNodeSpace(touch->getLocation());
Size s = target->getContentSize();
Rect rect = Rect(0, 0, s.width, s.height);
// 点击范围判断检测
if (rect.containsPoint(locationInNode))
{
log("sprite x = %f, y = %f ", locationInNode.x, locationInNode.y);
log("sprite tag = %d", target->getTag());
target->runAction(ScaleBy::create(0.06f, 1.06f));
return true;
}
return false;
}
void HelloWorld::touchMoved(Touch *touch, Event *event)
{
log("onTouchMoved");
auto target = static_cast<Sprite*>(event->getCurrentTarget());
// 移动当前按钮精灵的坐标位置
target->setPosition(target->getPosition() + touch->getDelta());
}
void HelloWorld::touchEnded(Touch *touch, Event *event)
{
log("onTouchEnded");
auto target = static_cast<Sprite*>(event->getCurrentTarget());
log("sprite onTouchesEnded.. ");
Vec2 locationInNode = target->convertToNodeSpace(touch->getLocation());
Size s = target->getContentSize();
Rect rect = Rect(0, 0, s.width, s.height);
// 点击范围判断检测
if (rect.containsPoint(locationInNode))
{
log("sprite x = %f, y = %f ", locationInNode.x, locationInNode.y);
log("sprite tag = %d", target->getTag());
target->runAction(ScaleTo::create(0.06f, 1.0f));
}
}
void HelloWorld::onExit()
{
Layer::onExit();
log("HelloWorld onExit");
Director::getInstance()->getEventDispatcher()->removeAllEventListeners();
}