private static Border GetDestinationBorder(Tile tile, TilesMovePlan mp) // use tile placeholder as reference for tile { Coordinates dc = mp.TileDistinationCoordinates[Grid.GetRow(tile), Grid.GetColumn(tile)]; Border border = GameBoard.gameBoardGrid.Children.OfType <Border>() .Where(x => Grid.GetRow(x) == dc.Row && Grid.GetColumn(x) == dc.Column) .SingleOrDefault(); return(border); }
public static Storyboard TranslateTile(Tile tile, TilesMovePlan mp) { Border destinationBorder = GetDestinationBorder(tile, mp); // reference object used for movement performance Point diff = destinationBorder.TranslatePoint(new Point(0, 0), tile); // difference in pixels between tile and that destination if (tile.CurrentState == Tile.State.Multiply) { Panel.SetZIndex(tile, 1000); // set multiply tiles on top } // add translation to tile TransformGroup tg = new TransformGroup(); TranslateTransform t = new TranslateTransform(); tg.Children.Add(t); tile.RenderTransform = tg; // ease function CubicEase easeFunction = new CubicEase(); easeFunction.EasingMode = EasingMode.EaseIn; //animations DoubleAnimation TranslateTileXAnimation = new DoubleAnimation(); TranslateTileXAnimation.BeginTime = TimeSpan.FromSeconds(0); TranslateTileXAnimation.Duration = new Duration(TimeSpan.FromSeconds(.05)); TranslateTileXAnimation.EasingFunction = easeFunction; DoubleAnimation TranslateTileYAnimation = new DoubleAnimation(); TranslateTileYAnimation.BeginTime = TimeSpan.FromSeconds(0); TranslateTileYAnimation.Duration = new Duration(TimeSpan.FromSeconds(.05)); TranslateTileYAnimation.EasingFunction = easeFunction; // storyboard Storyboard TranslateTileStoryboard = new Storyboard(); Storyboard.SetTarget(TranslateTileXAnimation, tile); Storyboard.SetTarget(TranslateTileYAnimation, tile); Storyboard.SetTargetProperty(TranslateTileXAnimation, new PropertyPath("(UIElement.RenderTransform).(TransformGroup.Children)[0].(TranslateTransform.X)")); Storyboard.SetTargetProperty(TranslateTileYAnimation, new PropertyPath("(UIElement.RenderTransform).(TransformGroup.Children)[0].(TranslateTransform.Y)")); TranslateTileStoryboard.Children.Add(TranslateTileXAnimation); TranslateTileStoryboard.Children.Add(TranslateTileYAnimation); TranslateTileStoryboard.Completed += new EventHandler((s, e) => TranslateBoxStoryBoard_Completed(s, e, tile, destinationBorder)); TranslateTileXAnimation.To = diff.X; TranslateTileYAnimation.To = diff.Y; TranslateTileStoryboard.Begin(); return(TranslateTileStoryboard); }
public static Tile AddNewTileOnBoard(TilesMovePlan mp) // add new tile in context of specified move plan { Tile t = null; if (!GameBoard.CheckAndSetGameStateGameOver(mp)) // don't move, if move is impossible { t = AddNewTileOnBoard(mp.DestinationMatrix); mp.SourceMatrix = mp.DestinationMatrix; mp.SourceMatrix[Grid.GetRow(t), Grid.GetColumn(t)] = t.GetNumber(); GameBoard.CheckAndSetGameStateGameOver(mp); // check potencial moves after move performance } return(t); }
public static void Move(MovesHandling.MoveDirection direction) // move tiles in one of specified directions { try { if (GameBoard.CurrentGameState != GameBoard.GameState.GameOver) // don't move in case of gameover { TilesMovePlan mp = MovesHandling.GetTilesMovePlan(direction); // get move plan in context of specified direction if (!GameBoard.CheckAndSetGameStateGameOver(mp) && !mp.IsBlindAlley()) // if move is possible in some direction and also possible in specified direction { MovesHandling.GetTIlesDistinationCoordinates(mp); // perform all calculations for move plan GameBoard.UpdateTileStates(mp); // change state of tiles if needed GameBoard.SetNewCoordinatesToTilesInGrid(mp); // perform move graphically AddNewTileOnBoard(mp); // add one tile after each move } } } catch (InvalidOperationException e) { Debug.Print("Wow, wow, wow... slow down, cowboy!"); // ignoring extremely fast keyboard actions } }