コード例 #1
0
        /**
         * Animationen für das Fallen der Figur
         *
         * Wenn die figur unten ankommt, blinkt sie durch opacity.
         * Wenn die figur durch fallcompeteley gefallen ist, dann wird ein Rechteck von der letzten Position bis unten erstellt
         *  dieses Rechteck verschwindet durch einen lin.gradienten mit transparenter Farbe.
         */
        public void OnFigureFallen(object sender, FigureFallenEventArgs ffea)
        {
            Dispatcher.BeginInvoke(delegate
            {
                if (iv.rootContainer.Child == this)
                {
                    hardFall = false;
                    Util.Point[] points = ffea.figurePoints;
                    List<Rectangle> rectangles = getBoardRectangles(points);
                    Storyboard sb = new Storyboard();
                    sb.Duration = TimeSpan.FromMilliseconds(400);
                    foreach (Rectangle rectangle in rectangles)
                    {
                        Duration duration = TimeSpan.FromMilliseconds(200);
                        DoubleAnimation myDoubleAnimation = new DoubleAnimation();
                        myDoubleAnimation.Duration = duration;
                        myDoubleAnimation.AutoReverse = true;
                        Storyboard.SetTarget(myDoubleAnimation, rectangle);
                        Storyboard.SetTargetProperty(myDoubleAnimation, new PropertyPath("Opacity"));
                        myDoubleAnimation.To = 0.5;
                        myDoubleAnimation.From = 1;
                        sb.Children.Add(myDoubleAnimation);
                    }
                    if (!ffea.PointsAreEqual())
                    {
                        sb.Duration = TimeSpan.FromMilliseconds(3000);
                        hardFall = true;
                        int maxY = getMax(points, false);
                        int minY = getMin(ffea.previousFigurePoints, false);
                        int minX = getMin(points, true);
                        int maxX = getMax(points, true);

                        Rectangle upperLeftRect = getRectangleAt(minX, minY);
                        Rectangle bottomRightRect = getRectangleAt(maxX, maxY);
                        Rectangle bottomLeftRect = getRectangleAt(minX, maxY);
                        Rectangle upperRightRect = getRectangleAt(maxX, minY);

                        System.Windows.Point upperLeftPoint = upperLeftRect.TransformToVisual(this.LayoutRoot).Transform(new System.Windows.Point(0, 0));
                        System.Windows.Point bottomRightPoint = bottomRightRect.TransformToVisual(this.LayoutRoot).Transform(new System.Windows.Point(0, 0));
                        System.Windows.Point bottomLeftPoint = bottomLeftRect.TransformToVisual(this.LayoutRoot).Transform(new System.Windows.Point(0, 0));
                        System.Windows.Point upperRightPoint = upperRightRect.TransformToVisual(this.LayoutRoot).Transform(new System.Windows.Point(0, 0));

                        double width = Math.Sqrt(Math.Pow(bottomRightPoint.X - bottomLeftPoint.X, 2) + Math.Pow(bottomRightPoint.Y - bottomLeftPoint.Y, 2)) + upperLeftRect.ActualWidth;
                        double height = Math.Sqrt(Math.Pow(bottomRightPoint.X - upperRightPoint.X, 2) + Math.Pow(bottomRightPoint.Y - upperRightPoint.Y, 2)) + bottomLeftRect.ActualHeight;

                        Rectangle effectRectangle = new Rectangle();
                        effectRectangle.Width = width;
                        effectRectangle.Height = height;

                        CompositeTransform ct = (CompositeTransform)boardBorder.RenderTransform;
                        CompositeTransform ct2 = new CompositeTransform();
                        ct2.Rotation = ct.Rotation;
                        effectRectangle.RenderTransform = ct2;

                        LinearGradientBrush lgb = new LinearGradientBrush();
                        RotateTransform rt = new RotateTransform();
                        rt.Angle = 0;
                        lgb.Transform = rt;
                        GradientStop gs1 = new GradientStop();
                        gs1.Color = Colors.Transparent;
                        gs1.Offset = 0.0;
                        GradientStop gs2 = new GradientStop();
                        gs2.Color = Color.FromArgb(100, ffea.color.R, ffea.color.G, ffea.color.B);
                        gs2.Offset = 0.0;
                        lgb.GradientStops.Add(gs1);
                        lgb.GradientStops.Add(gs2);

                        effectRectangle.Fill = lgb;
                        canvas.Children.Add(effectRectangle);
                        Canvas.SetLeft(effectRectangle, upperLeftPoint.X + Canvas.GetLeft(LayoutRoot));
                        Canvas.SetTop(effectRectangle, upperLeftPoint.Y + Canvas.GetTop(LayoutRoot));

                        Duration duration = TimeSpan.FromMilliseconds(3000);
                        DoubleAnimation myDoubleAnimation = new DoubleAnimation();
                        myDoubleAnimation.Duration = duration;
                        Storyboard.SetTarget(myDoubleAnimation, gs2);
                        Storyboard.SetTargetProperty(myDoubleAnimation, new PropertyPath("Offset"));
                        myDoubleAnimation.To = 10.0;
                        sb.Children.Add(myDoubleAnimation);
                        sb.Completed += new EventHandler((a, b) =>
                        {
                            canvas.Children.Remove(effectRectangle);
                        });
                    }

                    if (!LayoutRoot.Resources.Contains("unique_id"))
                    {
                        LayoutRoot.Resources.Add("unique_id", sb);
                    }
                    sb.Begin();
                }

            });
        }