默认情况下,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);
由于anchorPoint的不同,改变了红色在蓝色中的位置
2> anchorPoint对缩放的影响
我先做个总结:
* 如果anchorPoint = (0,0),那么节点就会绕着自己的左下角进行缩放
* 如果anchorPoint = (0.5,0.5),那么节点就会绕着自己的中点进行缩放
* 如果anchorPoint = (1,1),那么节点就会绕着自己的右上角进行缩放
* anchorPoint为其他值,以此类推
下面画图解释一下
node.scale=0.5f;
蓝色代表缩放前,红色代表缩放后
3> anchorPoint对旋转的影响
我先做个总结:
* 如果anchorPoint = (0,0),那么节点就会绕着自己的左下角进行旋转
* 如果anchorPoint = (0.5,0.5),那么节点就会绕着自己的中点进行旋转
* 如果anchorPoint = (1,1),那么节点就会绕着自己的右上角进行旋转
* anchorPoint为其他值,以此类推
下面画图解释一下
node.rotation=45;
蓝色代表旋转前,红色代表旋转后
9.这个属性决定了anchorPoint是否要影响position
* 如果为YES,代表anchorPoint影响position;如果为NO,代表anchorPoint不影响position,那么节点的左下角就会在position属性指定的位置上
* 默认情况下,CCSprite的isRelativeAnchorPoint为YES,CCScene、CCLayer的isRelativeAnchorPoint为NO
10.父节点
11.所有的
子节点
12.是否
可见
13.添
加节点时设置的标记
14.返回节点的边界(包含position和大小)
-(CGRect)boundingBox;
动作的处理
动作是指在特定时间内完成移动、缩放、旋转等操作的行为。CCNode可以运行动作实现一些动画效果。
1.运行动作
-(CCAction*)runAction:(CCAction*)action;
//初始化一个平移动作,这是向左边移动100的距离
- CCAction*action=[CCMoveByactionWithDuration:2position:CGPointMake(-100,0); background-color:inherit">0)];
- //可以给动作设置一个标记
- action.tag=100;
- //运行动作
- [noderunAction: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"
- @interfaceBullet:CCSprite
- @end
1.最简单的做法是直接调用节点的scheduleUpdate方法,就可以开始消息调度
#import"Bullet.h"
- @implementationBullet
- -(id)init{
- if(self=[superinit]){
- //在节点初始化的时候开始消息调度
- [selfscheduleUpdate];
- }
- returnself;
- -(void)update:(ccTime)delta{
- //在这里改变子弹的位置
- //....
- @end
当
调用了scheduleUpdate方法,系统会以每帧的频率调用一次update:方法(方法名和参数都是固定的),意思是每次刷帧都会调用一次。参数delta代表上次调用方法到现在所经过的时间
2.设置消息调度的优先级
void)scheduleUpdateWithPriority:(NSInteger)priority;
优先
级默认为0,系统是按照优先级从低到高的顺序调用update:方
法
下面举个例子:
//节点A
- [nodeAscheduleUpdate];
- //节点B
- [nodeBscheduleUpdateWithPriority:-1];
- //节点C
- [nodeCscheduleUpdateWithPriority:1];
节点A、B、C都需要以每帧的频率调用update:方法,但是有顺序之分:最先调用节点B的update:方法,因为节点B的优先级最低;然后调用节点A的update:方法,因为节点A为默认优先级0;最后调用节点C的update:,因为节点C的优先级最高
3.如果想在消息调度时调用另外一个方法,或者不想以每帧的频率调用该方法,应该采取下面这种做法
-(id)init{
- superinit]){
- //开始消息调度
- //[selfschedule:@selector(changePosition:)];//以每帧的频率调用changePosition:方法
- [selfschedule:@selector(changePosition:)interval:0.2f];
- void)changePosition:(ccTime)delta{
- //dosomethinghere
- }
4.取消消息调度
取消调用update:方法
void)unscheduleUpdate;
取消调用特定的方法
void)unschedule:(SEL)s;
取消调用所有的
方法(包括update:)
void)unscheduleAllSelectors;
原文地址:http://blog.csdn.net/q199109106q/article/details/8599069
感谢作者~!
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!