本章其實主要是系統的理解下Sprite精靈節點的建立,然後引入精靈節點和紋理集的概念
CCSprite 最簡單的產生方式就是用一個紋理貼圖。
CCSprite *_firstSp = [CCSprite spriteWithFile:@"icon.png"]; CGSize wins = [[CCDirector sharedDirector] winSize]; _firstSp.position = ccp(_firstSp.contentSize.width/2, wins.height/2); [self addChild:_firstSp z:1];
動畫幀
上面是產生精靈的最近基本的一種方式,但是很多時候,
我們的一個精靈元素不會是那種靜止,單單只有一幀檔案組成,
而以一個精靈幀形式出現。
精靈幀說白了就是一個動畫
// CCSprite *sp = [CCSprite spriteWithFile:@"ball0.png"]; //step1:首先要有一個精靈對象,當然你也可以用上面的的方式,建立一個初始化紋理的精靈對象。按上面的方法建立的好處是,後面如果你要計算精靈位置時,能擷取紋理暫居的空間大小,如果直接node的話,精靈佔據空間長寬應該都是0吧。 CCSprite *sp = [CCSprite node]; sp.position = CGPointMake(200, 200); //step2:根據檔案名稱產生兩幀檔案放入數組 NSMutableArray *frames = [NSMutableArray arrayWithCapacity:2]; for (int i = 0; i<2; i++) { //擷取紋理貼圖 NSString *file = [NSString stringWithFormat:@"ball%d.png",i]; CCTexture2D *text2d = [[CCTextureCache sharedTextureCache] addImage:file]; //產生精靈幀 CCSpriteFrame *frame = [CCSpriteFrame frameWithTexture:text2d rect:CGRectMake(0, 0, text2d.contentSize.width, text2d.contentSize.height)]; //放進數組中 [frames addObject:frame]; } //step3:產生精靈幀動畫動作 CCAnimation *ball = [CCAnimation animationWithSpriteFrames:frames delay:0.5]; CCAnimate *animate = [CCAnimate actionWithAnimation:ball]; CCRepeatForever* repeat = [CCRepeatForever actionWithAction:animate]; //step4:運行動畫幀。 [sp runAction:repeat]; [self addChild:sp z:1];
Tips:
1.這邊說一點,該方式擷取動畫幀是通過檔案名稱然後去資源檔拿去取的,然後資料上什麼都會告訴你一般資源的命名規則,就是以0,1,2,3,4結尾,相信大家都懂。
2.cocos2d早期版本,也就是本書所用到的庫,還有
/** returns an Animation given it's name. */
-(CCAnimation*)animationByName: (NSString*) animationName;
/** adds an Animation to the Sprite. */
-(void) addAnimation: (CCAnimation*) animation;
就是能把幀動畫對象存放到了精靈節點中,同樣也可以擷取,但是在目前的最新版本中貌似沒有了該方法。
精靈節點批處理(CCSpriteBatchNode)
上面都只是針對產生一個精靈節點來說的,有時候我們會遇到情境中需要建立多個相同的精靈,
最原始的方法是我們一個建立,然後add到情境中。
而精靈節點的作用是可以把一些使用相同貼圖的精靈放在一起,只進行一次渲染,減少原本我們沒建立一個精靈渲染一次而需要消耗的時間。
CCSpriteBatchNode* batch = [CCSpriteBatchNode batchNodeWithFile:@"ball.png"]; [self addChild:batch];for (int i = 0; i < 100; i++){CCSprite* sprite = [CCSprite spriteWithFile:@”ball.png”]; [batch addChild:bullet]; }
CCSpriteBatchNode簡單理解起來很像一個層layer,精靈添加它裡面,最後它一次性渲染出來。
Tips:
1.紋理貼圖必須使用同一個檔案
2.每個子精靈都是用相同的z-order(深度)。
關於紋理貼圖集(Texture Atlases)
簡單來說,比如前面我用到兩幀動畫需要兩個圖片,
那我們載入兩次來從資源檔中讀取這兩張圖片。
為什麼說紋理集的作用可以有效減少記憶體消耗,
這是因為ios在載入圖片分配記憶體大小時會將圖片長寬自動縮放到2的N次方,這個很好理解比如16*35的圖片,載入到記憶體是以16*64來的。
因此說用了紋理集能減小記憶體了,不是說你把幾個圖片合成到一個一個貼圖集裡,它就變小了,離亂上來說還是一樣大的,只不過紋理集合的話,我們只需載入一次,而如果單個載入,那麼載入多次,在這多次載入造成的因“2的N次方”引發的記憶體消耗顯然比只載入一次來的更加危險性了。
貼圖紋理集,說簡單就是把你原來分散的一個個小圖片憑藉成一個大圖,工具會自動產生一個plist檔案來儲存每個單元貼圖的大小以及以及在貼圖中位置資訊等。
紋理集製作工具,資料上說用Zwoptex,但是我在論壇搜尋到一個“TexturePacker”。有人說要收費,但是貌似下載下來是免費的啊,難道是在appStore下載要收費~
對於貼圖紋理集載入
CCSpriteFrameCache* frameCache = [CCSpriteFrameCache sharedSpriteFrameCache]; [frameCache addSpriteFramesWithFile:@"xxxx.plist"];
這樣就是把一張紋理集合載入緩衝到了記憶體。
需要用到某個貼圖時
CCSpriteFrameCache* frameCache = [CCSpriteFrameCache sharedSpriteFrameCache]; CCSpriteFrame* frame = [frameCache spriteFrameByName:pngname];
Tips:
1.資料上說了一種簡單估算一個圖片會佔記憶體大小,比如一種16*16的,那麼占的記憶體是16*16*4=1kb(應該沒錯吧。呵呵,資料上說512*512*4 = 1M)。
2.CCSpriteFrameCache載入的是一張拼接過的大圖,每一個小圖只是大圖中的一個地區,這些地區資訊都在plist檔案中儲存。
用的時候只需要根據小圖的名稱就可以載入到這個地區;
CCTextureCache 是普通的圖片緩衝,我們所有直接載入的圖片都會預設放到這個緩衝中,以提高調用效率。