Scene对象其实是所有层的容器,与Layer一起组织各节点的图像显示。除了Scene外所有节点只有一个父节点,可以有无数个子节点。但注意这里的父子关系并不是面象对象中的继承关系,仅仅是addChild的方式建立起来的父子。
CCDirector类存储了cocos2d中大量的全局配置信息,而且管理所有的cocos2d场景,它可以访问正在运行的场景,运行替换场景等等。共有四种导演类型,其中默认的是kCCDirectorTypeDisplayLink
Tips: 在为对象建分组和层时一般通用的CCNode类而不是CCLayer类,因为CCLayer会接收键盘等的输入,增加不必要的开销。
2.节点处理:CCNode* childNode = [CCNode node];
[myNode addChild:childNode z:0 tag:123];
CCNode* retrievedNode = [myNode getChildByTag:123];
[myNode removeChildByTag:123 cleanUp:YES];
(cleanUp的意思是将节点从父节点中删除)
[myNode removeChild: retrievedNode];
[myNode removeAllChildrenWithCleanUp:YES];
[myNode removeFromParentAndCleanUp:YES];
3.动作的处理方式 1)动作声明通过以下声明可以让节点闪烁
CCAction* action = [CCBlink actionWithDuartion:10blinks:20];
action.tag = 234;
[myNode runAction:action];
如果之后想取得动作,可以通过标记来获得:
CCAction* retrievedAction = [myNode getActionByTag: 234];
[myNode stopActionByTag:234];
[myNode stopAction: action];
[myNode stopAllActions];
2)消息调度节点可以对消息进行调度,其实就是每段时间调用一次方法,如碰撞检测。要使特定的方法每帧调用一次,可以如下:
-(void) scheduleUpdateMethod
{
[self scheduleUpdate];
}
-(void) update: (ccTime)delta
{
//This method iscalled every frame;
}
参数delta表示方法自上次被调用到现在所经历过的时间。如果想以0.1秒的频率调用该方法可以如下:
-(void) scheduleUpdateMethod
{
[selfschedule:@selector (updateTenTimesPerSecond: ) interval:0.1f];
}
-(void) updateTenTimesPerSecond: (ccTime)delta
{
//This method iscalled according to its interval, ten times per second
}
Tips: 如果想用每帧更新,还是用scheduleUpdate好,反过来,如果在后面有可能要取消这个办法,还是用上面的方法,因为scheduleUpdate做不到。
3) @selector方法在这里selector方法相当于是告诉编译器去找一个名为updateTenTimesPerSecond的方法,并用“:”来告诉这个函数只有一个参数,如果这个函数有多个参数时,就要用多个,千万别忘了:号,如:
-(void) example:(ccTime)delta sender:(id)senderflag:(bool)aBool
那么对应的selector语句应该是:
@selector(example:sender:flag:)
如果要取消用选择器调度的方法,可以用
[self unscheduleAllSelectors];
[self unscheduled:@selector(updateTenTimesPerSecond)];
但要注意,用这些方法不会使scheduleUpdate的调度更新方法停止。
这里注意,如果想以不同的时间来调度一个方法,可以用_cmd来简化工作,_cmd在所有的Ob-C中都可用,是当前方法的选择器。
-(void) scheduleUpdates
{
[selfschedule:@selector(irregularUpdate:) interval:1];
}
-(void) irregularUpdate: (ccTime)delta
{
[self unscheduled:_cmd];
float nextUpdate= CCRANDOM_0_1() * 10;
[selfschedule:_cmd interval:nextUpdate];
}
在更新中还有更新方法的优先级,可以用[selfscheduleUpdateWithPriority:1]来进行更新,数字越小更新等级越高。
3. CCScene类CCDirector要求有派生自CCScene的类来进行runWithScene,replaceScene, pushScene等操作来修发当前场景,可以把CCScene封到一个派生自CCSceneTransition的类中,以便能够进行切换。
因为大多数时候场景对象本身不包含具体的游戏代码,而且基本不会从它派生类,所以一般都在CCLayer对象的“+(id)scene”方法中创建它们,如下:
+(id) scene
{
CCScene *scene =[CCScene node];
CCLayer *layer =[HelloWorld node];
[sceneaddChild:layer];
return scene;
}
然后可以在applicationDidFinishLaunching中结尾创建场景:
[[CCDirector sharedDirector] runWithScene: [HelloWorldscene]];
而在替换场景时,还可以使用过渡效果:
CCScene* scene = [HelloWorld scene];
CCSceneTransition* tran = [CCTransitionShrinkGrowtransitionWithDuration:2 scene: scene];
[[CCDirector sharedDirector] replaceScene: tran];
Tips:不能用self作为参数传给replaceScene以达到刷新场景的目的,会卡死的。
4. CCTransitionScene类
场景过渡就是任何从CCTransitionScene继承的类,如下例:
CCTransitionFade *tran = [CCTransitionFadetransitionWithDuration:1 scene:[HelloWorld scene] withColor:ccWHITE];
[[CCDirector sharedDirector] replaceScene: tran];
Tips: pushScene有过渡效果,但是popScene没有