近期在学习《我所理解的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树的更多相关文章

  1. 利用Node实现HTML5离线存储的方法

    这篇文章主要介绍了利用Node实现HTML5离线存储的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  2. Html5 Canvas实现图片标记、缩放、移动和保存历史状态功能 (附转换公式)

    这篇文章主要介绍了Html5 Canvas实现图片标记、缩放、移动和保存历史状态功能 (附转换公式),本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  3. ios – 使用带有NodeJs HTTPS的certificates.cer

    我为IOS推送通知生成了一个.cer文件,我希望将它与NodeJSHTTPS模块一起使用.我发现HTTPS模块的唯一例子是使用.pem和.sfx文件,而不是.cer:有解决方案吗解决方法.cer文件可以使用两种不同的格式进行编码:PEM和DER.如果您的文件使用PEM格式编码,您可以像使用任何其他.pem文件一样使用它(有关详细信息,请参见Node.jsdocumentation):如果您的文件使

  4. 如何在XCode IDE中构建NodeJS?

    如何在XCodeIDE中将NodeJS构建为项目?NodeJS构建指令说它应该用以下内容构建:但是我希望在XCodeIDE中构建.我真正想要做的是在我的应用程序中嵌入NodeJS,所以我想如果我可以在XCode中构建NodeJS,那么我可以调整它以在我建立和运行NodeJS后添加我的应用程序.我想通过让V8在XCode中编译来取得一些进展,现在我正在尝试将NodeJS添加到V8项目中.解决方法在节点存储库根目录中运行./configure–xcode,您将获得所需的node.xcodeproj文件.

  5. ios – 类中的extern NSString * const.

    嗨,我有这个头文件:执行:当我在.pch文件中导入头文件时,我可以在任何地方访问常量.但我试着了解发生了什么.我从不为此对象分配init,因此它们不能是实例常量.所以常量必须是“类对象常量对吗?但我认为类对象不能包含数据.谁能解释一下?解决方法那些外部变量是app级全局变量.它们没有作用于类,它们不限于类的实例.Objective-C不支持实例或类级别全局变量.如果需要类级别常量,则需要定义类方法

  6. 深入云存储系统Swift核心组件:Ring实现原理剖析

    它的目的是用于托管Rackspace的CloudFilesservice,原始项目代号是swift,所以沿用至今。Ring是Swift中最重要的组件,用于记录存储对象与物理位置间映射关系。先来看一下Swift文档中关于Ring的描述:Ring用来确定数据驻留在集群中的位置。有单独对应于Account数据库、container数据库和单个object的ring。Ring使用zone的概念来保证数据的隔离。每个partition的replica都确保放在了不同的zone中。本文逐步深入探讨了Swift如何通过

  7. 早期Swift中Cocos2D初始化代码的重构

    但是遗憾的是Swift2.2中还是不支持Type的class属性关键字,只能用static,我们期待Swift3的改进吧!

  8. Swift 3.0与C语言指针类型的桥接

    关于Swift与C语言指针类型的对应表可参考Apple官方的《UsingSwiftwithCocoaandObjective-C》文档。首先是Swift与C桥接的头文件内容:上述函数原型声明中,为了简化指针类型的讨论,我们都将它们声明为_Nonnull属性。

  9. Swift开发:创建XML文件,包含节点,属性值

    .append;//3创建第二个节点数据letitem2:Item=Item;for{letnode=Node;node.id=i+1;node.attributes=["ID":"\","Name":"N-\","disp":"1","Appliance":"1","Icon":"ic_switch_4"]item2.addNode;}xml.items?

  10. 手把手教你swift项目添加cocos2dx-lua

    去倒杯水吧,这个过程会很久。。。至此,工程已经全部配置完毕,你已经解决一个大Boss了;今天就到这里吧,之后我们再续如何用swift调用lua手把手教你swift项目添加cocos2dx-lua

随机推荐

  1. 【cocos2d-x 3.x 学习笔记】对象内存管理

    Cocos2d-x的内存管理cocos2d-x中使用的是上面的引用计数来管理内存,但是又增加了一些自己的特色。cocos2d-x中通过Ref类来实现引用计数,所有需要实现内存自动回收的类都应该继承自Ref类。下面是Ref类的定义:在cocos2d-x中创建对象通常有两种方式:这两中方式的差异可以参见我另一篇博文“对象创建方式讨论”。在cocos2d-x中提倡使用第二种方式,为了避免误用第一种方式,一般将构造函数设为protected或private。参考资料:[1]cocos2d-x高级开发教程2.3节[

  2. 利用cocos2dx 3.2开发消灭星星六如何在cocos2dx中显示中文

    由于编码的不同,在cocos2dx中的Label控件中如果放入中文字,往往会出现乱码。为了方便使用,我把这个从文档中获取中文字的方法放在一个头文件里面Chinese.h这里的tex_vec是cocos2dx提供的一个保存文档内容的一个容器。这里给出ChineseWords,xml的格式再看看ChineseWord的实现Chinese.cpp就这样,以后在需要用到中文字的地方,就先include这个头文件然后调用ChineseWord函数,获取一串中文字符串。

  3. 利用cocos2dx 3.2开发消灭星星七关于星星的算法

    在前面,我们已经在GameLayer中利用随机数初始化了一个StarMatrix,如果还不知道怎么创建星星矩阵请回去看看而且我们也讲了整个游戏的触摸事件的派发了。

  4. cocos2dx3.x 新手打包APK注意事项!

    这个在编译的时候就可以发现了比较好弄这只是我遇到的,其他的以后遇到再补充吧。。。以前被这两个问题坑了好久

  5. 利用cocos2dx 3.2开发消灭星星八游戏的结束判断与数据控制

    如果你看完之前的,那么你基本已经拥有一个消灭星星游戏的雏形。开始把剩下的两两互不相连的星星消去。那么如何判断是GameOver还是进入下一关呢。。其实游戏数据贯穿整个游戏,包括星星消除的时候要加到获得分数上,消去剩下两两不相连的星星的时候的加分政策等,因此如果前面没有做这一块的,最好回去搞一搞。

  6. 利用cocos2dx 3.2开发消灭星星九为游戏添加一些特效

    needClear是一个flag,当游戏判断不能再继续后,这个flag变为true,开始消除剩下的星星clearSumTime是一个累加器ONE_CLEAR_TIME就是每颗星星消除的时间2.连击加分信息一般消除一次星星都会有连击信息和加多少分的信息。其实这些combo标签就是一张图片,也是通过控制其属性或者runAction来实现。源码ComboEffect.hComboEffect.cpp4.消除星星粒子效果消除星星时,为了实现星星爆裂散落的效果,使用了cocos2d提供的粒子特效引擎对于粒子特效不了

  7. 02 Cocos2D-x引擎win7环境搭建及创建项目

    官网有搭建的文章,直接转载记录。环境搭建:本文介绍如何搭建Cocos2d-x3.2版本的开发环境。项目创建:一、通过命令创建项目前面搭建好环境后,怎样创建自己的Cocos2d-x项目呢?先来看看Cocos2d-x3.2的目录吧这就是Cocos2d-x3.2的目录。输入cocosnew项目名–p包名–lcpp–d路径回车就创建成功了例如:成功后,找到这个项目打开proj.win32目录下的Hello.slnF5成功了。

  8. 利用cocos2dx 3.2开发消灭星星十为游戏添加音效项目源码分享

    一个游戏,声音也是非常的重要,其实cocos2dx里面的简单音效引擎的使用是非常简单的。我这里只不过是用一个类对所有的音效进行管理罢了。Audio.hAudio.cpp好了,本系列教程到此结束,第一次写教程如有不对请见谅或指教,谢谢大家。最后附上整个项目的源代码点击打开链接

  9. 03 Helloworld

    程序都有一个入口点,在C++就是main函数了,打开main.cpp,代码如下:123456789101112131415161718#include"main.h"#include"AppDelegate.h"#include"cocos2d.h"USING_NS_CC;intAPIENTRY_tWinMain{UNREFERENCED_ParaMETER;UNREFERENCED_ParaMETER;//createtheapplicationinstanceAppDelegateapp;return

  10. MenuItemImage*图标菜单创建注意事项

    学习cocos2dx,看的是cocos2d-x3.x手游开发实例详解,这本书错误一大把,本着探索求知勇于发现错误改正错误的精神,我跟着书上的例子一起调试,当学习到场景切换这个小节的时候,出了个错误,卡了我好几个小时。

返回
顶部