【Cocos2d-x】开发基础-Node与Node层级架构

简介: 【Cocos2d-x】开发基础-Node与Node层级架构

本篇博客讲解:

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,int localZOrder,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源码下载地址: 点我进行下载


目录
相关文章
|
15天前
|
API 持续交付 开发者
后端开发中的微服务架构实践与挑战
在数字化时代,后端服务的构建和管理变得日益复杂。本文将深入探讨微服务架构在后端开发中的应用,分析其在提高系统可扩展性、灵活性和可维护性方面的优势,同时讨论实施微服务时面临的挑战,如服务拆分、数据一致性和部署复杂性等。通过实际案例分析,本文旨在为开发者提供微服务架构的实用见解和解决策略。
|
28天前
|
Java 持续交付 微服务
后端开发中的微服务架构实践与挑战####
本文深入探讨了微服务架构在现代后端开发中的应用,通过具体案例分析,揭示了其如何助力企业应对业务复杂性、提升系统可维护性和可扩展性。文章首先概述了微服务的核心概念及其优势,随后详细阐述了实施微服务过程中的关键技术选型、服务拆分策略、容错机制以及持续集成/持续部署(CI/CD)的最佳实践。最后,通过一个真实世界的应用实例,展示了微服务架构在实际项目中的成功应用及其带来的显著成效。 ####
|
8天前
|
Web App开发 JavaScript 前端开发
深入浅出Node.js后端开发
【10月更文挑战第36天】本文将引导您探索Node.js的世界,通过实际案例揭示其背后的原理和实践方法。从基础的安装到高级的异步处理,我们将一起构建一个简单的后端服务,并讨论如何优化性能。无论您是新手还是有经验的开发者,这篇文章都将为您提供新的视角和深入的理解。
|
13天前
|
Web App开发 存储 JavaScript
深入浅出Node.js后端开发
【10月更文挑战第31天】本文将引导你进入Node.js的奇妙世界,探索其如何革新后端开发。通过浅显易懂的语言和实际代码示例,我们将一起学习Node.js的核心概念、搭建开发环境,以及实现一个简单但完整的Web应用。无论你是编程新手还是希望拓展技术的开发者,这篇文章都将为你打开一扇通往高效后端开发的大门。
|
9天前
|
监控 API 持续交付
后端开发中的微服务架构实践与挑战####
本文深入探讨了微服务架构在后端开发中的应用,分析了其优势、面临的挑战以及最佳实践策略。不同于传统的单体应用,微服务通过细粒度的服务划分促进了系统的可维护性、可扩展性和敏捷性。文章首先概述了微服务的核心概念及其与传统架构的区别,随后详细阐述了构建微服务时需考虑的关键技术要素,如服务发现、API网关、容器化部署及持续集成/持续部署(CI/CD)流程。此外,还讨论了微服务实施过程中常见的问题,如服务间通信复杂度增加、数据一致性保障等,并提供了相应的解决方案和优化建议。总之,本文旨在为开发者提供一份关于如何在现代后端系统中有效采用和优化微服务架构的实用指南。 ####
|
11天前
|
消息中间件 设计模式 运维
后端开发中的微服务架构实践与挑战####
本文深入探讨了微服务架构在现代后端开发中的应用,通过实际案例分析,揭示了其在提升系统灵活性、可扩展性及促进技术创新方面的显著优势。同时,文章也未回避微服务实施过程中面临的挑战,如服务间通信复杂性、数据一致性保障及部署运维难度增加等问题,并基于实践经验提出了一系列应对策略,为开发者在构建高效、稳定的微服务平台时提供有价值的参考。 ####
|
12天前
|
消息中间件 监控 数据管理
后端开发中的微服务架构实践与挑战####
【10月更文挑战第29天】 在当今快速发展的软件开发领域,微服务架构已成为构建高效、可扩展和易于维护应用程序的首选方案。本文探讨了微服务架构的核心概念、实施策略以及面临的主要挑战,旨在为开发者提供一份实用的指南,帮助他们在项目中成功应用微服务架构。通过具体案例分析,我们将深入了解如何克服服务划分、数据管理、通信机制等关键问题,以实现系统的高可用性和高性能。 --- ###
35 2
|
14天前
|
Web App开发 JavaScript 前端开发
深入浅出Node.js后端开发
【10月更文挑战第30天】本文将通过一个Node.js的简单示例,引导你进入Node.js的世界。我们将从基础概念讲起,然后一步步深入到代码实现,最后总结Node.js在后端开发中的优势和应用场景。无论你是前端开发者还是后端新手,这篇文章都将为你打开一扇了解Node.js的大门。
29 2
|
21天前
|
缓存 运维 监控
后端开发中的微服务架构实践与挑战#### 一、
【10月更文挑战第22天】 本文探讨了微服务架构在后端开发中的应用实践,深入剖析了其核心优势、常见挑战及应对策略。传统后端架构难以满足快速迭代与高可用性需求,而微服务通过服务拆分与独立部署,显著提升了系统的灵活性和可维护性。文章指出,实施微服务需关注服务划分的合理性、通信机制的选择及数据一致性等问题。以电商系统为例,详细阐述了微服务改造过程,包括用户、订单、商品等服务的拆分与交互。最终强调,微服务虽优势明显,但落地需谨慎规划,持续优化。 #### 二、
|
21天前
|
监控 安全 Serverless
"揭秘D2终端大会热点技术:Serverless架构最佳实践全解析,让你的开发效率翻倍,迈向技术新高峰!"
【10月更文挑战第23天】D2终端大会汇聚了众多前沿技术,其中Serverless架构备受瞩目。它让开发者无需关注服务器管理,专注于业务逻辑,提高开发效率。本文介绍了选择合适平台、设计合理函数架构、优化性能及安全监控的最佳实践,助力开发者充分挖掘Serverless潜力,推动技术发展。
51 1