private static void ProcessNextTask(MoveBehavior behavior) { if (tasks.Count == 0) { behavior.Instruction.Robot.IsMoving = false; } else { tasks.First()(); } //DoEvents(); }
private static void MoveLeft(MoveBehavior move, Instruction instruction, double seconds = .5) { AppDispatcher.BeginInvoke(new Action(() => { DoubleAnimation anim = new DoubleAnimation(); anim.From = (double)converter.Convert(instruction.Robot.Left, null, "L", null); anim.To = (double)converter.Convert(instruction.Position.X, null, "L", null); anim.Duration = new Duration(TimeSpan.FromSeconds(seconds)); anim.Completed += (oo, ee) => { move.Instruction.Robot.SetCurrentLeft(instruction.Position.X); tasks.Dequeue(); ProcessNextTask(move); }; instruction.Robot.IsMoving = true; move.Element.BeginAnimation(Canvas.LeftProperty, anim); })); }
private static void OnInstructionChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e) { if (e.NewValue == null) { return; } MoveBehavior move = sender as MoveBehavior; if (move.Element == null) { return; } Instruction instruction = e.NewValue as Instruction; if (Canvas.GetLeft(move.Element) != (double)converter.Convert(instruction.Position.X, null, "L", null)) { tasks.Enqueue(() => { MoveLeft(move, instruction, 0); }); } if (Canvas.GetTop(move.Element) != (double)converter.Convert(instruction.Position.Y, null, "T", null)) { tasks.Enqueue(() => { MoveTop(move, instruction, 0); }); } tasks.Enqueue(() => { Rotate(move, (double)instruction.InitialDirection); }); foreach (var m in instruction.Moves) { tasks.Enqueue(() => { switch (m.ToLower()) { case "m": { switch (instruction.Robot.Direction) { case DirectionTypes.East: { var currenttop = Canvas.GetTop(move.Element); var result = (instruction.Position.X + 1); if (result > 10) { tasks.Dequeue(); ProcessNextTask(move); break; } instruction.Position = new Point(result, instruction.Position.Y); MoveLeft(move, instruction); } break; case DirectionTypes.West: { var result = (instruction.Position.X - 1); if (result < 0) { tasks.Dequeue(); ProcessNextTask(move); break; } instruction.Position = new Point(result, instruction.Position.Y); MoveLeft(move, instruction); } break; case DirectionTypes.North: { var result = (instruction.Position.Y + 1); if (result > 10) { tasks.Dequeue(); ProcessNextTask(move); break; } instruction.Position = new Point(instruction.Position.X, result); MoveTop(move, instruction); } break; case DirectionTypes.South: { var result = (instruction.Position.Y - 1); if (result < 0) { tasks.Dequeue(); ProcessNextTask(move); break; } instruction.Position = new Point(instruction.Position.X, result); MoveTop(move, instruction); } break; } } break; case "l": { switch (instruction.Robot.Direction) { case DirectionTypes.East: { Rotate(move, (double)DirectionTypes.North); } break; case DirectionTypes.South: { Rotate(move, (double)DirectionTypes.East); } break; case DirectionTypes.West: { Rotate(move, (double)DirectionTypes.South); } break; case DirectionTypes.North: { Rotate(move, (double)DirectionTypes.West); } break; } } break; case "r": { switch (instruction.Robot.Direction) { case DirectionTypes.East: { Rotate(move, (double)DirectionTypes.South); } break; case DirectionTypes.South: { Rotate(move, (double)DirectionTypes.West); } break; case DirectionTypes.West: { Rotate(move, (double)DirectionTypes.North); } break; case DirectionTypes.North: { Rotate(move, (double)DirectionTypes.East); } break; } } break; } }); } ProcessNextTask(move); }
private static void Rotate(MoveBehavior move, double desiredangle) { AppDispatcher.BeginInvoke(new Action(() => { DoubleAnimation anim = new DoubleAnimation(); var elem = move.Element; var angle = ((RotateTransform)elem.LayoutTransform).Angle; anim.Duration = new Duration(TimeSpan.FromSeconds(.2)); anim.AutoReverse = false; anim.IsCumulative = false; anim.From = angle; anim.Completed += (oo, ee) => { move.Instruction.Robot.SetCurrentDirection((DirectionTypes)desiredangle); tasks.Dequeue(); ProcessNextTask(move); }; switch ((DirectionTypes)desiredangle) { case DirectionTypes.East: { if (angle == 90) { anim.To = angle - 90; } else if (angle == 270) { anim.To = angle + 90; } else { anim.To = 360; } } break; case DirectionTypes.West: { if (angle == 90) { anim.To = angle + 90; } else if (angle == 270) { anim.To = angle - 90; } else { anim.To = 180; } } break; case DirectionTypes.North: { if (angle == 360) { anim.To = angle - 90; } else if (angle == 0) { anim.To = 270; anim.From = 360; } else if (angle == 180) { anim.To = angle + 90; } else { anim.To = 270; } } break; case DirectionTypes.South: { if (angle == 360) { anim.To = 90; anim.From = 0; } else if (angle == 180) { anim.To = angle - 90; } else { anim.To = 90; } } break; } move.Instruction.Robot.IsMoving = true; if (((RotateTransform)elem.LayoutTransform).IsFrozen) { elem.LayoutTransform = elem.LayoutTransform.CloneCurrentValue(); } ((RotateTransform)elem.LayoutTransform).BeginAnimation(RotateTransform.AngleProperty, anim); })); }