zoukankan      html  css  js  c++  java
  • 关于cocos2dx中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/)

  • 相关阅读:
    VSCode settings.json的配置样例
    用css让div高度自动撑满屏幕
    C# 后端接受前端上传的文件
    netcode 控制台项目生成exe文件
    C# UDP发送和接收
    C# 直播录制视频
    Vs2017 FrameWork EF Mysql Mvc 三层整合1
    Vs2017 FrameWork EF Mysql 控制台应用
    Vs2017 NetCode EF Mysql 控制台应用
    Vs2017 NetCode Mvc EF Mysql 整合2
  • 原文地址:https://www.cnblogs.com/yeshanghai/p/2846619.html
Copyright © 2011-2022 走看看