• scrollview的总结


      今天主要是学习了cocos2dx的scrollview的内容,把简单的菜单滑动表现做出来了。像很多游戏的下方有一槽功能按钮,角色、背包、技能、帮助等,当宽度不足以全部显示出来的时候,隐藏一部分,以滑动的形式展现是一个很好的解决办法,秦时明月2就是如此。

      做到这一点,很简单,主要有几点要注意一下:

    (1)cocos studio的ui编辑器中的scrollview的属性倒数第二个“滑动方向”要选择Horizontal。另外,这里有一篇文章讲到了scrollview和listview的一点区别,你往这两个控件中拖按钮就可以看得很明显了【参考:http://blog.csdn.net/cyistudio/article/details/8972617】。

    (2)使用的时候要用到Touchgroup这个类,使用的步骤如下:

    self._layout = tolua.cast(GUIReader:shareReader():widgetFromJsonFile("cocosui/UIEditorTest/UIButton_Editor/UIButton_Editor_1.json"), "Layout")
        self._uiLayer:addWidget(self._layout)
    

    其中的layout是cocos2dx中的一个类,为什么要用到它呢?是因为他和Widget这个有关系,下面再说。self._uiLayer就是一个TouchGroup类,也就是使用起来的lua代码有三个步骤:

      1)使用widgetFromJsonFile中json文件中得到layout类

      2)新建一个touchgroup对象,使用addwidget加入其中

      3)getWidgetByName或者getWidgetByTag得到其中的某个对象(这个对象就是studio中的一个个对象)

    接下来,思考部分...


    碰到以下三个问题:

    (1)scrollview是都要用到TouchGroup这个类来承载吗?

    (2)标准触摸事件是所有layer都会响应点击事件,为什么我的mainlayer点击了之后,mainlayer和btnlayer(一个场景中两个并列的layer)都有响应;但是点击btnlayer之后,都没有反应呢?

    (3)addchild和addwidget有什么区别?为什么上面的TouchGroup会用addwidget而不是addchild呢?

    回答如下:

    (1)scrollview不是要用到TouchGroup来承载,但是如果你是要通过读json文件(studio导出的),那么就要用。为什么要用呢?因为看了代码之后,我看来(没看官方文件),TouchGroup就是用来方便使用studio 导出的json文件的,包括读取和后面的使用。

    --[[此部分有待确定!

    我考虑的一个原因是,TouchGroup已经写好了scrollview的滑动效果,所以如果你用别的类,比如layer(scrollview也是继承layer),那么你自己要写滑动这一层的逻辑,不然要自己写。

    ]]

    (2)为什么没反应呢?那是因为触摸时间有两种,标准触摸事件和带目标的触摸事件(参考:《Cocos2d-x高级开发教程》)。而TouchGroup是后一种,可以直接看下面的代码:

    bool TouchGroup::ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent)
    {
        return checkEventWidget(pTouch, pEvent);
    }

    第一个参数是CCTouch*,而标准触摸事件的参数是CCSet*

    (3)两者区别,并不是说简单意思上的都属于上一层。实现上可能都是分别用了一个指针用来保存一个结构体( TouchGroup *m_pUILayer和CCArray *m_pChildren;)但是对于addwidget来说还有一个重要的目的,就是能够更加Tag和Name来直接获取studio中某个节点对象,可以看TouchGroup的函数代码如下:

    Widget* TouchGroup::getWidgetByTag(int tag)
    {
        if (!m_pRootWidget)
        {
            return NULL;
        }
        return UIHelper::seekWidgetByTag(m_pRootWidget, tag);
    }
    
    Widget* TouchGroup::getWidgetByName(const char* name)
    {
        if (!m_pRootWidget)
        {
            return NULL;
        }
        return UIHelper::seekWidgetByName(m_pRootWidget, name);
    }

    因为解析json文件的函数widgetFromJsonFile已经是一个树形结构,而且seekWidgetByTag还是ByName就是遍历这个树的操作,具体去看代码,第一次看这里的时候也很是惊讶!但是如果是自己去做又做成什么样呢?如果想追求遍历速度的话,你要重新构造存储树结构,简单的比如做一个hash表,但是这边的工作量和层次感上并不一定好!

    总结:

    (1)今天终于算是有所交代了

    (2)还有很多细节没有去研究,因为时间上的原因,都是按照自己的理解去说的,错的地方还望高手指出来

    (3)晚上和一个朋友座谈了一会:结果!

  • 相关阅读:
    针式PKM的主要画面的功能简介
    程序员早日走向架构师的利器:针式PKM V8.01发布
    如何经营你的知识资产
    一般软件工程师怎样拥有更多的资产
    剪贴板的使用技巧
    不要给自己找不“深入学习”的理由了
    《小论无所事事》
    全国(1977年~2011年)历年参加高考人数和录取人数
    Sql Server中,文件批量重命名
    HTML斜线表头
  • 原文地址:https://www.cnblogs.com/pk-run/p/4093658.html
Copyright © 2020-2023  润新知