只想在精灵添加了点击 listener事件,为什么点击精灵区域以外的地方, listener 事件也能接收到呢?

现在只想让精灵,接收点击 listener事件。
下面是处理代码:
开发环境:
win8
vs2012
cocos2d-x 3.0 alpha1

在使用 回调方法] 方式 及 方式 结果都是一样的, 在精灵区域外的地方,也能收到点击事件。

// add your codes below…
auto player = Sprite::create(“Player.png”, Rect(0, 0, 27, 40) );
player->setPosition(Point(origin.x + player->getContentSize().width/2,
origin.y + visibleSize.height/2) );
this->addChild(player, 1, 10);

auto dispatcherPlay = Director::getInstance()->getEventDispatcher();
auto listenerPlay = EventListenerTouchAllAtOnce::create();

// 事件处理 回调方法] 方式
listenerPlay->onTouchesMoved = CC_CALLBACK_2(HelloWorld::onPlayerTouchesMoved, this);

// 事件处理 方式
// listenerPlay->onTouchesMoved = ](const std::vector<Touch*>& touches, Event unused_event){
// log(“Player to move”);
// Touch
touch = touches;
// auto player = static_cast<Sprite*>(unused_event->getCurrentTarget());
// player->setPosition(player->getPosition()+touch->getDelta());
// };

dispatcherPlay->addEventListenerWithSceneGraphPriority(listenerPlay, player);

研究了一下,我也是个新手。但通过测试发现了这个规律:
这个函数假如是touch事件绑定的函数:
bool HelloWorld::onTouchBegand(Touch* touches, Event* event)
{
CCLOG(“Touch began!”);
Point locationInNode = YourSprite->convertToNodeSpace(touches->getLocation());
Size s = armature->getContentSize();
Rect rect = Rect(0, 0, s.width, s.height);

if (rect.containsPoint(locationInNode))
{
    // 你的逻辑代码
    return true;
}
return false;

}

这里关键的地方就是rect.containsPoint,当点击屏幕时,我发现 CCLOG(“Touch began!”); 就输出了Touch began。。。但是只有点击到Sprite的区域里时,才返回true,这时候,touchEnded的函数才会触发,或者你的逻辑会触发。

点击在屏幕其他地方,touch事件发生,但是不触发你的逻辑。