触碰事件响应的写法

一个场景sceneA里面有许多精灵,假设有spriteB和spriteC,点击B和C具有不同的效果,
那么是只需要sceneA添加了触碰事件的观察,然后在它的触碰方法里面处理,比如:

auto dispatcher = Director::getInstance()->getEventDispatcher();
auto touchListener = EventListenerTouchOneByOne::create();
touchListener->setSwallowTouches(true);
touchListener->onTouchBegan = CC_CALLBACK_2(HelloWorld::onTouchBegan, this);
touchListener->onTouchMoved = CC_CALLBACK_2(HelloWorld::onTouchMoved, this);
touchListener->onTouchEnded = CC_CALLBACK_2(HelloWorld::onTouchEnded, this);
dispatcher->addEventListenerWithSceneGraphPriority(touchListener, this);

然后在
bool HelloWorld::onTouchBegan(cocos2d::Touch *touch, cocos2d::Event *unused_event){
//在这里判断是点在了精灵B上还是精灵C上面,如果时B,就让B调用自己的触碰事件,如果C就让C调自己的触碰事件
return true;
}
还是spriteB和spriteC也都需要有自己的触碰事件观察:
就是B和C的类也实现上面的触碰事件观察的代码,然后在触碰到B的时候,就会调用B的touch方法,触碰到C的时候就会触发C的touch方法,这样就不用经过sceneA的处理了;

后面一种看起来挺好的,符合我理解的每个对象管好自己的事,不越权处理不属于自己的事,但是这样就需要每个精灵都添加自己的触碰事件,这样每次点击,系统不就要观察每个精灵和触碰点的关系,会不会有些浪费?而且每个精灵类都得写一段同样的代码,觉得好傻逼啊(原谅我初学c++);
前一种的话就只要循环遍历场景的所有子节点,判断触碰的点是否处于这个子节点的内部,就可以找到真正触碰的节点,然后让它的触碰事件响应,好像轻量一点的感觉。不过这样是不是我自己做了本该引擎来做的事?
不知道正确的或者说行业内标准的做法是怎样的?自学没办法

可以为每个精灵指定自己的触碰事件,也可以为Layer添加一个touch event listener,然后在相应的触碰事件里先通过触摸点判断是点击到了哪个精灵,再执行不同的事件(行为,即做不同的处理)。

看看自带示例就能让你恍然大悟了。

那到底哪一种更好?

没有绝对的哪种好,示例代码中,这两种都用到了。

关键是看相互的逻辑关系吧。

如果触碰处理代码,不同的地方不多,那建议使用后者,否则就是前者。

按逻辑分,如果一个Layer里需要处理的精灵基本都是同一个逻辑那就给Layer加监听。

如果精灵很特殊,比如唯一的一个Hero,enemy,自身逻辑很特别的,最好给这样的精灵单独加监听。

其实怎么样都是可以的,但是额外处理会让代码看起来舒服易读