private void DrawMoveMovement(Move move, CanvasElement canvasElem) { foreach (var piece in move.BeatedPieces ?? new List <BeatedPiece>()) { foreach (var elem in BoardCanvasElements.Where(e => e.Geometry is EllipseGeometry && e.X == piece.Row && e.Y == piece.Column).ToList()) { BoardCanvasElements.Remove(elem); } } canvasElem.Row = skipSize * (Game.Board.Size - 1 - move.NewPiece.Row) + skipSize / 2; canvasElem.Column = skipSize * move.NewPiece.Column + skipSize / 2; canvasElem.X = move.NewPiece.Row; canvasElem.Y = move.NewPiece.Column; if (move.NewPiece.IsKing && !move.OldPiece.IsKing) { BoardCanvasElements.Add(new Model.CanvasElement { Row = skipSize * (Game.Board.Size - 1 - move.NewPiece.Row) + skipSize / 2, Column = skipSize * move.NewPiece.Column + skipSize / 2, Geometry = new EllipseGeometry { RadiusX = skipSize / 4, RadiusY = skipSize / 4 }, Thickness = 2, Stroke = move.NewPiece.Color == PieceColor.Black ? Brushes.White : Brushes.Black, X = move.NewPiece.Row, Y = move.NewPiece.Column }); } }
private List <Piece> ConvertPathListToPieceList(List <Path> paths) { List <Piece> ret = new List <Piece>(); foreach (var path in paths) { var elem = BoardCanvasElements.SingleOrDefault(e => e.Geometry == path.Data); ret.Add(new Piece(elem.X, elem.Y, PieceColor.White, Game.Board.Size, false)); } return(ret); }
private void DrawMoveTargets(Move move) { foreach (var elem in BoardCanvasElements.Where(e => e.Geometry is RectangleGeometry && e.X == move.OldPiece.Row && e.Y == move.OldPiece.Column).ToList()) { elem.Fill = Brushes.DarkOrange; } foreach (var elem in BoardCanvasElements.Where(e => e.Geometry is RectangleGeometry && e.X == move.NewPiece.Row && e.Y == move.NewPiece.Column).ToList()) { elem.Fill = Brushes.DarkOrange; } foreach (var piece in Game.Board.LastMove?.BeatedPieces ?? new List <BeatedPiece>()) { foreach (var elem in BoardCanvasElements.Where(e => e.Geometry is RectangleGeometry && e.X == piece.Row && e.Y == piece.Column).ToList()) { elem.Fill = Brushes.Crimson; } } }
private void RemoveLastMoveTargets(Move move) { if (lastMove != null) { foreach (var elem in BoardCanvasElements.Where(e => e.Geometry is RectangleGeometry && e.X == lastMove.OldPiece.Row && e.Y == lastMove.OldPiece.Column).ToList()) { elem.Fill = Brushes.Peru; } foreach (var elem in BoardCanvasElements.Where(e => e.Geometry is RectangleGeometry && e.X == lastMove.NewPiece.Row && e.Y == lastMove.NewPiece.Column).ToList()) { elem.Fill = Brushes.Peru; } foreach (var piece in lastMove?.BeatedPieces ?? new List <BeatedPiece>()) { foreach (var elem in BoardCanvasElements.Where(e => e.Geometry is RectangleGeometry && e.X == piece.Row && e.Y == piece.Column).ToList()) { elem.Fill = Brushes.Peru; } } } }
private void AnimateMovement(Move move) { foreach (var elem in BoardCanvasElements.Where(e => e.Geometry is EllipseGeometry && e.X == move.OldPiece.Row && e.Y == move.OldPiece.Column).ToList()) { var x = elem.Geometry; if (Window.FindName("MyAnimatedEllipseGeometry") != null) { Window.UnregisterName("MyAnimatedEllipseGeometry"); } Window.RegisterName("MyAnimatedEllipseGeometry", x); PathGeometry animationPath = new PathGeometry(); Point position = new Point(move.OldPiece.Column, move.OldPiece.Row); PathFigure pFigure = new PathFigure(); pFigure.StartPoint = new Point(0, 0); PolyLineSegment lineSegment = new PolyLineSegment(); double xDiff, yDiff; foreach (var beatPositionPiece in move.BeatedPieces?.Skip(1) ?? new List <BeatedPiece>()) { xDiff = ((skipSize * beatPositionPiece.BeatPieceColumn + skipSize / 2) - (skipSize * position.X + skipSize / 2)); yDiff = (skipSize * (Game.Board.Size - 1 - beatPositionPiece.BeatPieceRow) + skipSize / 2) - (skipSize * (Game.Board.Size - 1 - position.Y) + skipSize / 2); if (lineSegment.Points.Count > 0) { lineSegment.Points.Add(new Point(lineSegment.Points.Last().X + xDiff, lineSegment.Points.Last().Y + yDiff)); } else { lineSegment.Points.Add(new Point(xDiff, yDiff)); } position = new Point(beatPositionPiece.BeatPieceColumn, beatPositionPiece.BeatPieceRow); } xDiff = (skipSize * move.NewPiece.Column + skipSize / 2) - (skipSize * position.X + skipSize / 2); yDiff = (skipSize * (Game.Board.Size - 1 - move.NewPiece.Row) + skipSize / 2) - (skipSize * (Game.Board.Size - 1 - position.Y) + skipSize / 2); if (lineSegment.Points.Count > 0) { lineSegment.Points.Add(new Point(lineSegment.Points.Last().X + xDiff, lineSegment.Points.Last().Y + yDiff)); } else { lineSegment.Points.Add(new Point(xDiff, yDiff)); } pFigure.Segments.Add(lineSegment); animationPath.Figures.Add(pFigure); animationPath.Freeze(); PointAnimationUsingPath myPointAnimation = new PointAnimationUsingPath(); myPointAnimation.Duration = TimeSpan.FromSeconds((double)MoveAnimationTime / 100 * ((move.BeatedPieces?.Count()) ?? 1)); myPointAnimation.FillBehavior = FillBehavior.Stop; myPointAnimation.PathGeometry = animationPath; AnimationCompleted = false; myPointAnimation.Completed += delegate { DrawMoveMovement(move, elem); Thread.Sleep(100); AnimationCompleted = true; }; // Set the animation to target the Center property // of the object named "MyAnimatedEllipseGeometry." Storyboard.SetTargetName(myPointAnimation, "MyAnimatedEllipseGeometry"); Storyboard.SetTargetProperty( myPointAnimation, new PropertyPath(EllipseGeometry.CenterProperty)); // Create a storyboard to apply the animation. Storyboard ellipseStoryboard = new Storyboard(); ellipseStoryboard.Children.Add(myPointAnimation); ellipseStoryboard.Begin(Window); elem.Geometry = x; } }
public void DrawHistoryBoard(int moveNumber) { if (moveNumber == Game.History.Count) { DrawCurrentBoard(); return; } BoardCanvasElements.Clear(); int skipSize = 700 / Game.Board.Size; int index = 0; for (int i = 0; i != Game.Board.Size; i++) { for (int j = 0; j != Game.Board.Size; j++) { BoardCanvasElements.Add(new Model.CanvasElement { Row = skipSize * j, Column = skipSize * i, Geometry = new RectangleGeometry { Rect = new System.Windows.Rect(0, 0, skipSize, skipSize) }, Fill = index++ % 2 == 1 ? Brushes.Peru : Brushes.AntiqueWhite, X = Game.Board.Size - 1 - j, Y = i }); } index++; } foreach (var elem in BoardCanvasElements.Where(e => e.Geometry is RectangleGeometry && e.X == Game.History[moveNumber].Board.LastMove.OldPiece.Row && e.Y == Game.History[moveNumber].Board.LastMove.OldPiece.Column).ToList()) { elem.Fill = Brushes.DarkOrange; } foreach (var elem in BoardCanvasElements.Where(e => e.Geometry is RectangleGeometry && e.X == Game.History[moveNumber].Board.LastMove.NewPiece.Row && e.Y == Game.History[moveNumber].Board.LastMove.NewPiece.Column).ToList()) { elem.Fill = Brushes.DarkOrange; } foreach (var piece in Game.History[moveNumber].Board.LastMove?.BeatedPieces ?? new List <BeatedPiece>()) { foreach (var elem in BoardCanvasElements.Where(e => e.Geometry is RectangleGeometry && e.X == piece.Row && e.Y == piece.Column).ToList()) { elem.Fill = Brushes.Crimson; } } for (int pos = 0; pos != Game.History[moveNumber].Board.Size * Game.History[moveNumber].Board.Size + 1; pos++) { if (Game.History[moveNumber].Board.BoardArray[pos] != 0) { var elem = new Piece(pos, Game.History[moveNumber].Board.BoardArray[pos] > 0 ? PieceColor.White : PieceColor.Black, Game.History[moveNumber].Board.Size, Game.History[moveNumber].Board.BoardArray[pos] == 2 || Game.History[moveNumber].Board.BoardArray[pos] == -2); BoardCanvasElements.Add(new Model.CanvasElement { Row = skipSize * (Game.Board.Size - 1 - elem.Row) + skipSize / 2, Column = skipSize * elem.Column + skipSize / 2, Geometry = new EllipseGeometry { RadiusX = skipSize / 3, RadiusY = skipSize / 3 }, Fill = elem.Color == PieceColor.Black ? Brushes.Black : Brushes.White, X = elem.Row, Y = elem.Column }); if (elem.IsKing) { BoardCanvasElements.Add(new Model.CanvasElement { Row = skipSize * (Game.Board.Size - 1 - elem.Row) + skipSize / 2, Column = skipSize * elem.Column + skipSize / 2, Geometry = new EllipseGeometry { RadiusX = skipSize / 4, RadiusY = skipSize / 4 }, Stroke = elem.Color == PieceColor.Black ? Brushes.White : Brushes.Black, Thickness = 2, X = elem.Row, Y = elem.Column }); } } } }