// Update particle bool UpdateParticleBase(ref CCParticleBase particleBase, float dt) { particleBase.TimeToLive -= dt; if (particleBase.TimeToLive > 0) { CCColor4F color = particleBase.Color; color.R += (particleBase.DeltaColor.R * dt); color.G += (particleBase.DeltaColor.G * dt); color.B += (particleBase.DeltaColor.B * dt); color.A += (particleBase.DeltaColor.A * dt); particleBase.Color = color; particleBase.Size += (particleBase.DeltaSize * dt); if (particleBase.Size < 0) { particleBase.Size = 0; } particleBase.Rotation += (particleBase.DeltaRotation * dt); return(true); } return(false); }
void InitParticleBase(ref CCParticleBase particleBase) { float timeToLive = Math.Max(0, Life + LifeVar * CCRandom.Float_Minus1_1()); particleBase.TimeToLive = timeToLive; CCPoint particlePos; particlePos.X = SourcePosition.X + PositionVar.X * CCRandom.Float_Minus1_1(); particlePos.Y = SourcePosition.Y + PositionVar.Y * CCRandom.Float_Minus1_1(); particleBase.Position = particlePos; CCColor4F start = new CCColor4F(); start.R = MathHelper.Clamp(StartColor.R + StartColorVar.R * CCRandom.Float_Minus1_1(), 0, 1); start.G = MathHelper.Clamp(StartColor.G + StartColorVar.G * CCRandom.Float_Minus1_1(), 0, 1); start.B = MathHelper.Clamp(StartColor.B + StartColorVar.B * CCRandom.Float_Minus1_1(), 0, 1); start.A = MathHelper.Clamp(StartColor.A + StartColorVar.A * CCRandom.Float_Minus1_1(), 0, 1); particleBase.Color = start; CCColor4F end = new CCColor4F(); end.R = MathHelper.Clamp(EndColor.R + EndColorVar.R * CCRandom.Float_Minus1_1(), 0, 1); end.G = MathHelper.Clamp(EndColor.G + EndColorVar.G * CCRandom.Float_Minus1_1(), 0, 1); end.B = MathHelper.Clamp(EndColor.B + EndColorVar.B * CCRandom.Float_Minus1_1(), 0, 1); end.A = MathHelper.Clamp(EndColor.A + EndColorVar.A * CCRandom.Float_Minus1_1(), 0, 1); CCColor4F deltaColor = new CCColor4F(); deltaColor.R = (end.R - start.R) / timeToLive; deltaColor.G = (end.G - start.G) / timeToLive; deltaColor.B = (end.B - start.B) / timeToLive; deltaColor.A = (end.A - start.A) / timeToLive; particleBase.DeltaColor = deltaColor; float startSize = Math.Max(0, StartSize + StartSizeVar * CCRandom.Float_Minus1_1()); particleBase.Size = startSize; if (EndSize == ParticleStartSizeEqualToEndSize) { particleBase.DeltaSize = 0; } else { float endS = EndSize + EndSizeVar * CCRandom.Float_Minus1_1(); endS = Math.Max(0, endS); particleBase.DeltaSize = (endS - startSize) / timeToLive; } float startSpin = StartSpin + StartSpinVar * CCRandom.Float_Minus1_1(); float endSpin = EndSpin + EndSpinVar * CCRandom.Float_Minus1_1(); particleBase.Rotation = startSpin; particleBase.DeltaRotation = (endSpin - startSpin) / timeToLive; particleBase.StartPosition = Position; }
void InitParticle(ref CCParticleRadial particleRadial, ref CCParticleBase particleBase) { InitParticleBase(ref particleBase); // direction float a = MathHelper.ToRadians(Angle + AngleVar * CCRandom.Float_Minus1_1()); // Set the default diameter of the particle from the source position float startRadius = RadialMode.StartRadius + RadialMode.StartRadiusVar * CCRandom.Float_Minus1_1(); float endRadius = RadialMode.EndRadius + RadialMode.EndRadiusVar * CCRandom.Float_Minus1_1(); particleRadial.Radius = startRadius; particleRadial.DeltaRadius = (RadialMode.EndRadius == ParticleStartRadiusEqualToEndRadius) ? 0 : (endRadius - startRadius) / particleBase.TimeToLive; particleRadial.Angle = a; particleRadial.DegreesPerSecond = MathHelper.ToRadians(RadialMode.RotatePerSecond + RadialMode.RotatePerSecondVar * CCRandom.Float_Minus1_1()); }
// 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)); } } }
void UpdateQuad(ref CCV3F_C4B_T2F_Quad quad, ref CCParticleBase particle) { CCPoint newPosition; if(PositionType == CCPositionType.Free || PositionType == CCPositionType.Relative) { newPosition.X = particle.Position.X - (currentPosition.X - particle.StartPosition.X); newPosition.Y = particle.Position.Y - (currentPosition.Y - particle.StartPosition.Y); } else { newPosition = particle.Position; } // translate newPos to correct position, since matrix transform isn't performed in batchnode // don't update the particle with the new position information, it will interfere with the radius and tangential calculations if(BatchNode != null) { newPosition.X += Position.X; newPosition.Y += Position.Y; } CCColor4B color = new CCColor4B(); if(OpacityModifyRGB) { color.R = (byte) (particle.Color.R * particle.Color.A * 255); color.G = (byte) (particle.Color.G * particle.Color.A * 255); color.B = (byte) (particle.Color.B * particle.Color.A * 255); color.A = (byte)(particle.Color.A * 255); } else { color.R = (byte)(particle.Color.R * 255); color.G = (byte)(particle.Color.G * 255); color.B = (byte)(particle.Color.B * 255); color.A = (byte)(particle.Color.A * 255); } quad.BottomLeft.Colors = color; quad.BottomRight.Colors = color; quad.TopLeft.Colors = color; quad.TopRight.Colors = color; // vertices float size_2 = particle.Size / 2; if (particle.Rotation != 0.0) { float x1 = -size_2; float y1 = -size_2; float x2 = size_2; float y2 = size_2; float x = newPosition.X; float y = newPosition.Y; float r = -CCMathHelper.ToRadians(particle.Rotation); float cr = CCMathHelper.Cos(r); float sr = CCMathHelper.Sin(r); float ax = x1 * cr - y1 * sr + x; float ay = x1 * sr + y1 * cr + y; float bx = x2 * cr - y1 * sr + x; float by = x2 * sr + y1 * cr + y; float cx = x2 * cr - y2 * sr + x; float cy = x2 * sr + y2 * cr + y; float dx = x1 * cr - y2 * sr + x; float dy = x1 * sr + y2 * cr + y; // bottom-left quad.BottomLeft.Vertices.X = ax; quad.BottomLeft.Vertices.Y = ay; // bottom-right vertex: quad.BottomRight.Vertices.X = bx; quad.BottomRight.Vertices.Y = by; // top-left vertex: quad.TopLeft.Vertices.X = dx; quad.TopLeft.Vertices.Y = dy; // top-right vertex: quad.TopRight.Vertices.X = cx; quad.TopRight.Vertices.Y = cy; } else { // bottom-left vertex: quad.BottomLeft.Vertices.X = newPosition.X - size_2; quad.BottomLeft.Vertices.Y = newPosition.Y - size_2; // bottom-right vertex: quad.BottomRight.Vertices.X = newPosition.X + size_2; quad.BottomRight.Vertices.Y = newPosition.Y - size_2; // top-left vertex: quad.TopLeft.Vertices.X = newPosition.X - size_2; quad.TopLeft.Vertices.Y = newPosition.Y + size_2; // top-right vertex: quad.TopRight.Vertices.X = newPosition.X + size_2; quad.TopRight.Vertices.Y = newPosition.Y + size_2; } }
void UpdateQuad(ref CCV3F_C4B_T2F_Quad quad, ref CCParticleBase particle) { CCPoint newPosition; if (PositionType == CCPositionType.Free) { newPosition.X = particle.Position.X - (currentPosition.X - particle.StartPosition.X); newPosition.Y = particle.Position.Y - (currentPosition.Y - particle.StartPosition.Y); } else { newPosition = particle.Position; } CCColor4B color = new CCColor4B(); if (OpacityModifyRGB) { color.R = (byte)(particle.Color.R * particle.Color.A * 255); color.G = (byte)(particle.Color.G * particle.Color.A * 255); color.B = (byte)(particle.Color.B * particle.Color.A * 255); color.A = (byte)(particle.Color.A * 255); } else { color.R = (byte)(particle.Color.R * 255); color.G = (byte)(particle.Color.G * 255); color.B = (byte)(particle.Color.B * 255); color.A = (byte)(particle.Color.A * 255); } quad.BottomLeft.Colors = color; quad.BottomRight.Colors = color; quad.TopLeft.Colors = color; quad.TopRight.Colors = color; // vertices float size_2 = particle.Size / 2; if (particle.Rotation != 0.0) { float x1 = -size_2; float y1 = -size_2; float x2 = size_2; float y2 = size_2; float x = newPosition.X; float y = newPosition.Y; float r = -CCMathHelper.ToRadians(particle.Rotation); float cr = CCMathHelper.Cos(r); float sr = CCMathHelper.Sin(r); float ax = x1 * cr - y1 * sr + x; float ay = x1 * sr + y1 * cr + y; float bx = x2 * cr - y1 * sr + x; float by = x2 * sr + y1 * cr + y; float cx = x2 * cr - y2 * sr + x; float cy = x2 * sr + y2 * cr + y; float dx = x1 * cr - y2 * sr + x; float dy = x1 * sr + y2 * cr + y; // bottom-left quad.BottomLeft.Vertices.X = ax; quad.BottomLeft.Vertices.Y = ay; // bottom-right vertex: quad.BottomRight.Vertices.X = bx; quad.BottomRight.Vertices.Y = by; // top-left vertex: quad.TopLeft.Vertices.X = dx; quad.TopLeft.Vertices.Y = dy; // top-right vertex: quad.TopRight.Vertices.X = cx; quad.TopRight.Vertices.Y = cy; } else { // bottom-left vertex: quad.BottomLeft.Vertices.X = newPosition.X - size_2; quad.BottomLeft.Vertices.Y = newPosition.Y - size_2; // bottom-right vertex: quad.BottomRight.Vertices.X = newPosition.X + size_2; quad.BottomRight.Vertices.Y = newPosition.Y - size_2; // top-left vertex: quad.TopLeft.Vertices.X = newPosition.X - size_2; quad.TopLeft.Vertices.Y = newPosition.Y + size_2; // top-right vertex: quad.TopRight.Vertices.X = newPosition.X + size_2; quad.TopRight.Vertices.Y = newPosition.Y + size_2; } }
// Update particle bool UpdateParticleBase(ref CCParticleBase particleBase, float dt) { particleBase.TimeToLive -= dt; if(particleBase.TimeToLive > 0) { CCColor4F color = particleBase.Color; color.R += (particleBase.DeltaColor.R * dt); color.G += (particleBase.DeltaColor.G * dt); color.B += (particleBase.DeltaColor.B * dt); color.A += (particleBase.DeltaColor.A * dt); particleBase.Color = color; particleBase.Size += (particleBase.DeltaSize * dt); if(particleBase.Size < 0) { particleBase.Size = 0; } particleBase.Rotation += (particleBase.DeltaRotation * dt); return true; } return false; }
void InitParticleBase(ref CCParticleBase particleBase) { float timeToLive = Math.Max(0, Life + LifeVar * CCRandom.Float_Minus1_1()); particleBase.TimeToLive = timeToLive; CCPoint particlePos; particlePos.X = SourcePosition.X + PositionVar.X * CCRandom.Float_Minus1_1(); particlePos.Y = SourcePosition.Y + PositionVar.Y * CCRandom.Float_Minus1_1(); particleBase.Position = particlePos; CCColor4F start = new CCColor4F(); start.R = MathHelper.Clamp(StartColor.R + StartColorVar.R * CCRandom.Float_Minus1_1(), 0, 1); start.G = MathHelper.Clamp(StartColor.G + StartColorVar.G * CCRandom.Float_Minus1_1(), 0, 1); start.B = MathHelper.Clamp(StartColor.B + StartColorVar.B * CCRandom.Float_Minus1_1(), 0, 1); start.A = MathHelper.Clamp(StartColor.A + StartColorVar.A * CCRandom.Float_Minus1_1(), 0, 1); particleBase.Color = start; CCColor4F end = new CCColor4F(); end.R = MathHelper.Clamp(EndColor.R + EndColorVar.R * CCRandom.Float_Minus1_1(), 0, 1); end.G = MathHelper.Clamp(EndColor.G + EndColorVar.G * CCRandom.Float_Minus1_1(), 0, 1); end.B = MathHelper.Clamp(EndColor.B + EndColorVar.B * CCRandom.Float_Minus1_1(), 0, 1); end.A = MathHelper.Clamp(EndColor.A + EndColorVar.A * CCRandom.Float_Minus1_1(), 0, 1); CCColor4F deltaColor = new CCColor4F(); deltaColor.R = (end.R - start.R) / timeToLive; deltaColor.G = (end.G - start.G) / timeToLive; deltaColor.B = (end.B - start.B) / timeToLive; deltaColor.A = (end.A - start.A) / timeToLive; particleBase.DeltaColor = deltaColor; float startSize = Math.Max(0, StartSize + StartSizeVar * CCRandom.Float_Minus1_1()); particleBase.Size = startSize; if (EndSize == ParticleStartSizeEqualToEndSize) { particleBase.DeltaSize = 0; } else { float endS = EndSize + EndSizeVar * CCRandom.Float_Minus1_1(); endS = Math.Max(0, endS); particleBase.DeltaSize = (endS - startSize) / timeToLive; } float startSpin = StartSpin + StartSpinVar * CCRandom.Float_Minus1_1(); float endSpin = EndSpin + EndSpinVar * CCRandom.Float_Minus1_1(); particleBase.Rotation = startSpin; particleBase.DeltaRotation = (endSpin - startSpin) / timeToLive; if (PositionType == CCPositionType.Free) { particleBase.StartPosition = Layer.VisibleBoundsWorldspace.Origin; } else if (PositionType == CCPositionType.Relative) { particleBase.StartPosition = Position; } }
void InitParticle(ref CCParticleRadial particleRadial, ref CCParticleBase particleBase) { InitParticleBase(ref particleBase); // direction float a = MathHelper.ToRadians(Angle + AngleVar * CCRandom.Float_Minus1_1()); // Set the default diameter of the particle from the source position float startRadius = RadialMode.StartRadius + RadialMode.StartRadiusVar * CCRandom.Float_Minus1_1(); float endRadius = RadialMode.EndRadius + RadialMode.EndRadiusVar * CCRandom.Float_Minus1_1(); particleRadial.Radius = startRadius; particleRadial.DeltaRadius = (RadialMode.EndRadius == ParticleStartRadiusEqualToEndRadius) ? 0 : (endRadius - startRadius) / particleBase.TimeToLive; particleRadial.Angle = a; particleRadial.DegreesPerSecond = MathHelper.ToRadians(RadialMode.RotatePerSecond + RadialMode.RotatePerSecondVar * CCRandom.Float_Minus1_1()); }
// 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)); } } }
void UpdateQuad(ref CCV3F_C4B_T2F_Quad quad, ref CCParticleBase particle) { CCPoint newPosition; if (PositionType == CCPositionType.Free || PositionType == CCPositionType.Relative) { newPosition.X = particle.Position.X - (currentPosition.X - particle.StartPosition.X); newPosition.Y = particle.Position.Y - (currentPosition.Y - particle.StartPosition.Y); } else { newPosition = particle.Position; } // translate newPos to correct position, since matrix transform isn't performed in batchnode // don't update the particle with the new position information, it will interfere with the radius and tangential calculations if (BatchNode != null) { newPosition.X += Position.X; newPosition.Y += Position.Y; } CCColor4B color = new CCColor4B(); if (OpacityModifyRGB) { color.R = (byte)(particle.Color.R * particle.Color.A * 255); color.G = (byte)(particle.Color.G * particle.Color.A * 255); color.B = (byte)(particle.Color.B * particle.Color.A * 255); color.A = (byte)(particle.Color.A * 255); } else { color.R = (byte)(particle.Color.R * 255); color.G = (byte)(particle.Color.G * 255); color.B = (byte)(particle.Color.B * 255); color.A = (byte)(particle.Color.A * 255); } quad.BottomLeft.Colors = color; quad.BottomRight.Colors = color; quad.TopLeft.Colors = color; quad.TopRight.Colors = color; // vertices float size_2 = particle.Size / 2; if (particle.Rotation != 0.0) { float x1 = -size_2; float y1 = -size_2; float x2 = size_2; float y2 = size_2; float x = newPosition.X; float y = newPosition.Y; float r = -CCMathHelper.ToRadians(particle.Rotation); float cr = CCMathHelper.Cos(r); float sr = CCMathHelper.Sin(r); float ax = x1 * cr - y1 * sr + x; float ay = x1 * sr + y1 * cr + y; float bx = x2 * cr - y1 * sr + x; float by = x2 * sr + y1 * cr + y; float cx = x2 * cr - y2 * sr + x; float cy = x2 * sr + y2 * cr + y; float dx = x1 * cr - y2 * sr + x; float dy = x1 * sr + y2 * cr + y; // bottom-left quad.BottomLeft.Vertices.X = ax; quad.BottomLeft.Vertices.Y = ay; // bottom-right vertex: quad.BottomRight.Vertices.X = bx; quad.BottomRight.Vertices.Y = by; // top-left vertex: quad.TopLeft.Vertices.X = dx; quad.TopLeft.Vertices.Y = dy; // top-right vertex: quad.TopRight.Vertices.X = cx; quad.TopRight.Vertices.Y = cy; } else { // bottom-left vertex: quad.BottomLeft.Vertices.X = newPosition.X - size_2; quad.BottomLeft.Vertices.Y = newPosition.Y - size_2; // bottom-right vertex: quad.BottomRight.Vertices.X = newPosition.X + size_2; quad.BottomRight.Vertices.Y = newPosition.Y - size_2; // top-left vertex: quad.TopLeft.Vertices.X = newPosition.X - size_2; quad.TopLeft.Vertices.Y = newPosition.Y + size_2; // top-right vertex: quad.TopRight.Vertices.X = newPosition.X + size_2; quad.TopRight.Vertices.Y = newPosition.Y + size_2; } }