cocos2d 学习笔记
CCDirector类,简称Director(导演),是cocos2d游戏引擎的核心。
Director是一个单例:它保存着 cocos2d的全局配置设定,同时管理着cocos2d的场景。
Director的主要用处如下:
1. 访问和改变场景
2. 访问cocos2d的配置细节
3. 访问视图(OpenGL,UIView,UIWindow)
4. 暂停,恢复和结束游戏
5. 在UIKit和OpenGL之间转换坐标
除了场景本身,每一个节点只有一个父节点,但是可以有任意数量的子节点。
在最上面,你总是放置场景节点(MyScene),通常跟着的 是一个层节点(MyLayer)。
在cocos2d里,层节点的作用是接收触摸和加速计的输入。
所有节点都有一个共同的父类:CCNode。
它定义了许多除显示节点外的通用的属性和方法
CCNode是cocos2d中最重要的类。所有类都继承自CCNode。CCNode定义了通用的属性和 方法。
addChild中的z参数决定了节点的绘制顺序。拥有最小z值的节点会首先被绘制; 拥有最大z值的节点最后一个被绘制。如果多个节点拥有相同的z值,他们的绘 制顺序将由他们的添加顺序来决定。当然,这个规则只适用于像sprites那样有 视觉表现的节点。
scheduleUpdate方法没有停止预定信息的功能
如果你想之后停止对某个指定更新方法的预定信息的话
建议使用
(void) scheduleUpdates
{
[self schedule:@selector(updateTenTimesPerSecond:) interval:0.1f];
}
-(void) updateTenTimesPerSecond:(ccTime)delta
{
// 此方法将根据时间间隔来调用,每秒10次
}
以下代码会停止节点的所有选择器,包括那些已经在scheduleUpdate里面设置 了预定的选择器:
[self unscheduleAllSelectors];
以下代码会停止某个指定的选择器(假设选择器名称是updateTenTimesPerSecond): [self unschedule:@selector(updateTenTimesPerSecond:)];
注:此方法不会停止scheduleUpdate中设置的预定更新方法。
CCScene对象总是场景图里面的第一个节点。通常CCScene的子节点都是继承自 CCLayer。CCLayer包含了各个游戏对象。
因为大多数情况下场景对象本身不包 含任何游戏相关的代码,而且很少被子类化,所以它一般都是在CCLayer对象里通过+(id)scene这个静态方法来创建的。
+(id) scene
{
CCScene *scene = [CCScene node];
CCLayer* layer = [HelloWorld node];
[scene addChild:layer];
return scene;
}
和场景一样,层没有大小的概念。层是一个组织的概念。比如,如果你对一个
层使用动作,那么所有在这个层上的物体都会受到影响。
很多情况下,你可能想知道触摸是在哪里开始的。因为触摸事件由Cocoa Touch API接收,所以触摸的位置必须被转换为OpenGL的坐标。以下是一个用来转换坐 标的方法:
-(CGPoint) locationFromTouches:(NSSet *)touches
{
UITouch *touch = [touches anyObject];
CGPoint touchLocation = [touch locationInView: [touch view]];
return [[CCDirector sharedDirector] convertToGL:touchLocation];
}
接收加速计事件
和触摸输入一样,加速计必须在启用以后才能接收加速计事件:
self.isAccelerometerEnabled = YES;
同样的,层里面要加入一个特定的方法来接收加速计事件: -(void) accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration
{
CCLOG(@"acceleration: x:%f / y:%f / z:%f", acceleration.x, acceleration.y,
acceleration.z);
} 你可以通过加速参数来决定任意三个方向的加速度值。
CCSprite
CCSprite是最常用到的类。它使用图片把精灵(sprite)显示在屏幕上。生成 精灵最简单的方法是把图片文件加载进CCTexture2D材质里面,然后将它赋给精 灵。
定位点揭秘
每个节点都有一个定位点,但是只有当此节点拥有贴图时,这个定位点才有用。 默认情况下,anchorPoint属性设置为(0.5,0.5)或者贴图尺寸的一半。它是 一个抽象的因素,一个乘数,而不是一个特定的像素尺寸。
anchorPoint定义的是贴图相对于节点位置的偏移。你可以通过把贴图的宽和高 乘以定位点来得到贴图的偏移值。顺便提一下,有一个只读的 anchorPointPixels属性可以得到贴图的像素偏移值,所以你不需要自己计算。
舒缓动作
CCEaseAction类让cocos2d的动作更加有用。“舒缓动作”允许你改变在一段时 间内发生的动作效果。例如,如果你在节点上应用CCMoveTo动作,此节点在整 个移动过程中将会保持同一个速度。而如果你使用CCEaseAction的话,你就可 以让节点慢慢启动,然后加速向目标移动,或者反过来(快速启动,慢慢减速 到达目标)。或者你也可以让节点移动到超过目的地一些,然后再反弹回来。 “舒缓动作”可以帮助你创造出通常很费时间才能做出来的动画。以下代码演 示了如何应用舒缓动作来改变一个普通动作的行为。rate参数是用来决定舒缓 动作的明显程度。此参数只有在大于1的情况下才能看到舒缓动作的效果:
// 我想让myNode在3秒钟之内移动到100,200坐标点
CCMoveTo* move = [CCMoveTo actionWithDuration:3 position:CGPointMake(100, 200)];
// 节点应该慢慢启动,然后在移动过程中减速
CCEaseInOut* ease = [CCEaseInOut actionWithAction:move rate:4];
[myNode runAction:ease];
在上述例子中,舒缓动作是在节点上运行的,而不是在移动动作上运行
iOS游戏首选的图片格式是PNG,Portable Network Graphics。它虽然是种
压缩格式,但是与JPG不同的是,PNG是无损压缩,它将源图片的所有像素都保 留了。你也可以把图片存为无压缩JPG格式,但是一般情况下同样的图片用PNG格式比无压缩JPG格式要小一些。不过,这个区别只影响应用程序的大小,它和内存的使用无关。
iOS设备使用的ARM CPU不支持直接在硬件上做除法, 乘法一般会快一些。
规则一:永远不要在一个节点的init方法中调用CCDirector的
replaceScene方法。规则二:请遵守规则一。不遵守规则的后果是程序崩溃。
Director无法容忍一个节点在初始化的同时进行场景替换。
你可能认为只有CCLayer才能接收触摸输入事件。
实际上,通过直 接使用CCTouchDispatcher,你可以让任何类接收触摸事件。
你只需要在类里实 现CCStandardTouchDelegate协议或者CCTargetedTouchDelegate协议就可以了。