本篇博客讲解:
1.Node与Node层级架构
2.Node中重要的操作
3.Node中重要的属性
4.游戏循环与调度

Node与Node层级架构

首先来看一张图

这个图反应了Node与Node的层级架构
所谓层级架构其实就是树形结构/层次结构,从图上可以看出来,树的根是Scene(场景),然后是层,层里面又包含了精灵,菜单,粒子系统,瓦片地图
所有这些元素,都有一个共同的父类,就是Node

这个树形结构,其实就是一种包含关系

这2个文件共同定义了一个HelloWorld的层
class HelloWorld : public cocos2d::Layer
我们自己自定义了一个类HelloWorld继承了Layer,层最后要放到场景里去

Scene* HelloWorld::createScene()
{
    // 创建场景对象
    auto scene = Scene::create();
    // 创建层对象
    auto layer = HelloWorld::create();
    // 把层放到场景里
    scene->addChild(layer);
    // 返回这个场景
    return scene;
}

创建场景以及HelloWord这个层,然后把层放到场景里
通过addChild这个方法,把子节点加到父节点里面去
以此类推,可以把Layer添加到Scene里,也可以这样把精灵,菜单等添加到层里

this->addChild(menu,1);//把菜单放到当前层
//把标签加入到层中
this->addChild(label,1);
//把图片精灵加入到层中
this->addChild(sprite,0);

代码在HelloWord.cpp中可以看到
所以,最开始的图上的层次结构,是通过add的这个方法添加上来的
既然有添加,那么就有移除方法,后面再介绍。
主要是树形结构,需要注意的就是添加的顺序和个数
一般来说,一个场景会有多个层,我们建立的HelloWord实例中,场景和层是一对一的关系
也就是场景中只放了一个层。实际上场景与层是一对多的关系
为了减少绘制的次数,不要建立太多的层,那样很消耗cpu

层与精灵也是一对多的关系,然后层与菜单,粒子系统,瓦片地图都是一对多的关系
菜单与菜单项是一对多的关系,一个菜单里会有多个菜单项
当cocos2d启动一个场景的时候,场景就会加载层,层会加载菜单等等,菜单会加载菜单项。就是这样一种树形结构

Node中重要的操作

由于场景、层、菜单、精灵…都是继承的Node,所以它们有一些共同的属性和方法

创建节点

Node* childNode = Node::create()

增加新的子节点

node->addChild(childNode,0,123)

第一个参数是添加的节点;第二个参数是添加的Node的z轴的顺序(添加节点的时候会有顺序的,相当于绘制的时候的先后顺序);第三个参数是Tag/标签,可以理解成id,通过这个tag来操作node对象

附带第二个参数的英文介绍:

LocalZOrder is the 'key' used to sort the node relative to its siblings.

The Node's parent will sort all its children based on the LocalZOrder value. If two nodes have the same LocalZOrder,then the node that was added first to the children's array will be in front of the other node in the array.

Also,the Scene Graph is traversed using the "In-Order" tree traversal algorithm ( http://en.wikipedia.org/wiki/Tree_traversal#In-order ) And Nodes that have LocalZOrder values < 0 are the "left" subtree While Nodes with LocalZOrder >=0 are the "right" subtree.

addChild有4个方法

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)

查找子节点

Node* node = node->getChildByTag(123)

删除子节点

node->removeChildByTag(123,true)//第二个参数表示是否在内存中清除这个对象
node->removeChild(childNode)//直接删除节点
node->removeAllChildrenWithCleanup(true) //true-清除内存
node->removeFromParentAndCleanup(true) //true-清除内存

Node中重要的属性

Node两个非常重要的属性:
position和anchorPoint
position是指的位置,anchorPoint是指的锚点
位置(坐标)很好理解,就是比如放在(5,5),x=5,y=5.但是精灵图片是有大小的,这个时候就需要锚点了。
我们用图来理解吧
1.anchorPoint为(0.5,0.5),这个是默认值

第一个参数0.5,是锚点距离左边边线的距离和图片整个的宽度的比例,也就是1/2
第二个参数0.5,是锚点距离底边高度和整个高度的比值,也就是1/2

2.anchorPoint为(0,0),也就是精灵图片的左下角

3.anchorPoint为(1.0,1.0),也就是精灵图片的右上角

4.anchorPoint为(0.66,0.5),这个具有普遍性

游戏循环与调度

每一个游戏程序都有一个循环在不断运行,它是有导演对象来管理和维护。
如果需要场景中的精灵运动起来,我们可以在游戏循环中使用定时器(Scheduler)对精灵等对象的运行进行调度。
因为Node类封装了Scheduler类,所以我们也可以直接使用Node中调用函数。
Node中调用函数主要有:

void scheduleUpdate ( void )//开始游戏调度,每个Node对象只要调用该函数,那么这个Node对象就会定时地每帧回调用一次自己的update(float dt)函数,每帧调用一次update函数!这是固定的时间和函数 
//下面这个函数更加个性化,可以自定义回调函数和时间
void schedule ( SEL_SCHEDULE selector,float  interval )//与scheduleUpdate函数功能一样,不同的是我们可以指定回调函数(通过selector指定),也可以根据需要指定回调时间间隔
//一旦调度开始,就会不断循环

void unscheduleUpdate ( void )//停止update(float dt)函数调度 和scheduleUpdate对应
void unschedule ( SEL_SCHEDULE selector )//可以指定具体函数停止调度 和schedule对应

void unscheduleAllSelectors ( void )//可以停止所有调度

源代码下载地址:

GITHUB源码下载地址: 【点我进行下载】

本文章由[谙忆]编写, 所有权利保留。
欢迎转载,分享是进步的源泉。

转载请注明出处:http://chenhaoxiang.cn

本文源自【人生之旅_谙忆的博客】

【Cocos2d-x】开发基础-Node与Node层级架构的更多相关文章

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

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

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

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

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

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

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

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

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

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

  6. 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?

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

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

  8. 手把手教你swift项目集成cocos2dx-js模块

    前几天在swift项目中集成了Lua模块,使得在swift工程中用Lua写游戏逻辑成为了可能,具体工程及配置见手把手教你swift项目添加cocos2dx-lua,由于公司最近要把js做的小游戏集成到iOS原生应用中,于是我们将解锁另外一个场景,好了,下面开始;同样的,首先你得有一个swift项目我们从头开始,建立一个swift项目;我们默认你已经可以自己创建一个全新的swift项目了,这很简单,不是么?

  9. 泛型 – 符合Swift中Comparable的泛型类

    我正在尝试创建一个符合Comparable协议的简单通用节点类,以便我可以轻松地比较节点而无需访问其密钥.当我试图写

  10. swift3 – 将SceneKit对象放在SCNCamera当前方向的前面

    >生成SCNVector4,它定向节点,使其“面向”相机?但是让我有点失落.我看到了许多类似的问题,比如thisone,但没有答案.嘿,如果要将对象放在相对于另一个节点的某个位置,并且与参考节点的方向相同,则可以使用这个更简单的函数:如果您想将’node’2m放在某个’cameraNode’前面,你可以这样称呼:

随机推荐

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

返回
顶部