歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Cocos2d基礎及基本函數

1.基本概念:

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沒有

Copyright © Linux教程網 All Rights Reserved