public void AwakeFromNib() { //Create the root layer this.rootLayer = CALayer.Layer; //Set the root layer's attributes this.rootLayer.Bounds = CGRect.CGRectMake (0, 0, 640, 480); IntPtr color = CGColor.CreateGenericRGB (0.0, 0.0, 0.0, 1); rootLayer.BackgroundColor = color; CGColor.Release (color); //Load the spark image for the particle String fileName = NSBundle.MainBundle.PathForResourceOfType ("tspark", "png"); IntPtr dataProvider = CGDataProvider.CreateWithFilename (fileName); IntPtr img = CGImage.CreateWithPNGDataProvider (dataProvider, IntPtr.Zero, false, CGColorRenderingIntent.kCGRenderingIntentDefault); this.mortor = CAEmitterLayer.Layer.Retain<CAEmitterLayer>(); this.mortor.EmitterPosition = CGPoint.CGPointMake (320, 0); this.mortor.RenderMode = CAEmitterLayer.kCAEmitterLayerAdditive; //Invisible particle representing the rocket before the explosion CAEmitterCell rocket = CAEmitterCell.EmitterCell.Retain<CAEmitterCell>(); rocket.EmissionLongitude = Math.PI / 2; rocket.EmissionLatitude = 0; rocket.Lifetime = 1.6f; rocket.BirthRate = 1; rocket.Velocity = 400; rocket.VelocityRange = 100; rocket.YAcceleration = -250; rocket.EmissionRange = Math.PI / 4; color = CGColor.CreateGenericRGB (0.5, 0.5, 0.5, 0.5); rocket.Color = color; CGColor.Release (color); rocket.RedRange = 0.5f; rocket.GreenRange = 0.5f; rocket.BlueRange = 0.5f; //Name the cell so that it can be animated later using keypath rocket.Name = "rocket"; //Flare particles emitted from the rocket as it flys CAEmitterCell flare = CAEmitterCell.EmitterCell; flare.ContentsPointer = img; flare.EmissionLongitude = (4 * Math.PI) / 2; flare.Scale = 0.4; flare.Velocity = 100; flare.BirthRate = 45; flare.Lifetime = 1.5f; flare.YAcceleration = -350; flare.EmissionRange = Math.PI / 7; flare.AlphaSpeed = -0.7f; flare.ScaleSpeed = -0.1; flare.ScaleRange = 0.1; flare.BeginTime = 0.01; flare.Duration = 0.7; //The particles that make up the explosion CAEmitterCell firework = CAEmitterCell.EmitterCell; firework.ContentsPointer = img; firework.BirthRate = 9999; firework.Scale = 0.6; firework.Velocity = 130; firework.Lifetime = 2; firework.AlphaSpeed = -0.2f; firework.YAcceleration = -80; firework.BeginTime = 1.5; firework.Duration = 0.1; firework.EmissionRange = 2 * Math.PI; firework.ScaleSpeed = -0.1; firework.Spin = 2; //Name the cell so that it can be animated later using keypath firework.Name = "firework"; //preSpark is an invisible particle used to later emit the spark CAEmitterCell preSpark = CAEmitterCell.EmitterCell; preSpark.BirthRate = 80; preSpark.Velocity = firework.Velocity * 0.70; preSpark.Lifetime = 1.7f; preSpark.YAcceleration = firework.YAcceleration * 0.85; preSpark.BeginTime = firework.BeginTime - 0.2; preSpark.EmissionRange = firework.EmissionRange; preSpark.GreenSpeed = 100; preSpark.BlueSpeed = 100; preSpark.RedSpeed = 100; //Name the cell so that it can be animated later using keypath preSpark.Name = "preSpark"; //The 'sparkle' at the end of a firework CAEmitterCell spark = CAEmitterCell.EmitterCell; spark.ContentsPointer = img; spark.Lifetime = 0.05f; spark.YAcceleration = -250; spark.BeginTime = 0.8; spark.Scale = 0.4; spark.BirthRate = 10; preSpark.EmitterCells = NSArray.ArrayWithObject (spark); rocket.EmitterCells = NSArray.ArrayWithObjects (flare, firework, preSpark, null); mortor.EmitterCells = NSArray.ArrayWithObject (rocket); this.rootLayer.AddSublayer (this.mortor); //Set the view's layer to the base layer theView.Layer = rootLayer; theView.WantsLayer = true; //Force the view to update theView.NeedsDisplay = true; }
public void AwakeFromNib() { //Create the root layer rootLayer = CALayer.Layer; //Set the root layer's background color to black rootLayer.BackgroundColor = CGColor.GetConstantColor(CGColor.kCGColorBlack); //Create the fire emitter layer fireEmitter = CAEmitterLayer.Layer; fireEmitter.EmitterPosition = new CGPoint(225, 50); fireEmitter.EmitterMode = CAEmitterLayer.kCAEmitterLayerOutline; fireEmitter.EmitterShape = CAEmitterLayer.kCAEmitterLayerLine; fireEmitter.RenderMode = CAEmitterLayer.kCAEmitterLayerAdditive; fireEmitter.EmitterSize = new CGSize(0, 0); //Create the smoke emitter layer smokeEmitter = CAEmitterLayer.Layer; smokeEmitter.EmitterPosition = new CGPoint(225, 50); smokeEmitter.EmitterMode = CAEmitterLayer.kCAEmitterLayerPoints; //Create the fire emitter cell CAEmitterCell fire = CAEmitterCell.EmitterCell; fire.EmissionLongitude = (float) Math.PI; fire.BirthRate = 0; fire.Velocity = 80; fire.VelocityRange = 30; fire.EmissionRange = 1.1f; fire.YAcceleration = 200; fire.ScaleSpeed = 0.3f; IntPtr color = CGColor.CreateGenericRGB(0.8f, 0.4f, 0.2f, 0.10f); fire.Color = color; CGColor.Release(color); fire.ContentsPointer = CGImageNamed("fire.png"); //Name the cell so that it can be animated later using keypaths fire.Name = "fire"; //Add the fire emitter cell to the fire emitter layer fireEmitter.EmitterCells = NSArray.ArrayWithObject(fire); //Create the smoke emitter cell CAEmitterCell smoke = CAEmitterCell.EmitterCell; smoke.BirthRate = 11; smoke.EmissionLongitude = (float)(Math.PI / 2); smoke.Lifetime = 0; smoke.Velocity = 40; smoke.VelocityRange = 20; smoke.EmissionRange = (float)(Math.PI / 4); smoke.Spin = 1; smoke.SpinRange = 6; smoke.YAcceleration = 160; smoke.ContentsPointer = CGImageNamed("smoke.png"); smoke.Scale = 0.1f; smoke.AlphaSpeed = -0.12f; smoke.ScaleSpeed = 0.7f; //Name the cell so that it can be animated later using keypaths smoke.Name = "smoke"; //Add the smoke emitter cell to the smoke emitter layer smokeEmitter.EmitterCells = NSArray.ArrayWithObject(smoke); //Add the two emitter layers to the root layer rootLayer.AddSublayer(smokeEmitter); rootLayer.AddSublayer(fireEmitter); //Set the view's layer to the base layer view.Layer = rootLayer; view.WantsLayer = true; //Set the fire simulation to reflect the initial slider position this.SlidersChanged(this); //Force the view to update view.NeedsDisplay = true; }