有哪些网站是关于cocos2dx plist文件游戏中plist粒子特效的

Cocos2d-x3.1 粒子效果示例
这里把粒子的几种效果粘出来,以便以后使用
IntervalLayer.cpp
testthirdone
Created by 杜甲 on 14-7-7.
#include IntervalLayer.h
#define SID_STEP1
#define SID_STEP2
#define SID_STEP3
#define IDC_PAUSE
bool IntervalLayer::init()
IntervalLayer::IntervalLayer()
_time0 = _time1 = _time2 = _time3 = _time4 = 0.0f;
auto s = Director::getInstance()-&getWinSize();
auto sun = ParticleSun::create();
sun-&setTexture(Director::getInstance()-&getTextureCache()-&addImage(fire.png));
sun-&setPosition(Vec2(s.width / 2 -100, s.height / 2));
sun-&setTotalParticles(130);
sun-&setLife(5.0f);
this-&addChild(sun);
auto fire = ParticleFire::create();
fire-&setTexture(Director::getInstance()-&getTextureCache()-&addImage(fire.png));
fire-&setPosition(Vec2(s.width / 2 + 50, s.height / 2));
fire-&setTotalParticles(130);
fire-&setLife(5.0f);
this-&addChild(fire);
auto fireworks = ParticleFireworks::create();
fireworks-&setTexture(Director::getInstance()-&getTextureCache()-&addImage(fire.png));
fireworks-&setPosition(Vec2(s.width / 2 + 50, s.height / 2 - 200));
fireworks-&setTotalParticles(130);
fireworks-&setLife(5.0f);
this-&addChild(fireworks);
auto galaxy = ParticleGalaxy::create();
galaxy-&setTexture(Director::getInstance()-&getTextureCache()-&addImage(fire.png));
galaxy-&setPosition(Vec2( 50, s.height / 2 + 200));
galaxy-&setTotalParticles(130);
galaxy-&setLife(5.0f);
this-&addChild(galaxy);
auto flower = ParticleFlower::create();
flower-&setTexture(Director::getInstance()-&getTextureCache()-&addImage(fire.png));
flower-&setPosition(Vec2( 250, s.height / 2 + 200));
flower-&setTotalParticles(130);
flower-&setLife(5.0f);
this-&addChild(flower);
auto meteor = ParticleMeteor::create();
meteor-&setTexture(Director::getInstance()-&getTextureCache()-&addImage(fire.png));
meteor-&setPosition(Vec2( 250, 20));
meteor-&setTotalParticles(130);
meteor-&setLife(5.0f);
this-&addChild(meteor);
auto spiral = ParticleSpiral::create();
spiral-&setTexture(Director::getInstance()-&getTextureCache()-&addImage(fire.png));
spiral-&setPosition(Vec2( 450, 40));
spiral-&setTotalParticles(130);
spiral-&setLife(5.0f);
this-&addChild(spiral);
auto explosion = ParticleExplosion::create();
explosion-&setTexture(Director::getInstance()-&getTextureCache()-&addImage(fire.png));
explosion-&setPosition(Vec2( 50, 440));
explosion-&setTotalParticles(130);
explosion-&setLife(5.0f);
this-&addChild(explosion);
auto smoke = ParticleSmoke::create();
smoke-&setTexture(Director::getInstance()-&getTextureCache()-&addImage(fire.png));
smoke-&setPosition(Vec2( 450, 640));
smoke-&setTotalParticles(130);
smoke-&setLife(5.0f);
this-&addChild(smoke);
auto snow = ParticleSnow::create();
snow-&setTexture(Director::getInstance()-&getTextureCache()-&addImage(fire.png));
snow-&setPosition(Vec2( 450, 840));
snow-&setTotalParticles(130);
snow-&setLife(5.0f);
this-&addChild(snow);
auto rain = ParticleRain::create();
rain-&setTexture(Director::getInstance()-&getTextureCache()-&addImage(fire.png));
rain-&setPosition(Vec2( 450, 940));
rain-&setTotalParticles(130);
rain-&setLife(5.0f);
this-&addChild(rain);Pages: 1/2
主题 : 【教程分享】粒子系统的加载优化
级别: 版主
UID: 300874
发帖: 2378
可可豆: 3131 CB
威望: 3189 点
在线时间: 1378(时)
发自: Web Page
【教程分享】粒子系统的加载优化&&&
本帖被 偶尔e网事 执行提前操作()
Cocos2d-x的粒子系统是通过加载plist生成的。plist包含两部分内容:粒子系统属性和粒子纹理。然而每次调用create都会对plist进行读取解析,如果重复地使用同一个粒子效果,这样的调用明显是低效冗余的。所以我们要做的是,将粒子系统属性和粒子纹理分别抽出。(1)将粒子系统属性预加载并全局保存,避免每次进行读取。(2)粒子纹理可视且可以进行纹理打包,加载粒子纹理就和加载普通的图片一样。本文通过增加ParticleSystemQuad的接口实现对粒子系统属性和纹理帧的直接载入,来提高粒子系统的加载效率和实现内存纹理的优化。1.ParticleSystemQuad首先先看下ParticleSystemQuad,ParticleSystemQuad继承于ParticleSystem,拥有后者的所有特性,并且增加了一些新的特性:(1)粒子大小支持浮点数(2)支持缩放(3)支持选择(4)支持subrect(5)支持批渲染ParticleSystemQuad同时也是其他特效的父类,创建一个粒子系统的函数调用顺序为:Create→initWithFile→initWithDictionary
在initWithDictionary中对粒子数据和纹理进行了读取和解析(这部分有兴趣的可以直接看源码)。2.如何优化?参考initWithDictionary的函参static bool initWithDictionary(ValueMap& dictionary, const std::string& dirname)
设计如下接口,当然你要传入文件名也可以:static ParticleSystemQuad * create(ValueMap& valueMap, SpriteFrame *frame);
bool initWithValueMap(ValueMap &valueMap, SpriteFrame* frame);源码如下:ParticleSystemQuad * ParticleSystemQuad::create( ValueMap& map, SpriteFrame *frame)
     ParticleSystemQuad *ret = new ParticleSystemQuad();
     if (ret && ret-&initWithValueMap(map, frame))
     {
         ret-&autorelease();
         
     }
     CC_SAFE_DELETE(ret);
     
bool ParticleSystemQuad::initWithValueMap(ValueMap &valueMap, SpriteFrame* frame)
     std::string dirname = &&;
     bool ret =
     unsigned char *buffer =
     unsigned char *deflated =
     do
     {
         int maxParticles = valueMap[&maxParticles&].asInt();
         // self, not super
         if(this-&initWithTotalParticles(maxParticles))
         {
             // Emitter name in particle designer 2.0
             _configName = valueMap[&configName&].asString();
             // angle
             _angle = valueMap[&angle&].asFloat();
             _angleVar = valueMap[&angleVariance&].asFloat();
             // duration
             _duration = valueMap[&duration&].asFloat();
             // blend function
             if (_configName.length()&0)
             {
                 _blendFunc.src = valueMap[&blendFuncSource&].asFloat();
             }
             else
             {
                 _blendFunc.src = valueMap[&blendFuncSource&].asInt();
             }
             _blendFunc.dst = valueMap[&blendFuncDestination&].asInt();
             // color
             _startColor.r = valueMap[&startColorRed&].asFloat();
             _startColor.g = valueMap[&startColorGreen&].asFloat();
             _startColor.b = valueMap[&startColorBlue&].asFloat();
             _startColor.a = valueMap[&startColorAlpha&].asFloat();
             _startColorVar.r = valueMap[&startColorVarianceRed&].asFloat();
             _startColorVar.g = valueMap[&startColorVarianceGreen&].asFloat();
             _startColorVar.b = valueMap[&startColorVarianceBlue&].asFloat();
             _startColorVar.a = valueMap[&startColorVarianceAlpha&].asFloat();
             _endColor.r = valueMap[&finishColorRed&].asFloat();
             _endColor.g = valueMap[&finishColorGreen&].asFloat();
             _endColor.b = valueMap[&finishColorBlue&].asFloat();
             _endColor.a = valueMap[&finishColorAlpha&].asFloat();
             _endColorVar.r = valueMap[&finishColorVarianceRed&].asFloat();
             _endColorVar.g = valueMap[&finishColorVarianceGreen&].asFloat();
             _endColorVar.b = valueMap[&finishColorVarianceBlue&].asFloat();
             _endColorVar.a = valueMap[&finishColorVarianceAlpha&].asFloat();
             // particle size
             _startSize = valueMap[&startParticleSize&].asFloat();
             _startSizeVar = valueMap[&startParticleSizeVariance&].asFloat();
             _endSize = valueMap[&finishParticleSize&].asFloat();
             _endSizeVar = valueMap[&finishParticleSizeVariance&].asFloat();
             // position
             float x = valueMap[&sourcePositionx&].asFloat();
             float y = valueMap[&sourcePositiony&].asFloat();
             this-&setPosition( Point(x,y) );
             _posVar.x = valueMap[&sourcePositionVariancex&].asFloat();
             _posVar.y = valueMap[&sourcePositionVariancey&].asFloat();
             // Spinning
             _startSpin = valueMap[&rotationStart&].asFloat();
             _startSpinVar = valueMap[&rotationStartVariance&].asFloat();
             _endSpin= valueMap[&rotationEnd&].asFloat();
             _endSpinVar= valueMap[&rotationEndVariance&].asFloat();
             _emitterMode = (Mode) valueMap[&emitterType&].asInt();
             // Mode A: Gravity + tangential accel + radial accel
             if (_emitterMode == Mode::GRAVITY)
             {
                 // gravity
                 modeA.gravity.x = valueMap[&gravityx&].asFloat();
                 modeA.gravity.y = valueMap[&gravityy&].asFloat();
                 // speed
                 modeA.speed = valueMap[&speed&].asFloat();
                 modeA.speedVar = valueMap[&speedVariance&].asFloat();
                 // radial acceleration
                 modeA.radialAccel = valueMap[&radialAcceleration&].asFloat();
                 modeA.radialAccelVar = valueMap[&radialAccelVariance&].asFloat();
                 // tangential acceleration
                 modeA.tangentialAccel = valueMap[&tangentialAcceleration&].asFloat();
                 modeA.tangentialAccelVar = valueMap[&tangentialAccelVariance&].asFloat();
                 // rotation is dir
                 modeA.rotationIsDir = valueMap[&rotationIsDir&].asBool();
             }
             // or Mode B: radius movement
             else if (_emitterMode == Mode::RADIUS)
             {
                 if (_configName.length()&0)
                 {
                     modeB.startRadius = valueMap[&maxRadius&].asInt();
                 }
                 else
                 {
                     modeB.startRadius = valueMap[&maxRadius&].asFloat();
                 }
                 modeB.startRadiusVar = valueMap[&maxRadiusVariance&].asFloat();
                 if (_configName.length()&0)
                 {
                     modeB.endRadius = valueMap[&minRadius&].asInt();
                 }
                 else
                 {
                     modeB.endRadius = valueMap[&minRadius&].asFloat();
                 }
                 modeB.endRadiusVar = 0.0f;
                 if (_configName.length()&0)
                 {
                     modeB.rotatePerSecond = valueMap[&rotatePerSecond&].asInt();
                 }
                 else
                 {
                     modeB.rotatePerSecond = valueMap[&rotatePerSecond&].asFloat();
                 }
                 modeB.rotatePerSecondVar = valueMap[&rotatePerSecondVariance&].asFloat();
             } else {
                 CCASSERT( false, &Invalid emitterType in config file&);
                 CC_BREAK_IF(true);
             }
             // life span
             _life = valueMap[&particleLifespan&].asFloat();
             _lifeVar = valueMap[&particleLifespanVariance&].asFloat();
             // emission Rate
             _emissionRate = _totalParticles / _
             //don't get the internal texture if a batchNode is used
             if (!_batchNode)
             {
                 // Set a compatible default for the alpha transfer
                 _opacityModifyRGB =
                 if (!_configName.empty())
                 {
                     _yCoordFlipped = valueMap[&yCoordFlipped&].asInt();
                 }
             }
             setDisplayFrame(frame);
             ret =
         }
     } while (0);
     free(buffer);
     free(deflated);
     
 }注意,这里只是提供了通过粒子系统属性和纹理创建粒子系统的接口,并没有实现对粒子属性的全局保存(可以参考)和图片帧的预加载。粒子属性的获取:ValueMap FileUtilsApple::getValueMapFromFile(const std::string& filename)
图片帧的获取(这个获取方式就比较多了。。。):SpriteFrame* create(const std::string& filename, const Rect& rect);
3.如何使用?auto plistData = FileUtils::getInstance()-&getValueMapFromFile(&Particles/emissionPart.plist&);
auto emission_frame = SpriteFrame::create(&Images/engine.jpg&, Rect(0,0,25,32)); 
auto emitter = ParticleSystemQuad::create(plistData, emission_frame);
_background-&addChild(_emitter, 10);4.源码下载我也不知道3.0release会不会集成这个功能,这里先发出pull request的链接:[ 此帖被偶尔e网事在 15:49重新编辑 ]
级别: 侠客
可可豆: 217 CB
威望: 215 点
在线时间: 69(时)
发自: Web Page
添加到引擎里吧!!!
级别: 版主
UID: 300874
发帖: 2378
可可豆: 3131 CB
威望: 3189 点
在线时间: 1378(时)
发自: Web Page
回 1楼(佐耳云儿) 的帖子
必须的啊,慧眼识珠!!!
级别: 圣骑士
可可豆: 939 CB
威望: 1092 点
在线时间: 545(时)
发自: Web Page
回 楼主(偶尔e网事) 的帖子
版主真厉害!
专黑cocos三十年。cocos系列的坑连起来可以绕地球32圈哦~
级别: 骑士
UID: 197413
可可豆: 431 CB
威望: 344 点
在线时间: 147(时)
发自: Web Page
&&&& 大赞,学习,学习
级别: 侠客
UID: 284661
可可豆: 369 CB
威望: 347 点
在线时间: 284(时)
发自: Web Page
级别: 新手上路
UID: 296457
可可豆: 64 CB
威望: 43 点
在线时间: 40(时)
发自: Web Page
改引擎一点儿也不好
级别: 新手上路
可可豆: 31 CB
威望: 31 点
在线时间: 43(时)
发自: Web Page
淡淡的淡淡的淡淡的淡淡的
级别: 侠客
可可豆: 249 CB
威望: 240 点
在线时间: 163(时)
发自: Web Page
我们现在的粒子系统都是直接放在cocos2dStudio的UI或场景上的,你这个类用不着了吧
级别: 新手上路
UID: 352267
可可豆: 103 CB
威望: 95 点
在线时间: 78(时)
发自: Web Page
Pages: 1/2
关注本帖(如果有新回复会站内信通知您)
发帖、回帖都会得到可观的积分奖励。
按"Ctrl+Enter"直接提交
关注CocoaChina
关注微信 每日推荐
扫一扫 关注CVP公众号
扫一扫 浏览移动版【收集】cocos2dx中加载使用plist文件 - CSDN博客
【收集】cocos2dx中加载使用plist文件

只要编辑出粒子效果,那在cocos2d-x引擎中加载plist文件就非常简单了。使用以下代码来读取粒子效果:
Sprite*&pSprite&=&Sprite::create(&IMG1.jpg&);
pSprite-&setPosition(Point(-20&,&0));
pSprite-&setAnchorPoint(Point(0,&0));
this-&addChild(pSprite,&0);
ParticleSystem*&m_emitter1&=&ParticleSystemQuad::create(&snow.plist&);
m_emitter1-&retain();
ParticleBatchNode&*batch&=&ParticleBatchNode::createWithTexture(m_emitter1-&getTexture());
batch-&addChild(m_emitter1);
addChild(batch,&10);
m_emitter1-&release();
这里ParticleBatchNode可以引用且只可以引用1个texture(一个图片文件,一个texture图集),增加到SpriteBatchNode中的ParticleSystem都是在OpenGL ES调用绘图函数时绘制的。
如果ParticleSystem没有增加到ParticleBatchNode中,OpenGL ES会调用每个粒子系统的绘图函数,这样做效率会比较低。
本文已收录于以下专栏:
相关文章推荐
我也不太专业,主要做个记录
把.plist文件放在Resources文件中读取
FileUtils *fu = FileUtils::getInstance();
在【独立开发者er Cocos2d-x实战 004】使用Cocos Studio制作plist文件中,我们已经知道如何制作plist,接下来就说说如何使用和加载plist文件。代码如下:CCSprit...
注:使用的cocos2dx版本为3.10所谓plist文件有两种不同的含义,第一种就是我们今天要说的合图,第二种就是粒子特效
今天我们用到的plist文件是我从别的博主那里下载的 ->下载链接我们先...
cocos2dx-深度解析plist文件(二)(CCSpriteFrameCache怎么从解析出的数据创建精灵帧的)
精灵帧的创建
CCSpriteFrameCache::addSpriteF...
添加引用#include "cocos-ext.h"
using namespace cocos2d::
using namespace cocos2d::
原文地址:http://cn.cocos2d-x.org/tutorial/show?id=556
Cocos2d-x中和Android,Windows都一样,如果在主线程中处理一些耗时操作...
自定义动画简单的说就是,图片按照一定的间隔时间、一定的顺序、一帧一帧的进行播放显示的效果。
在cocos2dx种,有两种方法来实现动画,但是都比较费劲
第一种方法是:
cocos2dx的精灵缓存在创建一组精灵帧,加载瓦片地图,普通动画的创建、骨骼动画等等都会通过plist(parameter list)文件获得需要的信息,建立器游戏中需要的类对象。本文从CCSpri...
今天心血来潮,决定开始写博客。
他的最新文章
讲师:何宇健
讲师:董岩
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)}

我要回帖

更多关于 cocos2dx plist 动画 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信