/// <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);
 }