单个事件处理(EventListenerTouchOneByOne)机制求助,,,,点击一次,所有都响应

自定义一个Sprite,然后添加如下代码。

EventListenerTouchOneByOne * listener = EventListenerTouchOneByOne::create();
    listener->setSwallowTouches(true);
    listener->onTouchBegan = CC_CALLBACK_2(GameBlock::onTouchBegan, this);
    listener->onTouchMoved = CC_CALLBACK_2(GameBlock::onTouchMoved, this);
    listener->onTouchEnded = CC_CALLBACK_2(GameBlock::onTouchEnded, this);
    _eventDispatcher->addEventListenerWithSceneGraphPriority(listener, this);

```

然后在gamaLayer用for循环创建并添加Sprite
 for (int i = 0; i < 4; i ++) {
        GameBlock *item = NULL;
            if (index == i) {
                item = GameBlock::createBlockWithTexture2d(_greenBatchNode->getTexture());
            } else {
                item = GameBlock::createBlockWithTexture2d(_redBatchNode->getTexture());
            }
        }
        float offsetx = i * item->getContentSize().width + item->getContentSize().width / 2;
        item->setPosition(Point(offsetx, item->getContentSize().height / 2));
        this->addChild(item);
```


然后再gamelayer点击每一个Sprite,结果所有自定义sprite事件都响应了。
这个怎么破,我要点击一个,每个对象处理响应的事件就行,为啥所有添加在gamelayer上的自定sprite都响应了触摸事件,是我代码写的有问题吗?
如果是cocos2d-x 本来就这样处理,那我要吐槽。。。太不方便了,,我创建了多个自定义的Sprite,代码块应该是单独的才对,点击那个Sprite,那个响应事件,现在所有都想要了,各位高人,看看是哪里的问题,多谢了。

如果说要gamelayer种处理点击时间,根据位置判断,这个可以(我之前就这么做,但是gamelayer太大,难维护),但是很麻烦,如果处理多个事件,那个gamelayer太大,每个Sprie的事件自己去处理最好。各位高人来看看吧。。

还有我的自定义Sprite是移动的,

接着吐槽,
我的原型是,有几行相同的自定义的sprite,而且在没有规律的移动,我要的是根据点击那个自定义sprite,来判断游戏状态,,,
那么现在有的事件机制下,我要先判断点击gamelayer上 Y 的位置(因为我一排按钮是一个小的sprite container),然后判断 sprite container X ,这样才能找到点击的到底是哪个,,纠结不。。靠。。。

http://www.2cto.com/kf/201401/275848.html
/ Make sprite1 touchable
auto listener1 = EventListenerTouchOneByOne::create();//创建一个触摸监听
listener1->setSwallowTouches(true); //设置是否想下传递触摸

//通过 lambda 表达式 直接实现触摸事件的回掉方法
listener1->onTouchBegan = ](Touch* touch, Event* event){
auto target = static_cast<sprite*>(event->getCurrentTarget());

Point locationInNode = target->convertToNodeSpace(touch->getLocation());
Size s = target->getContentSize();
Rect rect = Rect(0, 0, s.width, s.height);
 
if (rect.containsPoint(locationInNode))
{
    log("sprite began... x = %f, y = %f", locationInNode.x, locationInNode.y);
    target->setOpacity(180);
    return true;
}
return false;

};

listener1->onTouchMoved = ](Touch* touch, Event* event){
auto target = static_cast<sprite*>(event->getCurrentTarget());
target->setPosition(target->getPosition() + touch->getDelta());
};

listener1->onTouchEnded = =](Touch* touch, Event* event){
auto target = static_cast<sprite*>(event->getCurrentTarget());
log("sprite onTouchesEnded… ");
target->setOpacity(255);
if (target == sprite2)
{
sprite1->setZOrder(100);
}
else if(target == sprite1)
{
sprite1->setZOrder(0);
}
};

_eventDispatcher->addEventListenerWithSceneGraphPriority(listener1, sprite1);
_eventDispatcher->addEventListenerWithSceneGraphPriority(listener1->clone(), sprite2);
_eventDispatcher->addEventListenerWithSceneGraphPriority(listener1->clone(), sprite3);

所以楼主这个问题最后怎么解决了?

我也遇到同样的问题了,楼主是否解决了???