/// <summary> /// 显示风中粒子 /// </summary> /// <param name="role">所修饰角色</param> /// <param name="equipType">所参照的装备</param> /// <param name="particleType">粒子类型</param> /// <param name="color">颜色</param> /// <param name="amount">量</param> public void ShowWindParticles(RoleBase role, EquipTypes equipType, ParticleTypes particleType, double color, double amount) { ObjectBase equip = role.EquipEntity(equipType); if (!equip.IsVisible) { return; } int distance = 0; double speed = 0; if (role.Action == Actions.Stop) { distance = 40; speed = RandomSeed.Next(2000, 3000) * 0.01; } else { distance = 40; speed = RandomSeed.Next(1000, 1500) * 0.01; } int halfDistance = distance / 2; int obliqueDistance = distance * 2 / 3; Dispatcher.BeginInvoke(delegate { WriteableBitmap writeableBitmap = new WriteableBitmap(equip, null); if (writeableBitmap.Pixels.Count() != 0) { lock (writeableBitmap) { writeableBitmap.Invalidate(); int z = 0; if (equipType == EquipTypes.Weapon) { if (role.State == States.Riding && role.Direction != Directions.South) { z = role.Z + equip.Z + 5; } else { z = role.Z + equip.Z; } } else { z = (role.Direction == Directions.North || role.Direction == Directions.NorthEast || role.Direction == Directions.NorthWest) ? role.Z : role.Z - 20; } z -= role.ZAddition; Point position = equipType == EquipTypes.Overall ? role.Center : equip.Position; Point2D destination = new Point2D(); EffectBase effect = null; if (color == 0) { effect = new MonoChrome() { FilterColor = Colors.White }; } else if (color == 1) { effect = new MonoChrome() { FilterColor = Colors.Black }; } else { effect = new ShiftHue() { HueShift = color }; } switch (role.Direction) { case Directions.North: destination.X = 0; destination.Y = RandomSeed.Next(halfDistance, distance); break; case Directions.NorthEast: destination.X = -RandomSeed.Next(halfDistance, obliqueDistance); destination.Y = RandomSeed.Next(halfDistance, obliqueDistance); break; case Directions.East: destination.X = -RandomSeed.Next(halfDistance, distance); destination.Y = 0; break; case Directions.SouthEast: destination.X = -RandomSeed.Next(halfDistance, obliqueDistance); destination.Y = -RandomSeed.Next(halfDistance, obliqueDistance); break; case Directions.South: destination.X = 0; destination.Y = -RandomSeed.Next(halfDistance, distance); break; case Directions.SouthWest: destination.X = RandomSeed.Next(halfDistance, obliqueDistance); destination.Y = -RandomSeed.Next(halfDistance, obliqueDistance); break; case Directions.West: destination.X = RandomSeed.Next(halfDistance, distance); destination.Y = 0; break; case Directions.NorthWest: destination.X = RandomSeed.Next(halfDistance, obliqueDistance); destination.Y = RandomSeed.Next(halfDistance, obliqueDistance); break; } for (int i = 0; i < amount; i++) { int x = RandomSeed.Next(0, writeableBitmap.PixelWidth); int y = RandomSeed.Next(0, writeableBitmap.PixelHeight); byte[] bytes = BitConverter.GetBytes(writeableBitmap.Pixels[writeableBitmap.PixelWidth * y + x]); if (bytes[3] != 0) { Particle particle = new Particle() { SpaceLayer = role.SpaceLayer, Z = z, Effect = effect, Source = GlobalMethod.GetImage(string.Format("Particle/{0}{1}.png", particleType, RandomSeed.Next(0, 3)), UriType.Project) }; space.Children.Add(particle); EventHandler handler = null; particle.Disposed += handler = (s, e) => { Particle p = s as Particle; p.Disposed -= handler; space.Children.Remove(p); }; double pX = (position.X - x) * particle.Scale; double pY = (position.Y - y) * particle.Scale; particle.Move(new Point(role.Position.X - pX, role.Position.Y - pY), new Point(role.Position.X - pX + destination.X * particle.Scale, role.Position.Y - pY + destination.Y * particle.Scale), speed, MoveModes.Opacity); } } } } }); }
/// <summary> /// 添加随机云雾粒子 /// </summary> void AddRandomCloud() { Particle cloud = new Particle() { Z = 5, Source = GlobalMethod.GetImage(string.Format("Weather/Cloud{0}.png", RandomSeed.Next(6)), UriType.Project) }; AddCloudParticle(cloud); double y = RandomSeed.Next(-50, (int)(backgroundFirst.RealHeight - 50)); cloud.Disposed += new EventHandler(Cloud_Disposed); cloud.Move(new Point(RandomSeed.Next((int)(backgroundFirst.RealWidth), (int)(backgroundFirst.RealWidth * 2)), y), new Point(-400, y), RandomSeed.Next(9, 15), MoveModes.Normal); }
/// <summary> /// 移除云雾粒子 /// </summary> /// <param name="particle"></param> void RemoveCloudParticle(Particle particle) { particle.Disposed -= Cloud_Disposed; particle.Stop(); cloudList.Remove(particle); this.Children.Remove(particle); }
/// <summary> /// 添加云雾粒子 /// </summary> /// <param name="particle"></param> void AddCloudParticle(Particle particle) { cloudList.Add(particle); this.Children.Add(particle); }