CCParticleSystem是用来设置粒子效果的类
1、粒子分为两种模式:重力模式 和 半径模式
重力模式独占属性:
- gravity 重力方向,Vec2类型,可以分别指定不同方向的重力大小
- speed 粒子运动的速度
- radialAccel 向心加速度
- tangentialAccel 切向加速度
- rotationIsDir 自转方向
半径模式独占属性:
- startRadius 开始半径
- endRadius 结束半径
- rotatePerSecond 每秒旋转多少角度
两种模式共有属性:
- angle 粒子发射时的角度
- duration 发射器的生存时间
- isActive 发射器活动状态(启用/暂停)
- life 粒子生存时间
- emissionRate 粒子的发射率 = _totalParticles / _life
- emitCounter 每秒发射多少粒子
- totalParticles 存在的最大粒子数
- particleCount 目前存在的粒子数量
- totalParticleCountFactor 影响总粒子数的参数 默认为1.0f
- allocatedParticles 存在的最大粒子数,在ParticleSystemQuad中设置粒子时使用
- texture 存储创建粒子的纹理
- startSize/endSize 粒子开始和结束大小
- startColor/endColor 粒子开始和结束颜色
所有的var都是用来表示 差异随机数
2、positionType:用来存储粒子的位置模式
粒子位置有三种模式:FREE、RELATIVE、GROUPED
FREE:(完全自由)粒子发射之后,位置相对于世界坐标系,发射器移动不影响已经发射的粒子
RELATIVE:粒子位置相对于发射器,发射器跟随父节点移动时,粒子也会跟着发射器移动;如果手动(触摸/点击)点击改变了发射器的位置,已经发射出去的粒子还会按照原来的路径移动。
GROUPED:粒子位置相对于发射器,发射器跟随父节点移动时,粒子也会跟着发射器移动了;如果手动(触摸/点击)改变了发射器的位置,粒子和发射器会一起移动,也就是说粒子相对于发射器的位置不会变
3、在initWithDictionary中读取了plist文件中的数据,并进行了赋值,最后通过判断调用setTexture方法来设置粒子
4、粒子的实质是通过读取plist文件存储的纹理数据。
放几段代码
//初始化,这个方法可以配合着cocos2dx DEMO中自带的plist文件阅读
bool ParticleSystem::initWithDictionary(ValueMap& dictionary, const std::string& dirname)
{
bool ret = false;
unsigned char *buffer = nullptr;
unsigned char *deflated = nullptr;
Image *image = nullptr;
do
{
int maxParticles = dictionary["maxParticles"].asInt(); //获取文件中设置的最大粒子个数
// self, not super
//通过粒子个数初始化粒子
if(this->initWithTotalParticles(maxParticles))
{
// Emitter name in particle designer 2.0
_configName = dictionary["configName"].asString();
// angle
_angle = dictionary["angle"].asFloat();
_angleVar = dictionary["angleVariance"].asFloat();
// duration
//发射器的生存时间
_duration = dictionary["duration"].asFloat();
// blend function
if (!_configName.empty())
{
_blendFunc.src = dictionary["blendFuncSource"].asFloat();
}
else
{
_blendFunc.src = dictionary["blendFuncSource"].asInt();
}
_blendFunc.dst = dictionary["blendFuncDestination"].asInt();
// color
//开始颜色
_startColor.r = dictionary["startColorRed"].asFloat();
_startColor.g = dictionary["startColorGreen"].asFloat();
_startColor.b = dictionary["startColorBlue"].asFloat();
_startColor.a = dictionary["startColorAlpha"].asFloat();
//颜色方差
_startColorVar.r = dictionary["startColorVarianceRed"].asFloat();
_startColorVar.g = dictionary["startColorVarianceGreen"].asFloat();
_startColorVar.b = dictionary["startColorVarianceBlue"].asFloat();
_startColorVar.a = dictionary["startColorVarianceAlpha"].asFloat();
//结束颜色
_endColor.r = dictionary["finishColorRed"].asFloat();
_endColor.g = dictionary["finishColorGreen"].asFloat();
_endColor.b = dictionary["finishColorBlue"].asFloat();
_endColor.a = dictionary["finishColorAlpha"].asFloat();
//颜色方差
_endColorVar.r = dictionary["finishColorVarianceRed"].asFloat();
_endColorVar.g = dictionary["finishColorVarianceGreen"].asFloat();
_endColorVar.b = dictionary["finishColorVarianceBlue"].asFloat();
_endColorVar.a = dictionary["finishColorVarianceAlpha"].asFloat();
// particle size
// 粒子 开始和结束 的 大小和方差
_startSize = dictionary["startParticleSize"].asFloat();
_startSizeVar = dictionary["startParticleSizeVariance"].asFloat();
_endSize = dictionary["finishParticleSize"].asFloat();
_endSizeVar = dictionary["finishParticleSizeVariance"].asFloat();
// position
float x = dictionary["sourcePositionx"].asFloat();
float y = dictionary["sourcePositiony"].asFloat();
if(!_sourcePositionCompatible