日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

cocos2d基础介绍

發(fā)布時(shí)間:2025/3/13 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 cocos2d基础介绍 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

  這篇文章主要會(huì)介紹一些cocos2d的基礎(chǔ)類,以及他們的用途。

?

  cocos2d中,大量使用了單例(singleton)模式,單例其實(shí)就是一個(gè)普通的類,但是它在整個(gè)應(yīng)用程序生命周期內(nèi)只實(shí)例化一次,cocos2d中,要訪問(wèn)單例對(duì)象,基本上都是使用shared開頭的方法(目前為止,我沒(méi)有發(fā)現(xiàn)過(guò)有不這樣使用的單例)。如果你還沒(méi)看懂單例是什么,那么看看下面這個(gè)例子你就知道了。

static MyManager *shareManager = nil;

+(MyManager) sharedManager

{

if(shareManager == nil)

{

shareManager = [[MyManager alloc] init];

}



return shareManager;

}



  我覺(jué)得單例應(yīng)該是包含了一些公用的方法,而且調(diào)用這些方法,不會(huì)去修改單例的屬性,否則其他的類來(lái)調(diào)用單例的時(shí)候,所遇到的結(jié)果就是未知的了。說(shuō)完單例,我們先來(lái)說(shuō)說(shuō)一個(gè)重要的單例類——CCDirector。CCDiretor類是Cococs2d游戲引擎的核心,它存儲(chǔ)了cocos2d種大量的全局配置信息,而且管理著所有的cocos2d場(chǎng)景。Dirctor的主要作用有一下幾點(diǎn):

  • 切換場(chǎng)景
  • 存儲(chǔ)cocos2d的配置信息
  • 訪問(wèn)試圖(包含OpenGL、UIView、UIWindow)
  • 暫停、恢復(fù)以及終止游戲
  • 在UIKit和OpenGL之間轉(zhuǎn)換坐標(biāo)
  • CCNode類

? ? ?接下來(lái),說(shuō)說(shuō)CCNode類。cocos2d中,所有的節(jié)點(diǎn)都繼承自CNode類,它是一個(gè)沒(méi)有具體顯示的抽象類,僅用于定義所有的公共屬性和方法。首先我們來(lái)看一下cocos文檔里面列舉出來(lái)的類的繼承關(guān)系,可以從中發(fā)現(xiàn)CCScene、CCSprite都繼承自CCNode,以前CCLayer也應(yīng)該是繼承自CCNode,但是在1.0.1的文檔中查不到這個(gè)類,先記錄下,等下再去查。

?

  再來(lái)看看這個(gè)類的部分公共函數(shù),里面包含了各種對(duì)節(jié)點(diǎn)的操作,增加、刪除、獲取節(jié)點(diǎn)、調(diào)度(即隔多少秒執(zhí)行一次,稍后會(huì)詳細(xì)說(shuō)、取消調(diào)度、開始播放動(dòng)作、停止動(dòng)作等):

(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類

? ? ?一個(gè)CCScene對(duì)象往往是場(chǎng)景圖種的第一個(gè)節(jié)點(diǎn)。通常來(lái)說(shuō),CCScene節(jié)點(diǎn)的第一層子節(jié)點(diǎn)一定是CCLayer的子類,而CCScene對(duì)象本身,通常是利用CCLayer對(duì)象種的靜態(tài)方法+(id)scene來(lái)創(chuàng)建,而且游戲中的各個(gè)對(duì)象,也通常是由這些子節(jié)點(diǎn)(CCLayer)來(lái)保存,而不是CCScene本身來(lái)保存,這樣做的好處,會(huì)在CCLayer部分介紹。

?

? ? ?1、場(chǎng)景類跟app建立關(guān)系上

? ? ?我們可以把要顯示的第一個(gè)場(chǎng)景,加在AppDelegate中applicationDidFinishLaunching方法的最后,類似如下:

? ? ?[[CCDirector sharedDirector] runWithScene:[HelloWorld scene]];

?

? ? ?HelloWold類是一個(gè)繼承自CCLayer的類,scene是其中的一個(gè)靜態(tài)方法,用來(lái)將layer加入scene里面,如下所示:

+(id)scene

{

CCScene *scene = [CCScene node];

CCLayer *layer = [HelloWord node];

[scene addChild:layer];



return scene;

}



?

? ? ?2、內(nèi)存使用

? ? ?當(dāng)進(jìn)行場(chǎng)景替換的時(shí)候,cocos2d會(huì)把自己占用的內(nèi)存清理干凈,它會(huì)刪除所有的節(jié)點(diǎn),停止所有的動(dòng)作,并且對(duì)所有用選擇器選中的方法取消調(diào)度。但是,由于在進(jìn)行場(chǎng)景替換時(shí),新場(chǎng)景往往在舊場(chǎng)景釋放之前就被加載到內(nèi)存了,這會(huì)導(dǎo)致內(nèi)存負(fù)荷瞬間加大,這個(gè)問(wèn)題在使用場(chǎng)景轉(zhuǎn)換動(dòng)畫的時(shí)候,顯得格外明顯。這時(shí)候,場(chǎng)景首先會(huì)被創(chuàng)建,然后過(guò)渡效果運(yùn)行,一直要到過(guò)度效果運(yùn)行完畢之后,舊場(chǎng)景才會(huì)從內(nèi)存中釋放。

  由于場(chǎng)景替換的時(shí)候,會(huì)停止所有的動(dòng)作,那么可否在播放場(chǎng)景過(guò)渡動(dòng)畫前先把前一個(gè)場(chǎng)景截屏,然后釋放掉前一個(gè)場(chǎng)景再播放動(dòng)畫,這樣的話,就能節(jié)省不少內(nèi)存。

?

? ? ?3、場(chǎng)景的推進(jìn)和彈出

? ? ?cocos2d種有pushScene和popScene這兩個(gè)有用的方法,這兩個(gè)方法用來(lái)在不釋放舊場(chǎng)景內(nèi)存的情況下運(yùn)行新場(chǎng)景,可以加快場(chǎng)景替換的速度。由于很多場(chǎng)景可以互相疊加的存在于內(nèi)存之中,很容易就會(huì)忘記彈出一個(gè)場(chǎng)景,或者對(duì)于同一個(gè)場(chǎng)景彈出太多遍。學(xué)過(guò)堆棧的同學(xué),應(yīng)該知道這種情況的危險(xiǎn)性。但是這個(gè)用來(lái)切換setting還是不錯(cuò)的選擇,因?yàn)閟etting一般都不怎么占內(nèi)存,當(dāng)然,特殊情況除外。

?

  • CCTransitonScene

? ? ?場(chǎng)景過(guò)渡動(dòng)畫有時(shí)候能為游戲添色不少。在cocos2d中,要使用過(guò)度動(dòng)畫還是比較簡(jiǎn)單的,只要在場(chǎng)景轉(zhuǎn)換時(shí)添加兩行代碼就行了。比如下面這個(gè)淡入淡出效果:

? ??

CCFadeTransition *tran = [CCFadeTransition transitionWithDuration:1

scene:[HelloWorld scene]

withColor:ccWHITE];

[[CCDirector sharedDirector] replaceScene:tran];

?

?

? ? ?CCTransitonScene定義了很多的場(chǎng)景轉(zhuǎn)換動(dòng)畫,看下下面這張類圖應(yīng)該能很清楚的知道:

?

  • CCLayer

? ? ?開始在CCScene里面提到過(guò),CCLayer本質(zhì)是對(duì)節(jié)點(diǎn)進(jìn)行分組,游戲中的各個(gè)對(duì)象,一般是用CCLayer來(lái)保存的。這樣的好處是,可以很輕松的修改層的屬性或者在該層上運(yùn)行一個(gè)動(dòng)作來(lái)影響層上的所有子節(jié)點(diǎn)。例如你可以對(duì)某一層施加一個(gè)動(dòng)作,然后這個(gè)動(dòng)作會(huì)對(duì)該層上的所有對(duì)象產(chǎn)生影響。當(dāng)然,不使用層也能達(dá)到這樣的效果,只要對(duì)每個(gè)對(duì)象分別進(jìn)行操作即可,但是顯然,不使用層的做法是非常低效的。

?

? ? ?CCLayer能夠接收觸摸事件和加速劑事件,但是接收觸摸或者加速計(jì)事件的開銷是很大的,這也就導(dǎo)致有人說(shuō)使用多個(gè)層會(huì)影響性能。實(shí)際上你可以使用任意多個(gè)蹭,與其他的節(jié)點(diǎn)相比,他們對(duì)于性能并沒(méi)有太大的影響。如果太多的層需要接收和處理觸摸或者加速計(jì)事件,可以只用一個(gè)蹭來(lái)接收和處理這些輸入,然后在必要的情況下,通過(guò)這個(gè)層將輸入事件通知給其他節(jié)點(diǎn)或者類。

?

? ? ?1、接收觸摸事件

? ? ?使用self.isTouchEnabled = YES來(lái)顯示啟動(dòng)接收觸摸事件,一般會(huì)在init方法中開啟此功能。下面列出幾個(gè)常用單點(diǎn)觸控的觸摸事件:

? ? ?a)當(dāng)手指接觸到屏幕時(shí)被調(diào)用:

-(BOOL) ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event

?

? b)當(dāng)手指離開屏幕時(shí)候被調(diào)用:

-(void) ccTouchEnded:(UITouch *)touch withEvent:(UIEvent *)event?

? ? ?c)當(dāng)觸摸時(shí)間被取消時(shí)調(diào)用:

-(void) ccTouchCancelled:(UITouch *)touch withEvent:(UIEvent *)event

? ? ?d)當(dāng)手指在屏幕上移動(dòng)的時(shí)候被調(diào)用:

? ??

-(void) ccTouchMoved:(UITouch *)touch withEvent:(UIEvent *)event

? ? ?在使用單點(diǎn)觸摸之前,要向?qū)又刑砑右韵路椒▉?lái)啟用有針對(duì)性的觸摸處理:

-(void) registerWithTouchDispatcher

{

[[CCTouchDispatcher sharedDispatcher] addTargetedDelegate:self
priority:INIT_MIN + 1
swallowsTouches:YES];

}?

? ? ?CCTouchBegan返回一個(gè)bool值,如果返回YES,就意味著不想讓這個(gè)觸摸被傳送到其他優(yōu)先級(jí)更低的有針對(duì)性的觸摸處理,也就相當(dāng)于你直接吞噬掉了這個(gè)觸摸事件。

?

? ? ?由于觸摸事件是由Cocoa Touch API接收的,因此一定要吧觸摸位置轉(zhuǎn)換成cocos2d所用的OpenGL坐標(biāo):

? ? ?

-(CGPoint) locationFromTouch:(UITouch *)touch
{
CGPoint touchLocation = [touch locationInView:[touch view]];
return [[CCDirector sharedDirector] convertToGL:touchLocation];
}

? ? ?2、接收加速計(jì)事件

? ? ?同樣,需要self.isAccelerometerEnabled = YES來(lái)顯示啟動(dòng)加速計(jì)來(lái)接收加速計(jì)事件,但是這個(gè)事件的處理比觸摸時(shí)間就簡(jiǎn)單多了,只需要向?qū)永锩嫣砑右粋€(gè)特定方法來(lái)接收加速計(jì)事件:

? ? ?

- (void)accelerometer:(UIAccelerometer*)accelerometer
didAccelerate:(UIAcceleration*)acceleration
{
//可以利用以下參數(shù)來(lái)決定三維中任意方向的加速度
//acceleration.x acceleration.y acceleration.z
}


?

  • CCSprite

?

?

? ? ?CCSprite是cocos2d種最為常用的類,它用一副圖像將精靈顯示到屏幕上。要?jiǎng)?chuàng)建一個(gè)精靈很簡(jiǎn)單,比如你的工程的Resources分組下有一張叫做monster.png的圖,那么只需要使用如下方法,就能將精靈顯示在層上:

CCSpirt *sprite = [[CCSprite spriteWithFile:@"monster.png"]];

[self addChild:sprite];? ?

? ? ?通過(guò)上面的操作后,cocos2d內(nèi)部會(huì)把該圖片加載到CCTexture2D類的圖像資源中。在這里,順便提一下,由于ios設(shè)備只支持尺寸為“2的n次冪”的紋理,即圖片的長(zhǎng)寬只能偉:2、4、8等像素。如果你有一張貼圖,大小為260*260像素32位色的圖片,那么就比較悲劇了。你覺(jué)得它在內(nèi)存中應(yīng)該只占用260*260*4=270KB左右的空間,單實(shí)際上,它占用了512*512*4=1MB的內(nèi)存。

? ? ? CCSprite還有一個(gè)比較重要的就是位置問(wèn)題,想象下現(xiàn)實(shí)生活中,如果你要把一張照片釘在墻上某個(gè)問(wèn)題,你會(huì)怎么做?首先,你會(huì)把圖釘插在照片上的某個(gè)點(diǎn)(在cocos2d中稱為anchorPoint),然后你會(huì)確定要把這個(gè)圖釘訂在墻上的某個(gè)位置(在cocos2d種稱為positon),這兩個(gè)點(diǎn)就能確定照片在墻上的位置了。比如你想把照片放到左下角,那么你可以選擇將圖釘釘在照片的左下角(0,0),然后釘在墻的左下角(0,0).或者,你可以選擇把圖釘定在照片的右上角(1,1),然后把照片訂在墻的(照片長(zhǎng),照片寬)的位置。auchorPoint表示的其實(shí)是一個(gè)百分比,用來(lái)標(biāo)明相對(duì)于圖片左下角的(長(zhǎng)*百分比,寬*百分比)像素的位置,比如auchorPoint為(0.5, 0.5), 那么在圖片的坐標(biāo)系里,它標(biāo)明的位置就應(yīng)該是(長(zhǎng)*0.5, 寬*0.5)的位置,也就是圖片的中心點(diǎn)。最好好anchorPoint設(shè)置成(0.5, 0.5),也就是在圖片的中心,這樣,當(dāng)你進(jìn)行旋轉(zhuǎn)、縮放等動(dòng)作的時(shí)候,會(huì)比較方便。幸運(yùn)的是,anchorPoint的默認(rèn)位置就是(0.5,0.5).

  • CCLabelTTF

? ? ?這個(gè)類的作用就是在屏幕上顯示文本。cocos2d內(nèi)部會(huì)以制定的字體作為參數(shù)創(chuàng)建一個(gè)CCTexture2D對(duì)象,也就是一張紋理,然后再用改紋理渲染出最后顯示的文本.因?yàn)槊看挝谋景l(fā)生改變,就要做一次上述工作,所以cocos2d的文檔中也建議改用CCLabelAtlas或者CCLabelBMFont代替。

? ? ?你可能會(huì)發(fā)現(xiàn),每次修改標(biāo)簽上的文本時(shí)候,這些文本都會(huì)自動(dòng)中對(duì)齊,如果要改成左對(duì)齊,或者右對(duì)齊這些,只需要改變anchorPoint的屬性就可以了。

  • 動(dòng)作

? ? ?動(dòng)作是可以用來(lái)讓節(jié)點(diǎn)執(zhí)行諸如移動(dòng)、旋轉(zhuǎn)、縮放、變色、消失等很多動(dòng)作。由于他們能作用在所有的節(jié)點(diǎn)上,因此可以對(duì)精靈、標(biāo)簽甚至菜單或整個(gè)場(chǎng)景施加動(dòng)作。動(dòng)作在完成后,會(huì)自動(dòng)從節(jié)點(diǎn)上清除并釋放它所占用的內(nèi)存。

? ? ?動(dòng)作又分為即時(shí)動(dòng)作和延時(shí)動(dòng)作。延時(shí)動(dòng)作就是我們一般理解上的動(dòng)作,比如讓一個(gè)精靈移動(dòng)到哪里。即時(shí)動(dòng)作,一般就類似于設(shè)置精靈的屬性等,及時(shí)動(dòng)作平時(shí)看起來(lái)是沒(méi)有多大意義的,一般要配合后文所述的動(dòng)作序列。

? ? ?1)重復(fù)動(dòng)作

? ? ?這個(gè)很容易理解,就是讓一個(gè)動(dòng)作不停的重復(fù),可以用這個(gè)方法創(chuàng)建無(wú)限循環(huán)的動(dòng)畫。使用起來(lái)也很簡(jiǎn)單,例如下面這個(gè)讓一個(gè)節(jié)點(diǎn)不停的旋轉(zhuǎn):

? ? ?

CCRotateBy* rotateBy = [CCRotateBy actionWithDuration:2 angle:360];

CCRepeatForever *repeat = [CCRepeatForever actionWithAction:rotateBy];

[myNode runAction:repeat];?

? ? ?還有一個(gè)類CCRepeat是讓一個(gè)動(dòng)畫重復(fù)多少次,函數(shù)原型如下:? ? ?

actionWithAction:(CCFiniteTimeAction *)action times:(NSUInteger) times;


? ? ?2、流暢動(dòng)作(CCEaseAction)?

? ? ?一般的動(dòng)作,比如你定義了一個(gè)物體是向哪個(gè)方向移動(dòng),那么它就會(huì)勻速的過(guò)去,但是很顯然,我們喜歡更有點(diǎn)變化的動(dòng)作,比如加速進(jìn)入,然后迅速一段時(shí)間,再減速停止,流暢動(dòng)作就是用來(lái)做這個(gè)的。

?

? ? ?3、動(dòng)作序列

? ? CCSequence,這個(gè)比較好理解,就是定義一組動(dòng)作,然后讓他們按照這個(gè)順序執(zhí)行。

?

? ? ?上面介紹了cocos2d種一些重要的、常用的類,接下來(lái)的文章,會(huì)采用這些來(lái)做一個(gè)小demo,來(lái)溫習(xí)一下這一篇文章的內(nèi)容,不正確的地方,還請(qǐng)各位斧正。?

轉(zhuǎn)載于:https://www.cnblogs.com/huangwei/archive/2012/03/16/2402322.html

總結(jié)

以上是生活随笔為你收集整理的cocos2d基础介绍的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。