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


目录
相关文章
|
2月前
|
消息中间件 API 持续交付
后端开发中的微服务架构实践####
【10月更文挑战第21天】 本文深入探讨了微服务架构在后端开发中的应用,从基本概念出发,详细阐述了微服务的核心优势、设计原则及关键技术。通过实际案例分析,揭示了微服务如何助力企业应对复杂业务需求,提升系统的可扩展性、灵活性与可靠性。同时,也指出了实施微服务过程中可能面临的挑战,并提供了相应的解决方案和最佳实践。 ####
35 3
|
2月前
|
Web App开发 JavaScript 前端开发
Node.js 是一种基于 Chrome V8 引擎的后端开发技术,以其高效、灵活著称。本文将介绍 Node.js 的基础概念
Node.js 是一种基于 Chrome V8 引擎的后端开发技术,以其高效、灵活著称。本文将介绍 Node.js 的基础概念,包括事件驱动、单线程模型和模块系统;探讨其安装配置、核心模块使用、实战应用如搭建 Web 服务器、文件操作及实时通信;分析项目结构与开发流程,讨论其优势与挑战,并通过案例展示 Node.js 在实际项目中的应用,旨在帮助开发者更好地掌握这一强大工具。
51 1
|
18天前
|
机器学习/深度学习 前端开发 算法
婚恋交友系统平台 相亲交友平台系统 婚恋交友系统APP 婚恋系统源码 婚恋交友平台开发流程 婚恋交友系统架构设计 婚恋交友系统前端/后端开发 婚恋交友系统匹配推荐算法优化
婚恋交友系统平台通过线上互动帮助单身男女找到合适伴侣,提供用户注册、个人资料填写、匹配推荐、实时聊天、社区互动等功能。开发流程包括需求分析、技术选型、系统架构设计、功能实现、测试优化和上线运维。匹配推荐算法优化是核心,通过用户行为数据分析和机器学习提高匹配准确性。
58 3
|
16天前
|
前端开发 搜索推荐 安全
陪玩系统架构设计陪玩系统前后端开发,陪玩前端设计是如何让人眼前一亮的?
陪玩系统的架构设计、前后端开发及前端设计是构建吸引用户、功能完善的平台关键。架构需考虑用户需求、技术选型、安全性等,确保稳定性和扩展性。前端可选用React、Vue或Uniapp,后端用Spring Boot或Django,数据库结合MySQL和MongoDB。功能涵盖用户管理、陪玩者管理、订单处理、智能匹配与通讯。安全性方面采用SSL加密和定期漏洞扫描。前端设计注重美观、易用及个性化推荐,提升用户体验和平台粘性。
48 0
|
1月前
|
Web App开发 JavaScript 前端开发
Node.js开发
Node.js开发
47 13
|
1月前
|
运维 监控 Java
后端开发中的微服务架构实践与挑战####
在数字化转型加速的今天,微服务架构凭借其高度的灵活性、可扩展性和可维护性,成为众多企业后端系统构建的首选方案。本文深入探讨了微服务架构的核心概念、实施步骤、关键技术考量以及面临的主要挑战,旨在为开发者提供一份实用的实践指南。通过案例分析,揭示微服务在实际项目中的应用效果,并针对常见问题提出解决策略,帮助读者更好地理解和应对微服务架构带来的复杂性与机遇。 ####
|
1月前
|
消息中间件 运维 安全
后端开发中的微服务架构实践与挑战####
在数字化转型的浪潮中,微服务架构凭借其高度的灵活性和可扩展性,成为众多企业重构后端系统的首选方案。本文将深入探讨微服务的核心概念、设计原则、关键技术选型及在实际项目实施过程中面临的挑战与解决方案,旨在为开发者提供一套实用的微服务架构落地指南。我们将从理论框架出发,逐步深入至技术细节,最终通过案例分析,揭示如何在复杂业务场景下有效应用微服务,提升系统的整体性能与稳定性。 ####
41 1
|
2月前
|
监控 Serverless 云计算
探索Serverless架构:开发实践与优化策略
本文深入探讨了Serverless架构的核心概念、开发实践及优化策略。Serverless让开发者无需管理服务器即可运行代码,具有成本效益、高可扩展性和提升开发效率等优势。文章还详细介绍了函数设计、安全性、监控及性能和成本优化的最佳实践。
|
1月前
|
消息中间件 运维 API
后端开发中的微服务架构实践####
本文深入探讨了微服务架构在后端开发中的应用,从其定义、优势到实际案例分析,全面解析了如何有效实施微服务以提升系统的可维护性、扩展性和灵活性。不同于传统摘要的概述性质,本摘要旨在激发读者对微服务架构深度探索的兴趣,通过提出问题而非直接给出答案的方式,引导读者深入
45 1
|
1月前
|
负载均衡 监控 API
后端开发中的微服务架构实践与挑战
本文深入探讨了微服务架构在后端开发中的应用,分析了其优势和面临的挑战,并通过案例分析提出了相应的解决策略。微服务架构以其高度的可扩展性和灵活性,成为现代软件开发的重要趋势。然而,它同时也带来了服务间通信、数据一致性等问题。通过实际案例的剖析,本文旨在为开发者提供有效的微服务实施指导,以优化系统性能和用户体验。