iOS_31_cocos2d_粒子系統ParticleSystem,cocos2dios
最終:
ParticleSystem是基類,ParticleSystem的唯一一個直接子類是:ParticleSystemQuadParticleSystemQuad下面又有n多個子類
當需要自訂粒子系統時,用到的是ParticleSystemQuad,參數是:第3方軟體產生的plist
下面是的粒子系統的繼承結構圖
下面介紹一下【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
Unity3D 中的ParticleSystem中可以夠發射粒子,如果我的粒子是GameObject的實體怎用粒子系統發射?
首先你的知道粒子本質是什麼,就是mesh上面貼點透明貼圖而已,是不能發射3d物體
照你的意思是要粒子系統結合模型做
這個大部分的複雜粒子都是這樣做的
只要粒子和物體同時顯示就行,物體要運動需要做動畫
ogre 用粒子編輯器編輯好的粒子指令碼particle 怎在ogre程式中調用?
可以再ogre教程架構的creatScene函數裡添加以下代碼即可:(當然可以在任何地方調用粒子指令碼都行,這隻是個粒子)
void test_particle::createScene(void){ //第一個參數表示粒子系統的名字,隨便起,第二個就是你的粒子系統指令碼,一般在你安裝的ogre sdk路徑的media粒子系統檔案夾下 Ogre::ParticleSystem* ps=mSceneMgr->createParticleSystem("cloud","Examples/Cloud") ; mSceneMgr->getRootSceneNode()->createChildSceneNode()->attachObject(ps); // Set ambient light mSceneMgr->setAmbientLight(Ogre::ColourValue(0.5, 0.5, 0.5)); // Create a light Ogre::Light* l = mSceneMgr->createLight("MainLight"); l->setPosition(20,80,50);}