Scene對象其實是所有層的容器,與Layer一起組織各節點的圖像顯示。除了Scene外所有節點只有一個父節點,可以有無數個子節點。但注意這裡的父子關系並不是面象對象中的繼承關系,僅僅是addChild的方式建立起來的父子。
CCDirector類存儲了cocos2d中大量的全局配置信息,而且管理所有的cocos2d場景,它可以訪問正在運行的場景,運行替換場景等等。共有四種導演類型,其中默認的是kCCDirectorTypeDisplayLink
Tips: 在為對象建分組和層時一般通用的CCNode類而不是CCLayer類,因為CCLayer會接收鍵盤等的輸入,增加不必要的開銷。
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];
通過以下聲明可以讓節點閃爍
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];
節點可以對消息進行調度,其實就是每段時間調用一次方法,如碰撞檢測。要使特定的方法每幀調用一次,可以如下:
-(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做不到。
在這裡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]來進行更新,數字越小更新等級越高。
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沒有