cocos2D(五岁以下儿童)---- CCNode
本将主要介绍下CCNode这个类。CCNode是全部节点的基类,当中包含我们经常使用的CCScene(场景)、CCLayer(图层)、CCSprite(精灵)等。它是一个不可以可视化显示的抽象类,仅仅是用来定义全部节点的公共属性和方法的。本讲纯粹是理论。
首先来看看CCNode的继承结构图,仅仅列举了经常使用的类
节点的处理
1.创建一个新的节点
- CCNode *node = [CCNode node];
2.加入子节点
- // 先创建子节点
- CCNode *childNode = [CCNode node];
- // 方法1:直接加入
- [node addChild:childNode];
- // 方法2:z决定了节点的绘制顺序,依照z值从小到大的顺序来绘制节点,即先绘制z值小的节点。再绘制z值大的节点
- // 假设多个节点拥有同样的z值,就依照加入它们的先后顺序进行绘制
- [node addChild:childNode z:0];
- // 方法3:tag的作用是给节点设置一个标记,父节点能够依据设置的tag标记找到相应的子节点
- [node addChild:childNode z:0 tag:100];
3.依据tag找到相应的子节点
- // 假设多个节点拥有同样的tag值,这种方法将返回最先匹配tag值的节点
- [node getChildByTag:100];
4.删除子节点
- // 方法1:将子节点childNode从父节点node中移除
- // "cleanup"设置为YES代表停止子节点执行的全部动作和消息调度
- [node removeChild:childNode cleanup:YES];
- // 方法2:依据tag值将相应的子节点从父节点node中移除
- [node removeChildByTag:100 cleanup:YES];
- // 方法3:移除node中的全部子节点
- [node removeAllChildrenWithCleanup:YES];
- // 方法4:将childNode从它的父节点中移除
- [childNode removeFromParentAndCleanup:YES];
5.又一次设置子节点的z值
- [node reorderChild:childNode z:1];
6.停止节点执行的全部动作和消息调度
- [node cleanup];
经常使用属性和方法
1.加入节点时设置的z值,决定了节点的绘制顺序
- @property(nonatomic,readonly) NSInteger zOrder;
2.节点的旋转角度,默认是0,大于0是顺时针旋转,小于0则是逆时针旋转。
子节点会继承父节点的这个属性
- @property(nonatomic,readwrite,assign) float rotation;
既然是旋转,肯定是绕着一个点进行旋转。到底是绕着哪个点旋转。取决于anchorPoint
3.节点X和Y方向的缩放比例。同一时候影响宽度和高度。子节点会继承父节点的这个属性
- @property(nonatomic,readwrite,assign) float scale;
既然是缩放,肯定是绕着一个点进行缩放,到底是绕着哪个点缩放,取决于anchorPoint
4.节点X方向(即宽度)的缩放比例。
子节点会继承父节点的这个属性
- @property(nonatomic,readwrite,assign) float scaleX;
5.节点Y方向(即高度)的缩放比例。
子节点会继承父节点的这个属性
- @property(nonatomic,readwrite,assign) float scaleY;
6.节点的大小(不受scale和rotation影响)
- @property (nonatomic,readwrite) CGSize contentSize
7.节点在父节点中的位置(以父节点左下角为(0, 0))
- @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
- @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为其它值,以此类推
以下绘图解释一下
- // 红色(red)是蓝色的子节点,所以是以蓝色的左下角位置为坐标原点(0, 0)。
如果蓝色的大小是100x100,红色的大小是50x50
- red.position = CGPointMake(50, 50); // 能够看出。(50, 50)是在蓝色的正中间
由于anchorPoint的不同,改变了红色在蓝色中的位置
2> anchorPoint对缩放的影响
我先做个总结:
* 假设anchorPoint = (0, 0),那么节点就会绕着自己的左下角进行缩放
* 假设anchorPoint = (0.5, 0.5),那么节点就会绕着自己的中点进行缩放
* 假设anchorPoint = (1, 1),那么节点就会绕着自己的右上角进行缩放
* anchorPoint为其它值,以此类推
以下绘图解释一下
- node.scale = 0.5f; // 宽高变为原来的1/2
蓝色代表缩放前,红色代表缩放后
3> anchorPoint对旋转的影响
我先做个总结:
* 假设anchorPoint = (0, 0),那么节点就会绕着自己的左下角进行旋转
* 假设anchorPoint = (0.5, 0.5)。那么节点就会绕着自己的中点进行旋转
* 假设anchorPoint = (1, 1),那么节点就会绕着自己的右上角进行旋转
* anchorPoint为其它值。以此类推
以下绘图解释一下
- node.rotation = 45; // 顺时针旋转45°
蓝色代表旋转前,红色代表旋转后
9.这个属性决定了anchorPoint是否要影响position
- @property(nonatomic,readwrite,assign) BOOL isRelativeAnchorPoint;
* 假设为YES。代表anchorPoint影响position。假设为NO,代表anchorPoint不影响position,那么节点的左下角就会在position属性指定的位置上
* 默认情况下,CCSprite的isRelativeAnchorPoint为YES,CCScene、CCLayer的isRelativeAnchorPoint为NO
10.父节点
- @property(nonatomic,readwrite,assign) CCNode* parent;
11.全部的子节点
- @property(nonatomic,readonly) CCArray *children;
12.是否可见
- @property(nonatomic,readwrite,assign) BOOL visible;
13.添加节点时设置的标记
- @property(nonatomic,readwrite,assign) NSInteger tag;
14.返回节点的边界(包括position和大小)
- - (CGRect) boundingBox;
动作的处理
动作是指在特定时间内完毕移动、缩放、旋转等操作的行为。
CCNode能够执行动作实现一些动画效果。
1.运行动作
- -(CCAction*) runAction: (CCAction*) action;
- // 初始化一个平移动作,这是向左边移动100的距离
- CCAction *action = [CCMoveBy actionWithDuration:2 position:CGPointMake(-100, 0)];
- // 能够给动作设置一个标记
- action.tag = 100;
- // 执行动作
- [node runAction:action];
当动作运行完成后,会自己主动从节点上删除
2.停止动作
停止节点上的全部动作
- -(void) stopAllActions;
停止某个特定的动作
- -(void) stopAction: (CCAction*) action;
依据tag停止相应的动作
- -(void) stopActionByTag:(NSInteger) tag;
3.依据tag获取相应的动作
- -(CCAction*) getActionByTag:(NSInteger) tag;
4.节点上当前包括的动作总数
- -(NSUInteger) numberOfRunningActions;
消息调度
节点能够进行消息调度,也就是指系统会每隔一段时间调用一次节点的某个方法。节点的消息调度是非经常常使用的,比方一个子弹射出去了。我们须要隔一段时间就调用子弹的某个方法来改变的子弹的位置
为了说明消息调度的使用方法。我定义一个子弹类。由于子弹是看得见的。所以应该继承CCSprite,而不是继承CCNode
- // Bullet.h
- #import "CCSprite.h"
- @interface Bullet : CCSprite
- @end
1.最简单的做法是直接调用节点的scheduleUpdate方法,就能够開始消息调度
- #import "Bullet.h"
- @implementation Bullet
- - (id)init {
- if (self = [super init]) {
- // 在节点初始化的时候開始消息调度
- [self scheduleUpdate];
- }
- return self;
- }
- - (void)update:(ccTime)delta {
- // 在这里改变子弹的位置
- // ....
- }
- @end
当调用了scheduleUpdate方法。系统会以每帧的频率调用一次update:方法(方法名和參数都是固定的),意思是每次刷帧都会调用一次。參数delta代表上次调用方法到如今所经过的时间
2.设置消息调度的优先级
- -(void) scheduleUpdateWithPriority:(NSInteger)priority;
优先级默觉得0,系统是依照优先级从低到高的顺序调用update:方法
以下举个样例:
- // 节点A
- [nodeA scheduleUpdate];
- // 节点B
- [nodeB scheduleUpdateWithPriority:-1];
- // 节点C
- [nodeC scheduleUpdateWithPriority:1];
节点A、B、C都须要以每帧的频率调用update:方法。可是有顺序之分:最先调用节点B的update:方法,由于节点B的优先级最低;然后调用节点A的update:方法。由于节点A为默认优先级0;最后调用节点C的update:。由于节点C的优先级最高
3.假设想在消息调度时调用另外一个方法。或者不想以每帧的频率调用该方法,应该採取以下这样的做法
- - (id)init {
- if (self = [super init]) {
- // 開始消息调度
- // [self schedule:@selector(changePosition:)]; // 以每帧的频率调用changePosition:方法
- [self schedule:@selector(changePosition:) interval:0.2f]; // 每隔0.2秒就调用changePosition:方法
- }
- return self;
- }
- - (void)changePosition:(ccTime)delta {
- // do something here
- }
4.取消消息调度
取消调用update:方法
- -(void) unscheduleUpdate;
取消调用特定的方法
- -(void) unschedule: (SEL) s;
取消调用全部的方法(包含update:)
- -(void) unscheduleAllSelectors;
cocos2D(五岁以下儿童)---- CCNode的更多相关文章
- (五岁以下儿童)NS3样本演示:桥模块演示样品csma-bridge.cc凝视程序
(五岁以下儿童)NS3:桥模块演示样品csma-bridge.cc凝视程序 1.Ns3 bridge模csma-bridge.cc演示示例程序的目光 // Network topology // // ...
- linux下一个Oracle11g RAC建立(五岁以下儿童)
linux下一个Oracle11g RAC建立(五岁以下儿童) 四.建立主机之间的信任关系(node1.node2) 建立节点之间oracle .grid 用户之间的信任(通过ssh 建立公钥和私钥) ...
- python学习笔记(五岁以下儿童)深深浅浅的副本复印件,文件和文件夹
python学习笔记(五岁以下儿童) 深拷贝-浅拷贝 浅拷贝就是对引用的拷贝(仅仅拷贝父对象) 深拷贝就是对对象的资源拷贝 普通的复制,仅仅是添加了一个指向同一个地址空间的"标签" ...
- PE文件结构(五岁以下儿童)基地搬迁
PE文件结构(五岁以下儿童) 參考 书:<加密与解密> 视频:小甲鱼 解密系列 视频 基址重定位 链接器生成一个PE文件时,它会如果程序被装入时使用的默认ImageBase基地址(VC默认 ...
- ExtJs4得知(五岁以下儿童)主要的Ext分类
Ext类是ExtJs最常见的.最基本的类,它是一个全局对象,它封装了全班.辛格尔顿和 Sencha 该方法提供了一种有用的库. 嵌套在该命名空间中一个较低的水平最用户界面组件. 但是提供了很多有用的功 ...
- Scrapy研究和探索(五岁以下儿童)——爬行自己主动多页(抢别人博客所有文章)
首先.在教程(二)(http://blog.csdn.net/u012150179/article/details/32911511)中,研究的是爬取单个网页的方法.在教程(三)(http://blo ...
- nagios二次开发(五岁以下儿童)---nagios和nagiosql关系
基于nagios和nagiosql理解.这将是这两个梳理比较粗糙的简单关系,有关详细信息,请参阅下面的图如: 从上面的关系图中能够看出,nagios与nagiosql共享了主机.主机组.服务 ...
- 开玩笑Web它servlet(五岁以下儿童)---- 如何解决servlet线程安全问题
servlet默认值是安全线的存在,但说白,servlet安全线实际上是一个多线程线程安全问题.因为servlet它正好是一个多线程的安全问题出现. 每次通过浏览器http同意提交请求,将一个实例se ...
- Lichee (五岁以下儿童) sysconfig1.fex 配置系统
sysconfig配置系统,作为一个通用的软件平台,还希望通过它.能够适应用户不同的方案.通过给出一个相应的配置.用户的方案就能够自己主动执行,而不须要改动系统里面的代码,或者又一次给出參数. 一. ...
随机推荐
- hadoop学习;大数据集在HDFS中存为单个文件;安装linux下eclipse出错解决;查看.class文件插件
sudo apt-get install eclipse 安装后打开eclipse,提示出错 An error has occurred. See the log file /home/pengeor ...
- SVN基于Maven的Web项目更新,本地过程详细解释
周围环境 MyEclipse:10.7 Maven:3.1.1 概要 最近在做项目,MyEclipse下载SVN基于上述Maven的Web问题,有时候搞了非常半天,Maven项目还是出现叉号,最后总结 ...
- Swift的属性,方法,下标脚本以及继承
从这篇章节起,Swift编程语言指南大部分的重要内容在于概念,代码并非太多.理解Swift的面向对象理念,语法以及类结构,构造析构过程对于非常好的应用Swift语言将会有比較大的帮助. 属性 存储属性 ...
- JavaWeb学习总结(一)JavaWeb开发入门
静态网页和动态网页 静态网页:在服务器上没有经过服务器解释执行的网页. 动态网页:在服务器上经过服务器解释执行的网页. 无论是静态网页还是动态网页,客户端看到的网页都是由HTML所构成的,所以Java ...
- Asp.Net2.0下C#环境 Login控件实现用户登录
原文:Asp.Net2.0下C#环境 Login控件实现用户登录 一.前台显示效果 二.前台代码 <asp:Login ID="Login1" run ...
- Yii/Yii2:查询返回以某特定列为索引(键)的数组
在Yii1.x中,要想查询语句返回以特定列为键(key)的数组数据,代码例如以下(下述样例以表主键为返回数组索引): $users = User::model()->findAll(array( ...
- VS2015配置Andriod开发环境
原文:VS2015配置Andriod开发环境 折腾了好久终于配置OK了,分享给大家! 第一步: http://xamarin.com/download下载XamarinInstaller 第二步: 运 ...
- Oracle Data Provider for .NET 的使用经验
原文:Oracle Data Provider for .NET 的使用经验 Oracle Data Provider for .NET 是Oracle提供的基于Ado.net接口的一个开发包. ...
- NET MVC异常处理模块
一个简单的ASP.NET MVC异常处理模块 一.前言 异常处理是每个系统必不可少的一个重要部分,它可以让我们的程序在发生错误时友好地提示.记录错误信息,更重要的是不破坏正常的数据和影响系统运行. ...
- fscanf()功能具体解释
一旦文件被解析常规时间或使用正则表达式.或者是敲自己太傻代码来解析一个普通文件. 今天突然发现c该图书馆有一个现成的文件可以解析常规功能,这是fscanf()功能.哎 曾经自己做了这么多无用功.在这里 ...