void CreateSubMagic(RoleBase caster,RoleBase startTarget, RoleBase endTarget, Space space, MagicArgs args) { AnimationBase animation = new AnimationBase() { Code = args.ResCode, Z = startTarget.Z + 1 }; double offsetStartY = (startTarget.State == States.Riding ? (startTarget.Profession == Professions.Taoist ? 130 : 110) : 60) * args.Scale; double offsetEndY = (endTarget.State == States.Riding ? 100 : 50) * args.Scale; Point from = new Point(startTarget.Position.X, startTarget.Position.Y - offsetStartY); Point to = new Point(endTarget.Position.X, endTarget.Position.Y - offsetEndY); RotateTransform rotateTransform = new RotateTransform() { CenterX = animation.Center.X, CenterY = animation.Center.Y, Angle = GlobalMethod.GetAngle(to.Y - from.Y, to.X - from.X) }; ScaleTransform scaleTransform = new ScaleTransform() { CenterX = animation.Center.X, CenterY = animation.Center.Y, ScaleX = (GlobalMethod.GetDistance(startTarget.Position, endTarget.Position) / Convert.ToInt32(args.Tag)), ScaleY = args.Scale }; TransformGroup transformGroup = new TransformGroup(); transformGroup.Children.Add(scaleTransform); transformGroup.Children.Add(rotateTransform); animation.RenderTransform = transformGroup; animation.Position = from; space.AddUIElement(animation); EventHandler handler = null; animation.End += handler = delegate { animation.End -= handler; space.RemoveAnimation(animation); }; animation.HeartStart(); }
void CreateSubMagic(RoleBase caster, Space space, MagicArgs args, int index) { AnimationBase animation = new AnimationBase() { Code = args.ResCode, Z = targets[index].Z + 1, Effect = shiftHue }; double offsetStartY = (caster.State == States.Riding ? (caster.Profession == Professions.Taoist ? 130 : 110) : 60) * caster.Scale; double offsetEndY = (targets[index].State == States.Riding ? 100 : 50) * caster.Scale; Point from = index == 0 ? new Point(args.Position.X, args.Position.Y - offsetStartY) : temp; Point to = new Point(targets[index].Position.X, targets[index].Position.Y - offsetEndY); temp = to; RotateTransform rotateTransform = new RotateTransform() { CenterX = animation.Center.X, CenterY = animation.Center.Y, Angle = GlobalMethod.GetAngle(to.Y - from.Y, to.X - from.X) }; ScaleTransform scaleTransform = new ScaleTransform() { CenterX = animation.Center.X, CenterY = animation.Center.Y, ScaleX = (GlobalMethod.GetDistance(index == 0 ? args.Position : targets[index - 1].Position, targets[index].Position) / 440), //440为其实体宽度,这里用了硬编码 ScaleY = caster.Scale }; TransformGroup transformGroup = new TransformGroup(); transformGroup.Children.Add(scaleTransform); transformGroup.Children.Add(rotateTransform); animation.RenderTransform = transformGroup; animation.Position = from; space.AddUIElement(animation); EventHandler handler = null; animation.End += handler = delegate { animation.End -= handler; space.RemoveAnimation(animation); if (index == targets.Count) { targets.Clear(); } }; animation.HeartStart(); }
public override void Run(RoleBase caster, Space space, MagicArgs args) { double angle = GlobalMethod.GetAngle(GlobalMethod.GetRadian(args.Position, args.Destination)) + 180; double singleAngle = 10; double startAngle = angle - ((args.Number - 1) / 2 * singleAngle); double endAngle = angle + ((args.Number - 1) / 2 * singleAngle); for (int i = 0; i < args.Number; i++) { double otherAngle = startAngle + singleAngle * i; Bullet bullet = new Bullet(new BulletDatas() { Code = args.ResCode, Type = BulletTypes.Common }) { SpaceLayer = caster.SpaceLayer, Z = (int)args.Destination.Y, }; double offsetX = bullet.Source.PixelWidth * bullet.Scale; double offsetStartY = (caster.State == States.Riding ? (caster.Profession == Professions.Taoist ? 130 : 110) : 60) * bullet.Scale; double offsetEndY = 80 * bullet.Scale; EventHandler handler = null; bullet.MoveCompleted += handler = delegate { bullet.MoveCompleted -= handler; space.RemoveUIElement(bullet); }; space.AddUIElement(bullet); Point p = new Point(args.Destination.X + args.Radius * Math.Cos(GlobalMethod.GetRadian(otherAngle)), args.Destination.Y + args.Radius * Math.Sin(GlobalMethod.GetRadian(otherAngle))); bullet.Move(new Point(args.Position.X - offsetX, args.Position.Y - offsetStartY), new Point(p.X - offsetX, p.Y - offsetEndY), 0.6 / bullet.Scale, MoveModes.Normal); } double s0 = 0, s1 = 1, e0 = 0, e1 = 0; if (startAngle < 180 && endAngle > 180) { s0 = startAngle; e0 = 180; s1 = -180; e1 = endAngle - 360; } else if (startAngle >= 180) { s0 = startAngle - 360; e0 = endAngle - 360; } else { s0 = startAngle; e0 = endAngle; } for (int i = space.AllRoles().Count - 1; i >= 0; i--) { RoleBase target = space.AllRoles()[i]; if (caster.IsHostileTo(target)) { double tempAngle = GlobalMethod.GetAngle(GlobalMethod.GetRadian(target.Position, args.Position)); if ((tempAngle >= s0 && tempAngle <= e0) || (tempAngle >= s1 && tempAngle <= e1) || target.InCircle(args.Position, 50)) { caster.CastingToEffect(target, args); } } } }
void CreateSubMagic(RoleBase caster, Space space, MagicArgs args) { Bullet bullet = new Bullet(new BulletDatas() { Code = args.ResCode, Type = BulletTypes.Animation,Loop = true }) { SpaceLayer = caster.SpaceLayer, Z = (int)args.Destination.Y, }; double offsetX = bullet.Offset.X * bullet.Scale; double offsetStartY = (caster.State == States.Riding ? (caster.Profession == Professions.Taoist ? 130 : 110) : 60) * bullet.Scale; double offsetEndY = (targets[index].State == States.Riding ? 100 : 70) * bullet.Scale; EventHandler handler = null; bullet.MoveCompleted += handler = delegate { bullet.MoveCompleted -= handler; space.RemoveUIElement(bullet); if (caster.IsHostileTo(targets[index])) { caster.CastingToEffect(targets[index], args); } index++; if (index == targets.Count) { targets.Clear(); } else { CreateSubMagic(caster, space, args); } }; space.AddUIElement(bullet); bullet.Move(new Point((index == 0 ? args.Position.X : targets[index - 1].Position.X) - offsetX, (index == 0 ? args.Position.Y : targets[index - 1].Position.Y) - offsetStartY), new Point(targets[index].Position.X - offsetX, targets[index].Position.Y - offsetEndY), 0.9 / bullet.Scale, MoveModes.Normal); }
/// <summary> /// 在空间中战斗 /// </summary> /// <param name="space">所处空间</param> public void DoAttackIn(Space space) { if (Target != null) { switch (weapon.AttackType) { case AttackTypes.Close: AttackToHurt(Target); break; case AttackTypes.LongRange: Bullet bullet = new Bullet(weapon.BulletData) { SpaceLayer = this.SpaceLayer, Z = Target.Z, }; double offsetX = bullet.Source.PixelWidth * bullet.Scale; double offsetStartY = (this.State == States.Riding ? (this.Profession == Professions.Taoist ? 130 : 110) : 60) * bullet.Scale; double offsetEndY = (Target.State == States.Riding ? 100 : 70) * bullet.Scale; EventHandler handler = null; bullet.MoveCompleted += handler = delegate { bullet.MoveCompleted -= handler; if (Target != null) { double range = 10 * bullet.Scale; //达到目标时如果在10*10范围内则算命中产生伤害 if (Target.Position.X - offsetX - range < bullet.Position.X && Target.Position.X - offsetX + range > bullet.Position.X && Target.Position.Y - offsetEndY - range < bullet.Position.Y && Target.Position.Y - offsetEndY + range > bullet.Position.Y) { AttackToHurt(Target); } else { Target.ChangeLife(0, ValueEffects.Failure); } } space.RemoveUIElement(bullet); }; space.AddUIElement(bullet); bullet.Move(new Point(this.Position.X - offsetX, this.Position.Y - offsetStartY), new Point(Target.Position.X - offsetX, Target.Position.Y - offsetEndY), weapon.BulletData.Speed / bullet.Scale, MoveModes.Normal); break; } } }