成员方法的声明:
//单点触摸,TouchBegan返回值为bool,TouchMoved和TouchEnded返回值为void
//touch一般为触摸点的信息
//event可以获取该事件对应的精灵,与addEventListenerWithSceneGraphPriority(listener, spriteRun)中的spriteRun对应
bool TouchBegan(Touch* touch, Event* event);
void TouchMoved(Touch* touch, Event* event);
void TouchEnded(Touch* touch, Event* event);
成员方法的定义:
bool HelloWorld::TouchBegan(Touch* touch, Event* event)
{
//获得触发事件的精灵
auto eventSprite = (Sprite*)event->getCurrentTarget();
//根据标签来判断是那个精灵
if (2 == eventSprite->getTag())
{
auto location = touch->getLocation();
auto positionToSprite = eventSprite->convertToNodeSpace(location);
Rect rect(0, 0, eventSprite->getContentSize().width, eventSprite->getContentSize().height);
if (rect.containsPoint(positionToSprite))
{
CCLOG("spriteRun Yes");
return true;
}
else
{
CCLOG("spriteRun No");
return false;
}
}
else if (1 == eventSprite->getTag())
{
auto label = (Label*)eventSprite;
label->setString("Began");
CCLOG("label Yes");
return true;
}
}
void HelloWorld::TouchMoved(Touch* touch, Event* event)
{
auto eventSprite = (Sprite*)event->getCurrentTarget();
if (2 == eventSprite->getTag())
{
auto delta = touch->getDelta();
auto oldPosition = eventSprite->getPosition();
auto newPosition = oldPosition + delta;
eventSprite->setPosition(newPosition);
CCLOG("Moved:delta %f,%f oldPosition %f,%f", delta.x, delta.y, oldPosition.x, oldPosition.y);
}
else if (1 == eventSprite->getTag())
{
auto label = (Label*)eventSprite;
label->setString("Moved");
}
}
void HelloWorld::TouchEnded(Touch* touch, Event* event)
{
CCLOG("Ended");
}
部分代码:
//触摸事件
auto listener = EventListenerTouchOneByOne::create();
//onTouchBegan的返回值如果为true,onTouchMoved和onTouchEnded会得到执行
//onTouchBegan的返回值如果为false,onTouchMoved和onTouchEnded不会得到执行
listener->onTouchBegan = CC_CALLBACK_2(HelloWorld::TouchBegan, this);
listener->onTouchMoved = CC_CALLBACK_2(HelloWorld::TouchMoved, this);
listener->onTouchEnded = CC_CALLBACK_2(HelloWorld::TouchEnded, this);
//Dispatcher调度器,SceneGraphPriority场景图优先,使用listener需要先加入事件调度器中
_eventDispatcher->addEventListenerWithSceneGraphPriority(listener, spriteRun);
//listener->clone,克隆另一个监听器,如果不用clone,listener将无法监听spriteRun
//可以理解为一个eventListener只能绑定一个精灵
_eventDispatcher->addEventListenerWithSceneGraphPriority(listener->clone(), label);
//为精灵设置标签,可以在事件处理时区分不同的精灵
label->setTag(1);
spriteRun->setTag(2);