本将主要介绍下CCNode这个类,CCNode是所有节点的基类,其中包括我们常用的CCScene(场景)、CCLayer(图层)、CCSprite(精灵)等,它是一个不能够可视化显示的抽象类,只是用来定义所有节点的公共属性和方法的。本讲纯粹是理论。

首先来看看CCNode的继承结构图,只列举了常用的类

节点的处理

1.创建一个新的节点

  1. CCNode *node = [CCNode node];

2.添加子节点

  1. // 先创建子节点
  2. CCNode *childNode = [CCNode node];
  3. // 方法1:直接添加
  4. [node addChild:childNode];
  5. // 方法2:z决定了节点的绘制顺序,按照z值从小到大的顺序来绘制节点,即先绘制z值小的节点,再绘制z值大的节点
  6. // 如果多个节点拥有相同的z值,就按照添加它们的先后顺序进行绘制
  7. [node addChild:childNode z:0];
  8. // 方法3:tag的作用是给节点设置一个标记,父节点可以根据设置的tag标记找到对应的子节点
  9. [node addChild:childNode z:0 tag:100];

3.根据tag找到对应的子节点

  1. // 如果多个节点拥有相同的tag值,这个方法将返回最先匹配tag值的节点
  2. [node getChildByTag:100];

4.删除子节点

  1. // 方法1:将子节点childNode从父节点node中移除
  2. // "cleanup"设置为YES代表停止子节点运行的所有动作和消息调度
  3. [node removeChild:childNode cleanup:YES];
  4. // 方法2:根据tag值将对应的子节点从父节点node中移除
  5. [node removeChildByTag:100 cleanup:YES];
  6. // 方法3:移除node中的所有子节点
  7. [node removeAllChildrenWithCleanup:YES];
  8. // 方法4:将childNode从它的父节点中移除
  9. [childNode removeFromParentAndCleanup:YES];

5.重新设置子节点的z值

  1. [node reorderChild:childNode z:1];

6.停止节点运行的所有动作和消息调度

  1. [node cleanup];

常用属性和方法

1.添加节点时设置的z值,决定了节点的绘制顺序

  1. @property(nonatomic,readonly) NSInteger zOrder;

2.节点的旋转角度,默认是0,大于0是顺时针旋转,小于0则是逆时针旋转。子节点会继承父节点的这个属性

  1. @property(nonatomic,readwrite,assign) float rotation;

既然是旋转,肯定是绕着一个点进行旋转,究竟是绕着哪个点旋转,取决于anchorPoint

3.节点X和Y方向的缩放比例,同时影响宽度和高度。子节点会继承父节点的这个属性

  1. @property(nonatomic,readwrite,assign) float scale;

既然是缩放,肯定是绕着一个点进行缩放,究竟是绕着哪个点缩放,取决于anchorPoint

4.节点X方向(即宽度)的缩放比例。子节点会继承父节点的这个属性

  1. @property(nonatomic,readwrite,assign) float scaleX;

5.节点Y方向(即高度)的缩放比例。子节点会继承父节点的这个属性

  1. @property(nonatomic,readwrite,assign) float scaleY;

6.节点的大小(不受scale和rotation影响)

  1. @property (nonatomic,readwrite) CGSize contentSize

7.节点在父节点中的位置(以父节点左下角为(0, 0))

  1. @property(nonatomic,readwrite,assign) CGPoint position;

cocos2d的坐标系:(0,0)在屏幕的左下角,x值向右正向延伸,y值向上正向延伸.

winSize代表屏幕的尺寸

认真思考一下,不难发现,其实position的含义还是很模糊的。

假设一个节点的大小是20x20,则包含了400个点,那么在400个点中究竟是哪个点在position属性指定的位置上呢?

这个就取决于anchorPoint和isRelativeAnchorPoint属性,如果isRelativeAnchorPoint为NO,节点的左下角会在position属性指定的位置上;如果isRelativeAnchorPoint为YES,position的含义还会受anchorPoint的影响

8.可以称之为"定位点",这个anchorPoint影响的东西很多,比如节点position的含义、节点绕着哪个点进行缩放或旋转,anchorPoint的x、y取值范围都是0到1

  1. @property(nonatomic,readwrite) CGPoint anchorPoint;

默认情况下,CCSprite、CClayer、CCScene的anchorPoint都为(0.5, 0.5),即默认情况下它们的定位点都是自己的中心点。

下面我分别详细描述下anchorPoint对position、缩放、旋转的影响

1> anchorPoint对position的影响

anchorPoint要对position造成影响,前提条件是isRelativeAnchorPoint为YES

我先做个总结:

* 如果anchorPoint = (0, 0),那么节点的左下角就会在position属性指定的位置上

* 如果anchorPoint = (0.5, 0.5),那么节点的中心点就会在position属性指定的位置上

* 如果anchorPoint = (1, 1),那么节点的右上角就会在position属性指定的位置上

* anchorPoint为其他值,以此类推

下面画图解释一下

  1. // 红色(red)是蓝色的子节点,所以是以蓝色的左下角位置为坐标原点(0, 0)。假设蓝色的大小是100x100,红色的大小是50x50
  2. red.position = CGPointMake(50, 50); // 可以看出,(50, 50)是在蓝色的正中间

由于anchorPoint的不同,改变了红色在蓝色中的位置

2> anchorPoint对缩放的影响

我先做个总结:

* 如果anchorPoint = (0, 0),那么节点就会绕着自己的左下角进行缩放

* 如果anchorPoint = (0.5, 0.5),那么节点就会绕着自己的中点进行缩放

* 如果anchorPoint = (1, 1),那么节点就会绕着自己的右上角进行缩放

* anchorPoint为其他值,以此类推

下面画图解释一下

  1. node.scale = 0.5f; // 宽高变为原来的1/2

蓝色代表缩放前,红色代表缩放后

3> anchorPoint对旋转的影响

我先做个总结:

* 如果anchorPoint = (0, 0),那么节点就会绕着自己的左下角进行旋转

* 如果anchorPoint = (0.5, 0.5),那么节点就会绕着自己的中点进行旋转

* 如果anchorPoint = (1, 1),那么节点就会绕着自己的右上角进行旋转

* anchorPoint为其他值,以此类推

下面画图解释一下

  1. node.rotation = 45; // 顺时针旋转45°

蓝色代表旋转前,红色代表旋转后

9.这个属性决定了anchorPoint是否要影响position

  1. @property(nonatomic,readwrite,assign) BOOL isRelativeAnchorPoint;

* 如果为YES,代表anchorPoint影响position;如果为NO,代表anchorPoint不影响position,那么节点的左下角就会在position属性指定的位置上

* 默认情况下,CCSprite的isRelativeAnchorPoint为YES,CCScene、CCLayer的isRelativeAnchorPoint为NO

10.父节点

  1. @property(nonatomic,readwrite,assign) CCNode* parent;

11.所有的子节点

  1. @property(nonatomic,readonly) CCArray *children;

12.是否可见

  1. @property(nonatomic,readwrite,assign) BOOL visible;

13.添加节点时设置的标记

  1. @property(nonatomic,readwrite,assign) NSInteger tag;

14.返回节点的边界(包含position和大小)

  1. - (CGRect) boundingBox;

动作的处理

动作是指在特定时间内完成移动、缩放、旋转等操作的行为。CCNode可以运行动作实现一些动画效果。

1.运行动作

  1. -(CCAction*) runAction: (CCAction*) action;
  1. // 初始化一个平移动作,这是向左边移动100的距离
  2. CCAction *action = [CCMoveBy actionWithDuration:2 position:CGPointMake(-100, 0)];
  3. // 可以给动作设置一个标记
  4. action.tag = 100;
  5. // 运行动作
  6. [node runAction:action];

当动作执行完毕后,会自动从节点上删除

2.停止动作

停止节点上的所有动作

  1. -(void) stopAllActions;

停止某个特定的动作

  1. -(void) stopAction: (CCAction*) action;

根据tag停止对应的动作

  1. -(void) stopActionByTag:(NSInteger) tag;

3.根据tag获取对应的动作

  1. -(CCAction*) getActionByTag:(NSInteger) tag;

4.节点上当前包含的动作总数

  1. -(NSUInteger) numberOfRunningActions;

消息调度

节点可以进行消息调度,也就是指系统会每隔一段时间调用一次节点的某个方法。节点的消息调度是很常用的,比如一个子弹射出去了,我们需要隔一段时间就调用子弹的某个方法来改变的子弹的位置

为了说明消息调度的用法,我定义一个子弹类,因为子弹是看得见的,所以应该继承CCSprite,而不是继承CCNode

  1. // Bullet.h
  2. #import "CCSprite.h"
  3. @interface Bullet : CCSprite
  4. @end

1.最简单的做法是直接调用节点的scheduleUpdate方法,就可以开始消息调度

  1. #import "Bullet.h"
  2. @implementation Bullet
  3. - (id)init {
  4. if (self = [super init]) {
  5. // 在节点初始化的时候开始消息调度
  6. [self scheduleUpdate];
  7. }
  8. return self;
  9. }
  10. - (void)update:(ccTime)delta {
  11. // 在这里改变子弹的位置
  12. // ....
  13. }
  14. @end

当调用了scheduleUpdate方法,系统会以每帧的频率调用一次update:方法(方法名和参数都是固定的),意思是每次刷帧都会调用一次。参数delta代表上次调用方法到现在所经过的时间

2.设置消息调度的优先级

  1. -(void) scheduleUpdateWithPriority:(NSInteger)priority;

优先级默认为0,系统是按照优先级从低到高的顺序调用update:方法

下面举个例子:

  1. // 节点A
  2. [nodeA scheduleUpdate];
  3. // 节点B
  4. [nodeB scheduleUpdateWithPriority:-1];
  5. // 节点C
  6. [nodeC scheduleUpdateWithPriority:1];

节点A、B、C都需要以每帧的频率调用update:方法,但是有顺序之分:最先调用节点B的update:方法,因为节点B的优先级最低;然后调用节点A的update:方法,因为节点A为默认优先级0;最后调用节点C的update:,因为节点C的优先级最高

3.如果想在消息调度时调用另外一个方法,或者不想以每帧的频率调用该方法,应该采取下面这种做法

  1. - (id)init {
  2. if (self = [super init]) {
  3. // 开始消息调度
  4. // [self schedule:@selector(changePosition:)];  // 以每帧的频率调用changePosition:方法
  5. [self schedule:@selector(changePosition:) interval:0.2f]; // 每隔0.2秒就调用changePosition:方法
  6. }
  7. return self;
  8. }
  9. - (void)changePosition:(ccTime)delta {
  10. // do something here
  11. }

4.取消消息调度

取消调用update:方法

  1. -(void) unscheduleUpdate;

取消调用特定的方法

  1. -(void) unschedule: (SEL) s;

取消调用所有的方法(包括update:)

    1. -(void) unscheduleAllSelectors;

五、CCNode的更多相关文章

  1. cocos2D(五岁以下儿童)---- CCNode

    本将主要介绍下CCNode这个类.CCNode是全部节点的基类,当中包含我们经常使用的CCScene(场景).CCLayer(图层).CCSprite(精灵)等.它是一个不可以可视化显示的抽象类,仅仅 ...

  2. 传智播客C++第五期培训视频教程免费下载

    C/C++的应用领域几乎无处不在,服务器,嵌入式,物联网,移动互联网,信息安全,游戏,基本上大小通吃.C/C++市场份额高达26%,也就是每四个程序员就有一个C/C++程序员.市场需求量非常大,而且工 ...

  3. 《Django By Example》第五章 中文 翻译 (个人学习,渣翻)

    书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者@ucag注:大家好,我是新来的翻译, ...

  4. 旺财速啃H5框架之Bootstrap(五)

    在上一篇<<旺财速啃H5框架之Bootstrap(四)>>做了基本的框架,<<旺财速啃H5框架之Bootstrap(二)>>篇里也大体认识了bootst ...

  5. 移动站应该尝试百度MIP的五个原因

    MIP是什么?MIP是百度在2016年提出的移动网页加速器项目. MIP能做什么?MIP能帮助站长和网站开发者快速搭建移动端页面. MIP怎么加速?MIP从前端渲染和页面网络传输两方面进行优化,杜绝页 ...

  6. 如何一步一步用DDD设计一个电商网站(五)—— 停下脚步,重新出发

    阅读目录 前言 单元测试 纠正错误,重新出发 结语 一.前言 实际编码已经写了2篇了,在这过程中非常感谢有听到观点不同的声音,借着这个契机,今天这篇就把大家提出的建议一个个的过一遍,重新整理,重新出发 ...

  7. MVVM模式解析和在WPF中的实现(五)View和ViewModel的通信

    MVVM模式解析和在WPF中的实现(五) View和ViewModel的通信 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 M ...

  8. 【原】AFNetworking源码阅读(五)

    [原]AFNetworking源码阅读(五) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇中提及到了Multipart Request的构建方法- [AFHTTP ...

  9. JavaScript常见的五种数组去重的方式

    ▓▓▓▓▓▓ 大致介绍 JavaScript的数组去重问题在许多面试中都会遇到,现在做个总结 先来建立一个数组 var arr = [1,2,3,3,2,'我','我',34,'我的',NaN,NaN ...

随机推荐

  1. struts2视频学习笔记 15-17 (访问或添加request属性,文件上传)

    课时15 访问或添加request/session/application属性 1.简单说 page指当前页面.在一个jsp页面里有效 2.request 指从http请求到服务器处理结束,返回响应的 ...

  2. jQuery制作瀑布流(转)

    “瀑布流布局”随着pinterest网的流行而出名,现在国内使用这种风格布局的网站也越来越多,比如说Mark之,蘑菇街,点点网,哇哦等等.我第一次听到这个布局名称是来自于“乔花写的<瀑布流布局浅 ...

  3. windows系统下Tomcat与Apache服务器集成

    说明:此文是看书真实试验成功的,书中提到了不同版本不兼容的问题,但是很荣幸我没碰到,此例可供参考. 本文假设你已经有了java环境和tomcat,你已经熟悉tomcat的应用. Jdk 1.7.0_5 ...

  4. FZU 1911 Construct a Matrix

    题目链接:Construct a Matrix 题意:构造一个矩阵,要求矩阵的每行每列的和都不相同.矩阵的边长是前n项斐波那契的和. 思路:由sn = 2*(fn-1)+(fn-2)-1,只要知道第n ...

  5. ASP.NET MVC 上传大文件时404

    前一段时间会员的上传组件改用FLASH的swfupload来上传,既能很友好的显示上传进度,又能完全满足大文件的上传. 后来服务器升级到windows 2008,改为IIS7后,上传文件一旦超过30M ...

  6. mysqldump使用语法

    复制代码 代码如下: mysqldump -u user -p db tab1 tab2 > db.sql   恢复 复制代码 代码如下: mysql -u user -p db < db ...

  7. js基础之事件

    一.event对象 document.onclick=function(ev){ oEvent=event?event:ev;//兼容性写法 alert(oEvent.clientX); alert( ...

  8. jmeter之json数据参数化 断言等

    在 http Load Testing 中,json 数据的提交是个让人头疼的问题.本文详细介绍如何进行 JMeter 的 json 测试提交,以及如何将其参数化.Step 1 http json 请 ...

  9. IBatis.net动态SQL语句(六)

    在学习动态SQL语句之前,首先必须对条件查询有一定了解,先来学习如何向IBatis.Net的映射文件里传入参数. 一.条件查询 1.传递单个参数 如根据Id查询: <select id=&quo ...

  10. 内工大acm校赛--整理代码

    题目:小明搜到一行无缩进无换行代码,请帮小明整理代码.无for语句和case语句,而且只有一个主函数.你只要控制注意“:”“{”“}”这三个符号带来的缩进和换行效果就行. Input: 输入只有一行, ...