***************************************转载请注明出处:http://blog.csdn.net/lttree********************************************

昨天写了个场景切换,折腾到半夜。。好困的说。。。

***************************

照旧,先来个文件夹:

1.前言

2.从代码观节点

3.实际应用Node类

***************************

1.前言

老样子,先来点干货

要说Node,当然,先上大菜——API

节点解释:节点是场景图的基本元素。场景图的基本元素必须是节点对象或者是节点对象的子类。

当中主要能够看到Layer、MenuItem、Scene、Sprite、TMXTiledMap(解析and渲染TMX地图)、ParticleSystem(粒子系统基类)等等

Node是这些类的根类

当中要注意,Node的这些子类都能够互相嵌套,Because:

一个节点的主要特点例如以下:

  • 他们能够包括其它的节点对象(addChildgetChildByTagremoveChild, etc)
  • 他们能够安排定期的回调(scheduleunschedule, etc)
  • 他们能够运行一些动作(runActionstopAction, etc)

第一条就说了,它能够包括其它节点的对象,所以,节点的子类都是能够互相嵌套的。

我们也能够发现,非常多类继承图中都能够看到Ref,

Ref何许人也,这么强大?

Ref类,事实上是3.0变动过来的类名,原来叫做CCObject,它实现了一套内存管理的机制,因此,cocos2d-x中全部类都是Ref的子类。

2.从代码观节点



详细在代码上,我们能够在程序里看,

进入到Scene的定义,能够看到:

<span style="font-family:Times New Roman;font-size:12px;">class CC_DLL Scene : public Node
{
public:
/** creates a new Scene object */
static Scene *create(); // Overrides
virtual Scene *getScene() override; using Node::addChild;
virtual std::string getDescription() const override; CC_CONSTRUCTOR_ACCESS:
Scene();
virtual ~Scene(); virtual bool init() override; protected:
friend class Node;
friend class ProtectedNode;
friend class SpriteBatchNode; private:
CC_DISALLOW_COPY_AND_ASSIGN(Scene); #if CC_USE_PHYSICS
public:
virtual void addChild(Node* child, int zOrder, int tag) override;
virtual void update(float delta) override;
inline PhysicsWorld* getPhysicsWorld() { return _physicsWorld; }
static Scene *createWithPhysics(); CC_CONSTRUCTOR_ACCESS:
bool initWithPhysics(); protected:
void addChildToPhysicsWorld(Node* child); PhysicsWorld* _physicsWorld;
#endif // CC_USE_PHYSICS
};</span>

首先,Scene是继承自Node的,所以场景也是一个节点,而场景比节点多了一个锚点。也能够看到里面有addChild、update、物理引擎,并且也有3.0最新添加的addChildToPhysicsWorld。

所以Scene是全部场景的根节点,是全部节点数的根节点,因此,我们画图的时候,要先创建一个场景,然后再往场景里面加一些其它的东西。以HelloWorldScene为例:

HelloWorldScene里面包括了

——Sprite(背景图片)

——Menu(菜单项)

——LabelTTF(文本层)

恩,接下来瞅瞅Layer,转到Layer的定义:

<span style="font-size:18px;font-family: Arial;"> </span><span style="font-family:Times New Roman;font-size:10px;">// Deprecated touch callbacks.
CC_DEPRECATED_ATTRIBUTE virtual bool ccTouchBegan(Touch *pTouch, Event *pEvent) final {CC_UNUSED_PARAM(pTouch); CC_UNUSED_PARAM(pEvent); return false;};
CC_DEPRECATED_ATTRIBUTE virtual void ccTouchMoved(Touch *pTouch, Event *pEvent) final {CC_UNUSED_PARAM(pTouch); CC_UNUSED_PARAM(pEvent);}
CC_DEPRECATED_ATTRIBUTE virtual void ccTouchEnded(Touch *pTouch, Event *pEvent) final {CC_UNUSED_PARAM(pTouch); CC_UNUSED_PARAM(pEvent);}
CC_DEPRECATED_ATTRIBUTE virtual void ccTouchCancelled(Touch *pTouch, Event *pEvent) final {CC_UNUSED_PARAM(pTouch); CC_UNUSED_PARAM(pEvent);} CC_DEPRECATED_ATTRIBUTE virtual void ccTouchesBegan(__Set *pTouches, Event *pEvent) final {CC_UNUSED_PARAM(pTouches); CC_UNUSED_PARAM(pEvent);}
CC_DEPRECATED_ATTRIBUTE virtual void ccTouchesMoved(__Set *pTouches, Event *pEvent) final {CC_UNUSED_PARAM(pTouches); CC_UNUSED_PARAM(pEvent);}
CC_DEPRECATED_ATTRIBUTE virtual void ccTouchesEnded(__Set *pTouches, Event *pEvent) final {CC_UNUSED_PARAM(pTouches); CC_UNUSED_PARAM(pEvent);}
CC_DEPRECATED_ATTRIBUTE virtual void ccTouchesCancelled(__Set *pTouches, Event *pEvent) final {CC_UNUSED_PARAM(pTouches); CC_UNUSED_PARAM(pEvent);}</span>

先看这几行,就能够发现,Layer比Node多了一些用户的交互,比方:用户的触摸(点击、滑动)消息和重力感应。

由以上两点,能够发现Node是一个非常重要的类。

转到Node的定义能够看到,它包括

——create 不用说了

——getDescription获取描写叙述

——setLocalZOrder(_setLocalZOrder)    设置Z轴,就是一个场景可能有多个图层,安排他们上下关系。

——setScale 缩放显示,后面有X就是缩放X轴,假设什么都没有就是总体缩放,參数浮点类型

——setPosition设置坐标

——setSkew设定扭曲,使用方法同Scale

——setAnchorPoint设定锚点,就是一幅画的图钉

——setVisible节点是否可见,并非不在内存中,而是需不须要绘制出来

——setRotation节点的旋转

——addChild加入子节点

——getChildByTag依据标记获取节点

——setParent设定节点的父节点

——removeChild移除节点

——setUsersData让节点绑定数据

——onEnter(onExit、resume、pause)节点的生命周期方法

——cleanup让节点全部动作停止

——visit通过递归遍历全部的节点

——runAction节点绑定一个动作

——update节点的更新方法

——convertToWorldSpace坐标系变换为世界坐标系

等等。。。好多好多。。。好累

上述有非常多是一系列的,仅仅举了一个样例,比方:

set表示设置,get表示获取

....X表示  对X轴操作,....Y  对Y轴操作,....Z  对Z轴操作。

综上所述吧,Node类包括的属性主要包括:

————画图and变换  属性

  • 位置(默认值:x=0,y=0)
  • 缩放(默认值:x=1,y=1)
  • 旋转(以角度为单位,按顺时针方向)(默认值:0)
  • 锚点(默认值:x=0,y=0)
  • 内容大小(默认值:width=0,heigh=0)
  • 可见性(默认值:true)

————子节点child(加入,移除,获取)

————执行动作(Action,ActionManager)

————生命周期(onEnter、onExit、resume、pause)

————节点数据(tag节点的标记,userData绑定数据)

————计划任务 Schedule

是不是清晰了非常多呢?

3.实际应用Node类

说了这么多,嘴都干了,来点实际应用吧

①我们来耍耍这些个位置,锚点

先新建一个项目,执行:

然后,我们改变一下,背景图层(sprite)的setposition为(0,0):

 // add "HelloWorld" splash screen"
auto sprite = Sprite::create("HelloWorld.png"); // position the sprite on the center of the screen
sprite->setPosition(0,0); // add the sprite as a child to this layer
this->addChild(sprite, 0);

这样,再次执行:

发现,图片到了左下角,为什么呢?

这就是锚点,之前我说过,锚点就相当于,一颗钉子,默认是在图片中央的。

所以,我们将场景放置在0,0,即将锚点对准坐标0,0。

所以,图片会在左下角,还记得原来是什么样子的吗?

sprite->setPosition(Point(visibleSize.width/2 + origin.x, visibleSize.height/2 + origin.y));

visibleSize是之前获取的屏幕大小:

Size visibleSize = Director::getInstance()->getVisibleSize();

原来坐标是放置在哪里呢?就是在屏幕中间,那什么是origin.x和origin.y?

Point origin = Director::getInstance()->getVisibleOrigin();

这个是用来获取可视化区域的起点坐标,目的就是适配,让在不同分辨率下都能在同一个相对位置。

那我们来调整一下锚点,是不是就不一样了呢?

将锚点设置为(0,0):

sprite->setAnchorPoint(Point(0,0));

执行一下:

图片的锚点在左下角,而放置位置是在屏幕中心,所以,位置关系是这个样子的。

②接下来,来试一试Node的动作属性

就来一个简单的动作吧,移动~

新建一个动作:

auto act=MoveTo::create(2,Point(0,0));

第一个參数是运行这个动作花费的时间,第二个參数,就是移动到哪个位置。

然后,让sprite运行这个动作:

sprite->runAction(act);

然后,执行一下~

当然,不止sprite能够,你的HelloWorld字也能够运行,仅仅要是Node的子类就能运行这个动作,

不信,不信你试试呀~

auto act=MoveTo::create(2,Point(0,0));
label->runAction(act);

OK,就是酱紫啦~

过两天就要出国一趟,去韩国旅旅游,要走10天,可能就不更新了

***************************************转载请注明出处:http://blog.csdn.net/lttree********************************************

cocos2d-x 3.0 画图节点——Node的更多相关文章

  1. Cocos2d-x 3.0final 终结者系列教程07-画图节点Node

    在Cocos2d-x中全部能看到的都是引擎调用底层图形库函数绘制完毕的. Cocos2d-x将屏幕全部要绘制的全部内容逻辑上保存到一个场景Scene中(尺寸通常会和屏幕大小一致) 而在Scene中又包 ...

  2. 高屋建瓴 cocos2d-x-3.0架构设计 Cocos2d (v.3.0) rendering pipeline roadmap(原文)

    Cocos2d (v.3.0) rendering pipeline roadmap Why (the vision) The way currently Cocos2d does rendering ...

  3. DOM 节点node

    DOM可以将任何HTML或XML文档描绘成一个有多层节点构成的结构,即在HTML中所有内容都是节点.文档节点是每个文档的根节点,文档节点有一个子节点,称为文档元素.每个文档只能有一个文档元素.在HTM ...

  4. Linux内存描述之内存节点node–Linux内存管理(二)

    日期 内核版本 架构 作者 GitHub CSDN 2016-06-14 Linux-4.7 X86 & arm gatieme LinuxDeviceDrivers Linux内存管理 #1 ...

  5. Longhorn 企业级云原生分布式容器存储-券(Volume)和节点(Node)

    内容来源于官方 Longhorn 1.1.2 英文技术手册. 系列 Longhorn 是什么? Longhorn 云原生分布式块存储解决方案设计架构和概念 Longhorn 企业级云原生容器存储解决方 ...

  6. Hadoop 2.2.0单节点的伪分布集成环境搭建

    Hadoop版本发展历史 第一代Hadoop被称为Hadoop 1.0 1)0.20.x 2)0.21.x 3)0.22.x 第二代Hadoop被称为Hadoop 2.0(HDFS Federatio ...

  7. error eslint@5.12.0: The engine "node" is incompatible with this module.

    初始化 react项目时报错: error eslint@5.12.0: The engine "node" is incompatible with this module. E ...

  8. Hadoop2.2.0多节点分布式安装及测试

    众所周知,hadoop在10月底release了最新版2.2.很多国内的技术同仁都马上在网络上推出了自己对新版hadoop的配置心得.这其中主要分为两类: 1.单节点配置 这个太简单了,简单到只要懂点 ...

  9. elasticsearch负载均衡节点——客户端节点 node.master: false node.data: false 其他配置和master 数据节点一样

    elasticSearch的配置文件中有2个参数:node.master和node.data.这两个参 数搭配使用时,能够帮助提供服务器性能. 数据节点node.master: false node. ...

随机推荐

  1. 注意在insert插入数据库时的int类型问题

    比如,一个语句,insert into mbProduct(p_UserID,p_BigID,p_qq)values("+getUserid+",'"+getdrpdl+ ...

  2. #define 和 typedef场合

    #define定义“可读”的常量以及一些宏语句的任务,而typedef则常用来定义关键字.冗长的类型的别名.

  3. 数据库SQLite在Qt5+VS2012使用规则总结---中文乱码

    VS2012默认格式为 "GB2312-80",而有时我们用到字符串需要显示中文时,就会出现乱码.下面仅就Qt5和VS2012中使用数据库SQLite时,做一个简单的备忘录 #in ...

  4. C++拾遗(八)类——概念、定义与实现

    Class与Struct 区别在于class默认访问类型是private,struct默认访问类型是public. 另外在使用习惯上,struct只用来表示纯粹的数据对象或没有私有部分的类. 类中的内 ...

  5. sql查询每门课程成绩最高的学生

    给出数据库(sco)如下图: 查出每门课程成绩最高的学生 select b.id,b.kemu,b.name,b.chengji from (select kemu,max(chengji) maxc ...

  6. php如何做数据库攻击

    PHP mysql_real_escape_string() 函数 PHP MySQL 函数 定义和用法 mysql_real_escape_string() 函数转义 SQL 语句中使用的字符串中的 ...

  7. C#数字图像处理的3种方法

    本文主要通过彩色图象灰度化来介绍C#处理数字图像的3种方法,Bitmap类.BitmapData类和Graphics类是C#处理图像的的3个重要的类. Bitmap只要用于处理由像素数据定义的图像的对 ...

  8. 怎么用visual studio2010编写c++程序|用visual studio2010编写c++程序的步骤

    如何通过visual studio 2010编写一个简单的c++程序,随小编不一起看看如何编写. 首先打开visual studio 2010 点击软件左上角“文件-新建-项目”,选择“win32-w ...

  9. 三种实现PHP伪静态页面的方法(转)

    PHP伪静态写法--其一 伪静态又名:URL重写 以下列举了三种方法. 方法一: 比如这个网页 http://www.2cto.com /soft.php/1,100,8630.html 其实处理的脚 ...

  10. python简介与基本操作

    一.python的历史 python的创始人Guido van Rossum,现就职于Dropbox公司. 1989年12月份诞生了python1.0 2000年10月16日发布了python2.0 ...