关于cocos2d-x中CCScrollView添加CCMenu一系列问题的解决方案

上次说到CCScrollView里面添加CCMenu可以解决触摸优先级的问题,但实际上还有问题,滑动是可以滑动了,但滑动一松手,它可能立马响应CCMenu的点击事件,还有,当CCMenu超出可视区域后还是能够点击,这也是让人头疼的问题。问题虽然让人头疼,但解决方案还是有的。我们还是从上篇的CCMenu的扩展类MyMenu入手,我给MyMenu添加moved属性,初始化为false,在ccTouchMove事件里赋值为true,最后在ccTouchEnd里面判断是否move,如果move就不调用CCMenu的ccTouchEnd。这里要注意两点,一是每次ccTouchBegan的时候都要将move设为false,还有ccTouchEnd里面当move为true时,继承CCMenu的属性m_eState要设为kCCMenuStateWaiting,否则它就会在ccTouchBegan的时候return false而进不到ccTouchEnd中了。具体代码:

 1 bool MyMenu::ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent){    
 2     if(visibleRect_.size.width&&visibleRect_.size.height){
 3         if(!visibleRect_.containsPoint(pTouch->getLocation()))
 4             return false;
 5     }
 6     startPosition = pTouch->getLocation(); 
7
return CCMenu::ccTouchBegan(pTouch,pEvent); 8 } 9 10 void MyMenu::ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent){
12 CCMenu::ccTouchMoved(pTouch,pEvent); 13 } 14 15 void MyMenu::ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent){ 16 CCPoint position = pTouch->getLocation();
if(position.y - startPosition.y <= 10 && position.y - startPosition.y >= -10)
17 CCMenu::ccTouchEnded(pTouch,pEvent); 18 else 19 m_eState = kCCMenuStateWaiting; 20 }

大家发现ccTouchBegan里面多了visibleRect_几行代码,这个就是用来判断CCMenu是否在可视区域,当不在可视区域直接return false,这样在超出可视区域点击CCMenu是无效的。当然这个可视区域是具体使用的地方传入的,其实也就是scrollView的viewSize。好啦,至此关于CCScrollView中添加CCMenu造成的一系列问题都得以解决。(在不断的尝试中总结经验,以帮助后面的人更快的上路,http://zhs.guohe.in/)

posted @ 2013-01-05 20:03  叶尚海  阅读(2623)  评论(1编辑  收藏  举报