一个场景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++);
前一种的话就只要循环遍历场景的所有子节点,判断触碰的点是否处于这个子节点的内部,就可以找到真正触碰的节点,然后让它的触碰事件响应,好像轻量一点的感觉。不过这样是不是我自己做了本该引擎来做的事?
不知道正确的或者说行业内标准的做法是怎样的?自学没办法