下面介紹一下【Particle Designer】
生成兩個文件,一個小紋理,一個plist
其中plist文件結構如下:
自定義粒子特效,使用上面生成的plist文件
cocos2d v3版本中,很重要的一點就是:
CCParticleSystemBase替換了以前版本的CCParticleSystem
CCParticleSystem替換了以前版本的CCParticleSystemQuad
因此,在v3以前的版本,自定義粒子時,用CCParticleSystemQuad
因此,在v3之後的版本,自定義粒子時,用CCParticleSystem就可以了
CCParticleBatchNode,
同spriteBatchNode一樣,使用同一個紋理創建的多個相同特效的粒子(如位於屏幕不同位置顯示),
可以添加到同一個batchNode中,讓它統一管理;
而場景只需與一個batchNode打交道,界面上顯示的Node也只有一個
// // ParticleScene.m // 31_cocos2D入門 // // Created by beyond on 14-9-27. // Copyright (c) 2014年 com.beyond. All rights reserved. // #import "ParticleScene.h" @interface ParticleScene() { // 演示系統自帶的粒子特效 CCParticleSystem *_particleSystem; // 顯示粒子特效的名字 CCLabelTTF *_label; } @end @implementation ParticleScene #pragma mark - 覆蓋父類方法 -(id)init { if (self=[super init]) { // 1、場景Node 允許交互 self.userInteractionEnabled = YES; // 2、顯示粒子特效的名字 _label = [CCLabelTTF labelWithString:@"" fontName:@"Marker Felt" fontSize:30]; _label.positionType = CCPositionTypeNormalized; // 屏幕的右上方 注意這裡是笛卡爾坐標系,原點在左下方 _label.position = ccp(0.7f, 0.75f); _label.horizontalAlignment = CCTextAlignmentRight; [self addChild:_label]; } return self; } // 直接覆寫,即:不用創建一個sprite In Center - (void)addSpriteInCenter{} // 實現父類的方法,添加一個按鈕到屏幕上 - (void)addShowBtns { // 1.使用系統默認的粒子特效 [self addBtn:@"【系統粒子】" position:ccp(0, 0) target:self sel:@selector(systemParticleClicked)]; // 2.使用粒子設計器 [self addBtn:@"【粒子設計器】" position:ccp(0, 0.1) target:self sel:@selector(diyParticleClicked)]; // 3.使用ParticleBatchNode [self addBtn:@"【粒子Batch】" position:ccp(0, 0.2) target:self sel:@selector(particleBatchNodeClicked)]; } // 展示系統默認的粒子特效 static int i = 0; - (void)systemParticleClicked { // 要添加,先移除 [_particleSystem removeFromParent]; i++; if (i>11) { i=1; } Class cls; switch (i) { case 1: cls = NSClassFromString(@"CCParticleFire"); break; case 2: cls = NSClassFromString(@"CCParticleFireworks"); break; case 3: cls = NSClassFromString(@"CCParticleSun"); break; case 4: cls = NSClassFromString(@"CCParticleGalaxy"); break; case 5: cls = NSClassFromString(@"CCParticleFlower"); break; case 6: cls = NSClassFromString(@"CCParticleMeteor"); break; case 7: cls = NSClassFromString(@"CCParticleSpiral"); break; case 8: cls = NSClassFromString(@"CCParticleExplosion"); break; case 9: cls = NSClassFromString(@"CCParticleSmoke"); break; case 10: cls = NSClassFromString(@"CCParticleSnow"); break; case 11: cls = NSClassFromString(@"CCParticleRain"); break; default: break; } _particleSystem = [cls node]; // 設置自定義紋理和位置後,添加到場景中(默認紋理是fire.png) _particleSystem.texture = [CCTexture textureWithFile:@"circle.png"]; _particleSystem.position = ccp(self.contentSize.width/2,self.contentSize.height*0.3); [self addChild:_particleSystem]; // 2、顯示粒子特效的名字 _label.string = NSStringFromClass(cls); } // 自定義粒子特效,使用粒子設計器 - (void)diyParticleClicked { CCParticleSystem *diyParticleSystem = [CCParticleSystem particleWithFile:@"circle.plist"]; diyParticleSystem.position = ccp(self.contentSize.width/2,self.contentSize.height*0.5); // 添加到場景 [self addChild:diyParticleSystem]; } // 同spriteBatchNode一樣,使用同一個紋理創建的多個粒子特效,可以添加到同一個batchNode中,讓它統一管理;而場景只需與一個batchNode打交道,界面上顯示的Node也只有一個 - (void)particleBatchNodeClicked { // CCParticleBatchNode *batch = [CCParticleBatchNode batchNodeWithFile:@""]; // [batch addChild:p1,p2,p3]; } @end
下面是系統自帶的粒子效果,它們全繼承自ParticleSystemQuad,
而ParticleSystemQuad繼承自:ParticleSystem
注意:自帶的粒子效果,默認要用到一張名為fire.png圖片作為紋理
但,可以通過texture屬性另行設置
圖片編碼:在特殊的plist文件中,通過一個key,包含了一個圖片的所有編碼,從而,創建粒子特效時,不再需要一張.png圖片
如下面的這個plist文件,
最後一項key:textureImageData,裡面所有字串,就代表著一張完整的圖片
從而,無需再另外導入一張.png圖片
類似的圖片編碼,還出現在cocos2d屏幕左下角的幀率顯示的數字上面
導演類,決定顯示在下角的幀率數字
command+單擊,進入
通過再次進入,發現,顯示的幀率,其實是CCFPSLabel
通過為_FPSLabel設置string,從而能夠在屏幕左下角顯示幀率
那麼,_FPSLabel是如何實例化的呢?它顯示的數字用的紋理是什麼呢?
請看下面這張,重點來了~~~
command+單擊進入 getFPSImageData方法
發現指向指針的指針datapointer指向了內存中另一塊區域:
cc_fps_images_ipadhd_png
進去之後,發現,這些字串,就是圖片經過編碼後的data