【深入了解cocos2d-x 3.x】UI树(1)——什么是UI树

【深入了解cocos2d-x 3.x】UI树(1)——什么是UI树,第1张

概述近期在学习《我所理解的Cocos2d-x》这一本书,被作者深厚的功力所折服,感觉到自己实在是太弱了,cocos2d-x当中要学习的东西实在是太多了。 在《我所理解的cocos2d-x》中关于UI树与内存管理其实是关联性很强的,这一篇主要写我对UI树的理解。(本文基于cocos2d-x 3.2版本,其他版本API可能会有所变化) 首先得普及一下cocos2d-x的基础概念,cocos2d-x的游戏世

近期在学习《我所理解的Cocos2d-x》这一本书,被作者深厚的功力所折服,感觉到自己实在是太弱了,cocos2d-x当中要学习的东西实在是太多了。

在《我所理解的cocos2d-x》中关于UI树与内存管理其实是关联性很强的,这一篇主要写我对UI树的理解。(本文基于cocos2d-x 3.2版本,其他版本API可能会有所变化)

首先得普及一下cocos2d-x的基础概念,cocos2d-x的游戏世界一般是由一个又一个的场景(Sence)组成的,比如登录是一个场景,战斗是一个场景;然后场景之下分为一个又一个的层(Layer),比如界面层,地图层;层下又分为一个又一个的精灵、UI控件以及各类的界面元素。而以上种种都是基于一个叫做Node的基类。好了,回顾完了。下面我们来看看这个Node究竟做了什么(下面的声明忽略的部分无关函数):

class CC_DLL Node : public Ref{public:    ////// ADD //////    virtual voID addChild(Node * child);    virtual voID addChild(Node * child,int localZOrder);    virtual voID addChild(Node* child,int localZOrder,int tag);    virtual voID addChild(Node* child,const std::string &name);    ////// GET //////    virtual Node * getChildByTag(int tag) const;    virtual Node* getChildByname(const std::string& name) const;    template <typename T>    inline T getChildByname(const std::string& name) const { return static_cast<T>(getChildByname(name)); }    virtual voID enumerateChildren(const std::string &name,std::function<bool(Node* node)> callback) const;    virtual Vector<Node*>& getChildren() { return _children; }    virtual const Vector<Node*>& getChildren() const { return _children; }    virtual ssize_t getChildrenCount() const;    virtual Node* getParent() { return _parent; }    virtual const Node* getParent() const { return _parent; }    ////// REMOVES //////    virtual voID removeFromParent();    virtual voID removeFromParentAndCleanup(bool cleanup);    virtual voID removeChild(Node* child,bool cleanup = true);    virtual voID removeChildByTag(int tag,bool cleanup = true);    virtual voID removeChildByname(const std::string &name,bool cleanup = true);    virtual voID removeAllChildren();    virtual voID removeAllChildrenWithCleanup(bool cleanup);}
可以看出大致分为3类方法,第一个是addChild,作用是为此节点添加子节点,当我们需要将一个精灵添加到层中时,我们可以这么做
	Layer l = Layer::create();	Sprite s = Sprite::create();	l->addChild(s);	this->addChild(l);

addChild还有其他的几个变种,这里就不多解释了。addChild是UI树的重要组成部分之一,它将一个节点添加到UI树中,UI树会保持对这个节点的强引用(关于内存部分,下篇文章会说到)。

第二个重要的方法是getXXX,相信用的人也挺多了,这里就不多说了,着重说下新冒出来的吧,分别是:

    template <typename T>    inline T getChildByname(const std::string& name) const { return static_cast<T>(getChildByname(name)); }    virtual voID enumerateChildren(const std::string &name,std::function<bool(Node* node)> callback) const;

第一个getChildByname<T>和普通的getChildByname其实差不多,看实现就知道了,只不过这个增加了一个模板,不用手动写静态转换。使用方法也差不多,例如,我想要获取到一个层下名字叫“exit”的精灵节点,就可以这么用:
l->getChildByname<Sprite>("exit");
是不是稍微简洁点?其实这种用法在Unity3D上已经非常常用了、

再说说另外一个函数enumerateChildren,这个函数就非常给力了,这个函数会搜索当前节点下的所有子节点,只要节点下的子节点的名字与参数name一致,就会执行第二个参数的回调函数callback(当然,这函数还不止那么简单)。这里不做更多的分析(以后会单独出一篇文章对这个函数进行具体的分析,这个函数也是一个非常有意思的函数啊,= =)

接下来的函数就是removeXXXX了,这个函数的作用就是从UI树中移除某个节点,例如removeFromParent就是从UI数中将自己从父节点中移除。removeChild就是将参数中的子节点从UI树中移除。


OK,基本函数已经介绍完毕;下面来说说UI树的组成。一般而言,Scene就是UI树的根节点,而Layer节点一般作为Scene下的节点,Layer可以嵌套Layer;Layer也有许多变种,例如Layercolor。Layer上可以添加各种图片以及控件,这些图片和控件上也可以添加各类子节点,由于所有的这些的基类都是Node,所以添加起来非常自由,但是需要记住的是,虽然可以把Layer添加到一个Sprite上,但是这是一个在正常需求下不太合乎逻辑的事情。

上述基本就是cocos2d-x 3.x引擎的UI树系统,合理的使用这个UI树系统将会加快游戏开发的进度以及提高游戏的稳定性。

总结

以上是内存溢出为你收集整理的【深入了解cocos2d-x 3.x】UI树(1)——什么是UI树全部内容,希望文章能够帮你解决【深入了解cocos2d-x 3.x】UI树(1)——什么是UI树所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1051353.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-25
下一篇 2022-05-25

发表评论

登录后才能评论

评论列表(0条)

保存