cocos2d-x 3.0 绘图节点——Node

***************************************转载请注明出处: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

时间: 2024-11-05 19:39:47

cocos2d-x 3.0 绘图节点——Node的相关文章

cocos2d-x 3.0 画图节点——Node

***************************************转载请注明出处:http://blog.csdn.net/lttree******************************************** 昨天写了个场景切换,折腾到半夜..好困的说... *************************** 照旧,先来个文件夹: 1.前言 2.从代码观节点 3.实际应用Node类 *************************** 1.前言 老样子,先来点干

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

在Cocos2d-x中所有能看到的都是引擎调用底层图形库函数绘制完成的, Cocos2d-x将屏幕所有要绘制的所有内容逻辑上保存到一个场景Scene中(尺寸一般会和屏幕大小一致) 而在Scene中又包含了多个图层Layer,每个图层都是一个绘图节点Node. 所以可以理解为所有能在屏幕上显示的对象都是Node类的实例,或Node的子类对象 继承关系是这样的 Node------Scene -------Layer -------Sprite ....... Scene,Layer,Sprite,

高屋建瓴 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 is good but it is beginning to feel somehow antiquate and moreover it doesn't actually leverage modern multi core CPUs so popular nowadays on most mo

Cocos2d-x 3.0final 终结者系列教程09-绘图节点Node中的Schedule

如何让HelloWorld项目中的HelloWorld文字实现自动运动呢? 有的童鞋会想到使用线程,不断修改Label的Position, 这样不行,因为在Cocos2d-x中只能在主线程中来修改Node中的信息,这是由于所有的node都是非线程安全的,如果我们的场景移除了node 在子线程种可能引用错误,所以,要让Node执行特定的变化,需要在当前的Node中使用Schedule 使用方法很简单 1.在当前的HelloWorldScne.h中添加一个方法在HelloWorldScene 如:

Cocos2d-x 3.0final 终结者系列教程10-绘图节点Node中的Action

Action是作用在Node上的逻辑处理,比如让Node移动.旋转.缩放.变色.跳跃.翻转.透明等等,都有相对应的Action Action如何在Node上使用 1.定义Action对象 如 auto act=MoveTo::create(Point(30,0),1); 2.在Node上执行runAction auto sp=Sprite::create("npc.png"); sp->runAction(act); 这样就实现了在sp这个Node上执行移动到30,0这个坐标的动

Cocos2d-x 3.0final 终结者系列教程08-绘图节点Node中的锚点和坐标系

图片问答,(只要回答正确,锚点和坐标系就学会了) 1.下图一共有几个填充为淡黄色的实心矩形? 选择:A,2个  B, 4个 C,1个 D,16个 答案,B,4个 2.下图的4个实心矩形排列在几行几列? 选择:A,1行1列 B,2行2列 答案,B 3.在每个实心矩形外侧都代表了屏幕,并标记了屏幕坐标系,和OpengGL坐标系,请问以下回答哪个正确? A,下图第一列是屏幕坐标系,左上角为0,0点,第二列是OpenGL坐标系,左下角为(0,0)点 B,    文章喜欢马伊琍 C,   黄海波是被陷害的

元素Element与节点Node的区别、联系

1. 节点包括:元素节点.属性节点.文本节点等,所以元素Element只是节点Node的一个子项. 2. 元素包含属性.内容. 3. 元素一定是节点,但节点不一定是元素,它还可能是属性节点和文本节点等. var elementNode = document.getElementById('div1'); // 元素节点 var attrNode = document.getElementById('div1').getAttributeNode('name'); // 属性节点 var text

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

众所周知,hadoop在10月底release了最新版2.2.很多国内的技术同仁都马上在网络上推出了自己对新版hadoop的配置心得.这其中主要分为两类: 1.单节点配置 这个太简单了,简单到只要懂点英语,照着网上说的做就ok了.我这里不谈这个,有兴趣的童鞋可以自己去问度娘和谷哥- 2.多节点配置 这个就是我要重点说明的,老实说网络上说的的确是多节点,但不是真正的分布式部署- 我们为什么要用hadoop?因为hadoop是一个分布式系统基础架构,我们可以在不了解分布式底层细节的情况下,开发分布式

SDNU 1089.拓扑排序【找入度为0的节点 拓扑排序】

1089.拓扑排序 Description 给定一个有向图,若图无环,则将其进行拓扑排序并输出,否则输出IMPOSABLE. Input 第一行为两个整数n(1<=n<=1000).m(1<=m<=100000): 之后m行,每行两个整数a.b表示一条从a到b的有向边. Output 若存在环,输出IMPOSABLE,否则输出一行用一个空格隔开的拓扑排序的结果,若存在多个结果,输出字典序最小的. Sample Input 5 4 1 2 2 3 3 4 4 5 Sample Out