bool UpdateParticle(ref CCParticleGravity particleGrav, float dt) { if (UpdateParticleBase(ref particleGrav.ParticleBase, dt)) { float radial_x = 0; float radial_y = 0; float tmp_x, tmp_y; float tangential_x, tangential_y; CCPoint pos = particleGrav.ParticleBase.Position; float x = pos.X; float y = pos.Y; if (x != 0 || y != 0) { float l = 1.0f / (float)Math.Sqrt(x * x + y * y); radial_x = x * l; radial_y = y * l; } tangential_x = radial_x; tangential_y = radial_y; float radialAccel = particleGrav.RadialAccel; radial_x *= radialAccel; radial_y *= radialAccel; float tangentAccel = particleGrav.TangentialAccel; float newy = tangential_x; tangential_x = -tangential_y; tangential_y = newy; tangential_x *= tangentAccel; tangential_y *= tangentAccel; CCPoint gravity = GravityMode.Gravity; tmp_x = (radial_x + tangential_x + gravity.X) * dt; tmp_y = (radial_y + tangential_y + gravity.Y) * dt; CCPoint direction = particleGrav.Direction; direction.X += tmp_x; direction.Y += tmp_y; particleGrav.Direction = direction; CCPoint position = particleGrav.ParticleBase.Position; position.X += direction.X * dt; position.Y += direction.Y * dt; particleGrav.ParticleBase.Position = position; return(true); } return(false); }
CCParticleSystem(int numberOfParticles, bool shouldAllocParticles, CCEmitterMode emitterMode = CCEmitterMode.Gravity) { TotalParticles = numberOfParticles; AllocatedParticles = numberOfParticles; PositionType = CCPositionType.Free; EmitterMode = emitterMode; IsActive = true; AutoRemoveOnFinish = false; if (shouldAllocParticles) { if (emitterMode == CCEmitterMode.Gravity) { GravityParticles = new CCParticleGravity[numberOfParticles]; } else { RadialParticles = new CCParticleRadial[numberOfParticles]; } } }
// Initialise particle void InitParticle(ref CCParticleGravity particleGrav, ref CCParticleBase particleBase) { InitParticleBase(ref particleBase); // direction float a = MathHelper.ToRadians(Angle + AngleVar * CCRandom.Float_Minus1_1()); if (EmitterMode == CCEmitterMode.Gravity) { CCPoint v = new CCPoint(CCMathHelper.Cos(a), CCMathHelper.Sin(a)); float s = GravityMode.Speed + GravityMode.SpeedVar * CCRandom.Float_Minus1_1(); particleGrav.Direction = v * s; particleGrav.RadialAccel = GravityMode.RadialAccel + GravityMode.RadialAccelVar * CCRandom.Float_Minus1_1(); particleGrav.TangentialAccel = GravityMode.TangentialAccel + GravityMode.TangentialAccelVar * CCRandom.Float_Minus1_1(); if (GravityMode.RotationIsDir) { particleBase.Rotation = -MathHelper.ToDegrees(CCPoint.ToAngle(particleGrav.Direction)); } } }
public CCParticleSystem(CCParticleSystemConfig particleConfig) : this(particleConfig.MaxParticles, false) { Duration = particleConfig.Duration;; Life = particleConfig.Life; LifeVar = particleConfig.LifeVar; EmissionRate = TotalParticles / Life; Angle = particleConfig.Angle; AngleVar = particleConfig.AngleVar; CCBlendFunc blendFunc = new CCBlendFunc(); blendFunc.Source = particleConfig.BlendFunc.Source; blendFunc.Destination = particleConfig.BlendFunc.Destination; BlendFunc = blendFunc; CCColor4F startColor = new CCColor4F(); startColor.R = particleConfig.StartColor.R; startColor.G = particleConfig.StartColor.G; startColor.B = particleConfig.StartColor.B; startColor.A = particleConfig.StartColor.A; StartColor = startColor; CCColor4F startColorVar = new CCColor4F(); startColorVar.R = particleConfig.StartColorVar.R; startColorVar.G = particleConfig.StartColorVar.G; startColorVar.B = particleConfig.StartColorVar.B; startColorVar.A = particleConfig.StartColorVar.A; StartColorVar = startColorVar; CCColor4F endColor = new CCColor4F(); endColor.R = particleConfig.EndColor.R; endColor.G = particleConfig.EndColor.G; endColor.B = particleConfig.EndColor.B; endColor.A = particleConfig.EndColor.A; EndColor = endColor; CCColor4F endColorVar = new CCColor4F(); endColorVar.R = particleConfig.EndColorVar.R; endColorVar.G = particleConfig.EndColorVar.G; endColorVar.B = particleConfig.EndColorVar.B; endColorVar.A = particleConfig.EndColorVar.A; EndColorVar = endColorVar; StartSize = particleConfig.StartSize; StartSizeVar = particleConfig.StartSizeVar; EndSize = particleConfig.EndSize; EndSizeVar = particleConfig.EndSizeVar; CCPoint position; position.X = particleConfig.Position.X; position.Y = particleConfig.Position.Y; Position = position; CCPoint positionVar; positionVar.X = particleConfig.PositionVar.X; positionVar.Y = particleConfig.PositionVar.X; PositionVar = positionVar; StartSpin = particleConfig.StartSpin; StartSpinVar = particleConfig.StartSpinVar; EndSpin = particleConfig.EndSpin; EndSpinVar = particleConfig.EndSpinVar; EmitterMode = particleConfig.EmitterMode; if (EmitterMode == CCEmitterMode.Gravity) { GravityParticles = new CCParticleGravity[TotalParticles]; GravityMoveMode newGravityMode = new GravityMoveMode(); CCPoint gravity; gravity.X = particleConfig.Gravity.X; gravity.Y = particleConfig.Gravity.Y; newGravityMode.Gravity = gravity; newGravityMode.Speed = particleConfig.GravitySpeed; newGravityMode.SpeedVar = particleConfig.GravitySpeedVar; newGravityMode.RadialAccel = particleConfig.GravityRadialAccel; newGravityMode.RadialAccelVar = particleConfig.GravityRadialAccelVar; newGravityMode.TangentialAccel = particleConfig.GravityTangentialAccel; newGravityMode.TangentialAccelVar = particleConfig.GravityTangentialAccelVar; newGravityMode.RotationIsDir = particleConfig.GravityRotationIsDir; GravityMode = newGravityMode; } else if (EmitterMode == CCEmitterMode.Radius) { RadialParticles = new CCParticleRadial[TotalParticles]; RadialMoveMode newRadialMode = new RadialMoveMode(); newRadialMode.StartRadius = particleConfig.RadialStartRadius; newRadialMode.StartRadiusVar = particleConfig.RadialStartRadiusVar; newRadialMode.EndRadius = particleConfig.RadialEndRadius; newRadialMode.EndRadiusVar = particleConfig.RadialEndRadiusVar; newRadialMode.RotatePerSecond = particleConfig.RadialRotatePerSecond; newRadialMode.RotatePerSecondVar = particleConfig.RadialRotatePerSecondVar; RadialMode = newRadialMode; } else { Debug.Assert(false, "Invalid emitterType in config file"); return; } // Don't get the internal texture if a batchNode is used if (BatchNode == null) { Texture = particleConfig.Texture; } }
bool UpdateParticle(ref CCParticleGravity particleGrav, float dt) { if(UpdateParticleBase(ref particleGrav.ParticleBase, dt)) { float radial_x = 0; float radial_y = 0; float tmp_x, tmp_y; float tangential_x, tangential_y; CCPoint pos = particleGrav.ParticleBase.Position; float x = pos.X; float y = pos.Y; if (x != 0 || y != 0) { float l = 1.0f / (float) Math.Sqrt(x * x + y * y); radial_x = x * l; radial_y = y * l; } tangential_x = radial_x; tangential_y = radial_y; float radialAccel = particleGrav.RadialAccel; radial_x *= radialAccel; radial_y *= radialAccel; float tangentAccel = particleGrav.TangentialAccel; float newy = tangential_x; tangential_x = -tangential_y; tangential_y = newy; tangential_x *= tangentAccel; tangential_y *= tangentAccel; CCPoint gravity = GravityMode.Gravity; tmp_x = (radial_x + tangential_x + gravity.X) * dt; tmp_y = (radial_y + tangential_y + gravity.Y) * dt; CCPoint direction = particleGrav.Direction; direction.X += tmp_x; direction.Y += tmp_y; particleGrav.Direction = direction; CCPoint position = particleGrav.ParticleBase.Position; position.X += direction.X * dt; position.Y += direction.Y * dt; particleGrav.ParticleBase.Position = position; return true; } return false; }
// Initialise particle void InitParticle(ref CCParticleGravity particleGrav, ref CCParticleBase particleBase) { InitParticleBase(ref particleBase); // direction float a = MathHelper.ToRadians(Angle + AngleVar * CCRandom.Float_Minus1_1()); if(EmitterMode == CCEmitterMode.Gravity) { CCPoint v = new CCPoint(CCMathHelper.Cos(a), CCMathHelper.Sin(a)); float s = GravityMode.Speed + GravityMode.SpeedVar * CCRandom.Float_Minus1_1(); particleGrav.Direction = v * s; particleGrav.RadialAccel = GravityMode.RadialAccel + GravityMode.RadialAccelVar * CCRandom.Float_Minus1_1(); particleGrav.TangentialAccel = GravityMode.TangentialAccel + GravityMode.TangentialAccelVar * CCRandom.Float_Minus1_1(); if (GravityMode.RotationIsDir) { particleBase.Rotation = -MathHelper.ToDegrees(CCPoint.ToAngle(particleGrav.Direction)); } } }
public CCParticleSystem(CCParticleSystemConfig particleConfig) : this(particleConfig.MaxParticles, false) { Duration = particleConfig.Duration;; Life = particleConfig.Life; LifeVar = particleConfig.LifeVar; EmissionRate = TotalParticles / Life; Angle = particleConfig.Angle; AngleVar = particleConfig.AngleVar; CCColor4F startColor = new CCColor4F(); startColor.R = particleConfig.StartColor.R; startColor.G = particleConfig.StartColor.G; startColor.B = particleConfig.StartColor.B; startColor.A = particleConfig.StartColor.A; StartColor = startColor; CCColor4F startColorVar = new CCColor4F(); startColorVar.R = particleConfig.StartColorVar.R; startColorVar.G = particleConfig.StartColorVar.G; startColorVar.B = particleConfig.StartColorVar.B; startColorVar.A = particleConfig.StartColorVar.A; StartColorVar = startColorVar; CCColor4F endColor = new CCColor4F(); endColor.R = particleConfig.EndColor.R; endColor.G = particleConfig.EndColor.G; endColor.B = particleConfig.EndColor.B; endColor.A = particleConfig.EndColor.A; EndColor = endColor; CCColor4F endColorVar = new CCColor4F(); endColorVar.R = particleConfig.EndColorVar.R; endColorVar.G = particleConfig.EndColorVar.G; endColorVar.B = particleConfig.EndColorVar.B; endColorVar.A = particleConfig.EndColorVar.A; EndColorVar = endColorVar; StartSize = particleConfig.StartSize; StartSizeVar = particleConfig.StartSizeVar; EndSize = particleConfig.EndSize; EndSizeVar = particleConfig.EndSizeVar; CCPoint position; position.X = particleConfig.Position.X; position.Y = particleConfig.Position.Y; Position = position; CCPoint positionVar; positionVar.X = particleConfig.PositionVar.X; positionVar.Y = particleConfig.PositionVar.X; PositionVar = positionVar; StartSpin = particleConfig.StartSpin; StartSpinVar = particleConfig.StartSpinVar; EndSpin = particleConfig.EndSpin; EndSpinVar = particleConfig.EndSpinVar; EmitterMode = particleConfig.EmitterMode; if (EmitterMode == CCEmitterMode.Gravity) { GravityParticles = new CCParticleGravity[TotalParticles]; GravityMoveMode newGravityMode = new GravityMoveMode(); CCPoint gravity; gravity.X = particleConfig.Gravity.X; gravity.Y = particleConfig.Gravity.Y; newGravityMode.Gravity = gravity; newGravityMode.Speed = particleConfig.GravitySpeed; newGravityMode.SpeedVar = particleConfig.GravitySpeedVar; newGravityMode.RadialAccel = particleConfig.GravityRadialAccel; newGravityMode.RadialAccelVar = particleConfig.GravityRadialAccelVar; newGravityMode.TangentialAccel = particleConfig.GravityTangentialAccel; newGravityMode.TangentialAccelVar = particleConfig.GravityTangentialAccelVar; newGravityMode.RotationIsDir = particleConfig.GravityRotationIsDir; GravityMode = newGravityMode; } else if (EmitterMode == CCEmitterMode.Radius) { RadialParticles = new CCParticleRadial[TotalParticles]; RadialMoveMode newRadialMode = new RadialMoveMode(); newRadialMode.StartRadius = particleConfig.RadialStartRadius; newRadialMode.StartRadiusVar = particleConfig.RadialStartRadiusVar; newRadialMode.EndRadius = particleConfig.RadialEndRadius; newRadialMode.EndRadiusVar = particleConfig.RadialEndRadiusVar; newRadialMode.RotatePerSecond = particleConfig.RadialRotatePerSecond; newRadialMode.RotatePerSecondVar = particleConfig.RadialRotatePerSecondVar; RadialMode = newRadialMode; } else { Debug.Assert(false, "Invalid emitterType in config file"); return; } }
CCParticleSystem(int numberOfParticles, bool shouldAllocParticles, CCEmitterMode emitterMode = CCEmitterMode.Gravity) { TotalParticles = numberOfParticles; AllocatedParticles = numberOfParticles; PositionType = CCPositionType.Free; EmitterMode = emitterMode; IsActive = true; AutoRemoveOnFinish = false; if(shouldAllocParticles) { if (emitterMode == CCEmitterMode.Gravity) { GravityParticles = new CCParticleGravity[numberOfParticles]; } else { RadialParticles = new CCParticleRadial[numberOfParticles]; } } }