cocos2d中,大量使用了单例模式(singleton),单例其实就是一个普通的类,但是它在整个应用程序生命周期内只实例一次,
cocos2d中,要访问单例对象,基本上都是使用shared开头的方法。看下下面的一个例子
static MyManager *sharedManager=nil;
+(MyManager) sharedManager
{
if(shareManager==nil)
{
shareManager=[[MyManager allc]init;
}
return shareManager;
}
我觉得单例应该包含一些公用的方法,而且调用这些方法,不会去修改单例的属性,否则
其它的类来调用单例的时候,所遇到的结果就是未知的了。说完单例,我们来说说一个重
要的单例类---CCDiretor。CCDirector是Cocos2d游戏引擎的核心,它存储了cocos2d中
大量的全局配置信息,而且管理着所有的cocos2d场景。Director的主要作用有以下几点:
a.切换场景
b.存储cocos2d的配制信息
c.访问视图(包括OpenGL,UIView,UIWindow)
d.暂停,访问以及终止游戏
e.再UIKit和OpenGL之间转换坐标
CCNode类
接下来,说说cocos2类。cocos2d中,所有的节点都继承自CNode类,它是一个没有具体显示的抽象类,仅 、
用于定义所有的公共属性和方法。首先我们来看一下cocos文档里面列举出来的类的继承关系,可以从中
发现CCScene,CCSprite都继承自CCNode,以前CCLayer也应该是继承自CCNode,以前CCLayer也应该是继承自CCNode
,以前CCLayer也应该是继承自CCNode,但是在1.0.1的文档中查不到这个累
再看看这个类的部分公共函数,里面包含了各种对节点的操作,增加,删除,获取节点,调度
(void) | - addChild: |
(void) | - addChild:z: |
(void) | - addChild:z:tag: |
(void) | - removeFromParentAndCleanup: |
(void) | - removeChild:cleanup: |
(void) | - removeChildByTag:cleanup: |
(void) | - removeAllChildrenWithCleanup: |
(CCNode *) | - getChildByTag: |
(void) | - reorderChild:z: |
(void) | - cleanup |
(void) | - draw |
(void) | - visit |
(void) | - transform |
(void) | - transformAncestors |
(CGRect) | - boundingBox |
(CGRect) | - boundingBoxInPixels |
(CCAction *) | - runAction: |
(void) | - stopAllActions |
(void) | - stopAction: |
(void) | - stopActionByTag: |
(CCAction *) | - getActionByTag: |
(NSUInteger) | - numberOfRunningActions |
(void) | - scheduleUpdate |
(void) | - scheduleUpdateWithPriority: |
(void) | - schedule: |
(void) | - schedule:interval: |
(void) | - unschedule: |
(void) | - unscheduleAllSelectors |
(void) | - resumeSchedulerAndActions |
(void) | - pauseSchedulerAndActions |
CCScene类
一个CCScene对象往往是场景图中的第一个节点。通常来说,CCScene节点的第一层节点一定是
CCLayer的子类,而CCScene对象本身,通常是由这些子节点(CCLayer)来保存,而不是CCScene
本身来保存,这样做的好处,会在CCLayer部分介绍。
1,场景类和app建立关系上
我们可以把要显示的第一个场景,加在AppDelegate中applicationDidFinishLnching方法的最后,
类如下:
[CCDirector sharedDirector]runWithScene:[HelloWorld scene];
HelloWorld类是一个继承自CCLayer的类,scene是其中的一个静态方法,用来将layer加入scene里面,
如下所示:
+(id)scene
{
CCScene *scene=[CCScene node];
CCLayer *layer=[HelloWorld node];
[scene addChild:layer];
return scene;
}
2 内存使用
当进行场景替换的时候,cocos2d会把自己占用的内存清理干净,它会删除所有节点,
停止所有的动作,并且对有用选择器选中的方法取消调度。但是,由于在进行场景替换时候,
新场景往往再旧场景释放之前就被加载到内存了,这会导致内存负荷瞬间加大,这个问题在
使用场景切换动画的时候,闲的格外明显。这时候,场景首先会被创建,然后过度效果运行,
一直要到过度效果运行完毕之后,旧场景才会从内存中释放。
由于场景切换的时候,会停止所有的动作,那么可否在播放场景过渡动画前先把前一个场景截屏,然后释放掉前一个场景再播放
动画,这样的话,就能节省不少内存。
3 场景的推进和弹出
cocos2d中有pushScene和popScene这两个有用的方法,这两个方法用来再不释放旧场景内存的情况下运行
新场景,可以加快场景替换的速度。用于很多场景可以互相叠加的存在于内存之中,很容易忘记弹出一个场景,或者
或者对于同一个场景弹出的太多遍。学过堆栈的同学,应该知道这种情况的危险性。但是这个用来切换setting还是不错的选择,
CCTransitionScene
场景过渡动画有时候能为游戏添色不少。在cocos2d中,要使用过渡动画还是比较简单的,只要在场景
装换时添加两行代码就行了。比如下面这个淡入淡出效果:
CCPadeTransition *tran=[CCFadeTransition transitionWithDuration:1 scene:[HelloWord scene]]
[[CCDirector sharedDirector]replaceScene:tran];
CCLayer
开始在CCScene里面提到过,CCLayer本质是对节点进行分组,游戏中的各个对象,一般是用来CCLayer来保存的。
这样的好处是,可以很轻松的修改层的属性或者在该层上运行一个动作来影响层上的所有子节点。例如你可以对某一层
施加一个动作,然后这个动作对该层上的所有对象产生影响。当然,不使用也能达到这样的效果,只要对每个对象分别进行操作即可。
但是显然,不使用层的做法是非常低效的。
CCLaler能够接受触摸事件和加速剂事件,但是接受触摸或者加速计事件
bi
1.CCNode是所有节点的父类包括(CCLayer, CCSprite, CCScene)