예제 #1
0
 public async ValueTask DrawAll(CanvasWrapper canvas)
 {
     foreach (IGhost eachGhost in Ghosts)
     {
         await eachGhost.Draw(canvas);
     }
 }
예제 #2
0
        /// <summary>
        /// Renders an Area chart a canvas. This method is called by the chart class.
        /// </summary>
        /// <param name="canvasWrapper">wrapper class containing info mation about the canvas and chart</param>
        /// <param name="axis">Axis orientation object</param>
        /// <param name="minMax">Data for the extreme values</param>
        /// <param name="gridPaint">Paint object for the grid lines</param>
        public override void RenderChart(CanvasWrapper canvasWrapper, Axis axis, IMinMax minMax)
        {
            CheckConstructionPolicy(nameof(LineChart));

            if (canvasWrapper.NumberPlottedChart < 1)
            {
                DrawHorizontalLabels(canvasWrapper, axis, minMax);
                DrawVerticalLabels(canvasWrapper, axis, minMax);
            }

            var canvas             = canvasWrapper.Canvas;
            var path               = new SKPath();
            var constructionPoints = ConstructionData.ToList();
            var firstPoint         = ConstructionData.First();
            var lastPoint          = ConstructionData.Last();
            var connectionPoint    = new SKPoint(lastPoint.X, firstPoint.Y);

            constructionPoints.Add(connectionPoint);
            path.MoveTo(constructionPoints.First());
            foreach (var point in constructionPoints.Skip(1))
            {
                path.LineTo(point);
            }
            path.FillType = SKPathFillType.EvenOdd;
            path.Close();
            _chartPaint.IsStroke = false;
            canvas.DrawPath(path, _chartPaint);
            canvasWrapper.NumberPlottedChart += 1;

            if (canvasWrapper.CanShowLegend)
            {
                RenderLegend(canvasWrapper, axis, canvas, PointPlotVariant.AreaChart);
            }
        }
예제 #3
0
        private void RenderYTickMark(CanvasWrapper canvasWrapper, Axis axis, int counter, SKPoint point, SKRect rect)
        {
            var yLabel = GetYLabel(OriginalData.ElementAt(counter).Y);

            _labelPaint.TextSize = canvasWrapper.LabelTextSize;
            axis.DrawAndPositionYTickMark(yLabel, point.Y, rect.Left, _labelPaint);
        }
예제 #4
0
        protected void RenderLegend(CanvasWrapper canvasWrapper, Axis axis, SKCanvas canvas,
                                    PointPlotVariant plotVariant)
        {
            var   start                = (canvasWrapper.ChartArea.Bottom + 60);
            var   end                  = start + (40f * canvasWrapper.NumberPlottedChart);
            var   leftEdge             = canvasWrapper.ChartArea.Left + 10;
            float heightPaddingForText = 0;

            canvas.Save();
            axis.AntiOrientAxis(float.MaxValue);
            switch (plotVariant)
            {
            case PointPlotVariant.LineChart:
                _chartPaint.IsStroke = false;
                heightPaddingForText = 7;
                canvas.DrawLine(leftEdge, end, canvasWrapper.ChartArea.Left + 40, end, _chartPaint);
                break;

            case PointPlotVariant.ScatterChart:
                _chartPaint.IsStroke = false;
                heightPaddingForText = 7;
                canvas.DrawCircle(leftEdge + 20, end, 7, _chartPaint);
                break;

            case PointPlotVariant.AreaChart:
                heightPaddingForText = 15;
                canvas.DrawRect(leftEdge, end, 37, 25, _chartPaint);
                break;

            default:
                break;
            }
            canvas.Restore();
            axis.DrawAndPositionLegend(ChartName, end + heightPaddingForText, leftEdge + 40, _chartPaint);
        }
예제 #5
0
        // drawSprite max 7 fruit from max level 21
        async ValueTask drawFruit(CanvasWrapper ds)
        {
            if (_gameStats.IsDemo)
            {
                return;
            }

            var highestLevel = Math.Min(
                20,
                _gameStats.CurrentPlayerStats.LevelStats.LevelNumber);

            var lowestLevel = Math.Max(
                0,
                highestLevel - 6);

            var x = 204;

            // starting from the right
            for (var i = lowestLevel; i <= highestLevel; i++, x -= 16)
            {
                var item = LevelStats.GetLevelProps(i).Fruit;

                _fruit.SetFruitItem(item);
                _fruit.Position = new Vector2(x, 10);


                await ds.DrawSprite(_fruit, Spritesheet.Reference);
            }
        }
예제 #6
0
 public async ValueTask Draw(CanvasWrapper session)
 {
     foreach (var s in _sprites)
     {
         await s.Draw(session);
     }
 }
예제 #7
0
        /// <summary>
        /// Renders a bar chart on the canvas. This method is called by the Chart class.
        /// </summary>
        /// <param name="canvasWrapper">wrapper class containing info mation about the canvas and chart</param>
        /// <param name="axis">Axis orientation object</param>
        /// <param name="minMax">Data for the extreme values</param>
        /// <param name="gridPaint">Paint object for the grid lines</param>
        public override void RenderChart(CanvasWrapper canvasWrapper, Axis axis, IMinMax minMax)
        {
            CheckConstructionPolicy(nameof(BarChart));

            var drawingSpace = canvasWrapper.ChartArea.Right / ConstructionData.Count() * 0.9;
            var rectSpace    = (float)drawingSpace / canvasWrapper.NumberOfCharts;
            var columnSpace  = (float)((canvasWrapper.ChartArea.Right / ConstructionData.Count()) - drawingSpace) / 2;
            var pointX       = canvasWrapper.ChartArea.Width / ConstructionData.Count();
            var counter      = 0;

            foreach (var point in ConstructionData)
            {
                var x1 = (pointX * counter) + canvasWrapper.ChartArea.Left + columnSpace +
                         (canvasWrapper.NumberPlottedChart * rectSpace);
                var x2   = x1 + rectSpace - columnSpace;
                var rect = new SKRect(x1, point.Y, x2, canvasWrapper.ChartArea.Top);
                _chartPaint.IsStroke = IsStroked;
                canvasWrapper.Canvas.DrawRect(rect, _chartPaint);

                var xLabel = XLabel[counter];
                axis.DrawAndPositionXTickMark(xLabel, (x1 + (x2 - x1) / 2),
                                              canvasWrapper.ChartArea.Bottom, _labelPaint);

                var yLabel = GetYLabel(OriginalData.ElementAt(counter).Y);
                axis.DrawAndPositionYTickMark(yLabel, point.Y, (x1 + (x2 - x1) / 2), _labelPaint);
                counter++;
            }
            canvasWrapper.NumberPlottedChart += 1;
        }
예제 #8
0
        public void TestMaui()
        {
            using (var skBmp = new SkiaSharp.SKBitmap(256, 256, false))
            {
                using (var skCanvas = new SkiaSharp.SKCanvas(skBmp))
                {
                    using (var mauiCanvas = new Microsoft.Maui.Graphics.Skia.SkiaCanvas())
                    {
                        mauiCanvas.Canvas = skCanvas;

                        var myCanvas = CanvasWrapper.Create(mauiCanvas);

                        myCanvas.DrawCircle((50, 50), 20, System.Drawing.Color.Red);

                        myCanvas.DrawRectangle((100, 10), (50, 50), System.Drawing.Color.White, 5, 3);
                    }
                }

                using (var memBmp = skBmp.UsingMemoryBitmap())
                {
                    memBmp.AsMemoryBitmap()
                    .ToMemoryBitmap(Pixel.RGBA32.Format)
                    .Save("maui.png");
                }
            }
        }
예제 #9
0
    public async ValueTask Draw(CanvasWrapper ds)
    {
        await ds.SetGlobalAlphaAsync(.5f);

        await ds.FillRect(0, 0, 200, 100, Color.DarkSlateGray);

        await ds.DrawText($"FPS:{DiagInfo.Fps}", Point.Empty, Color.White);

        await ds.DrawText($"Tot time:{DiagInfo.TotalTime:c}", new(50, 00), Color.White);

        await ds.DrawText($"Draw count:{DiagInfo.DrawCount:D}", new(0, 15), Color.White);

        await ds.DrawText(
            $"Update count:{DiagInfo.UpdateCount:D} ({DiagInfo.UpdateCount - DiagInfo.DrawCount:D} more)",
            new(0, 30),
            Color.White);

        await ds.DrawText($"Elapsed:{DiagInfo.Elapsed:g}", new(0, 45), Color.White);

        await ds.DrawText($"loop tm taken:{DiagInfo.GameLoopDurationMs:D}", new(0, 60), Color.White);

        await ds.DrawText($"max loop tm taken:{DiagInfo.MaxGameLoopDurationMs:D}", new(0, 65), Color.White);

        await ds.DrawText($"slow frames:{DiagInfo.SlowElapsedCount:D}", new(0, 80), Color.White);

        await ds.SetGlobalAlphaAsync(1f);
    }
예제 #10
0
        /// <summary>
        /// Renders a line chart a canvas. This method is called by the chart class.
        /// </summary>
        /// <param name="canvasWrapper">wrapper class containing info mation about the canvas and chart</param>
        /// <param name="axis">Axis orientation object</param>
        /// <param name="minMax">Data for the extreme values</param>
        /// <param name="gridPaint">Paint object for the grid lines</param>
        public override void RenderChart(CanvasWrapper canvasWrapper, Axis axis, IMinMax minMax)
        {
            CheckConstructionPolicy(nameof(LineChart));
            var canvas = canvasWrapper.Canvas;

            if (canvasWrapper.NumberPlottedChart < 1)
            {
                DrawHorizontalLabels(canvasWrapper, axis, minMax);
                DrawVerticalLabels(canvasWrapper, axis, minMax);
            }

            _chartPaint.IsStroke = true;
            var path = new SKPath();

            path.MoveTo(ConstructionData.First());
            foreach (var point in ConstructionData.Skip(1))
            {
                path.LineTo(point);
                if (ShowPoints)
                {
                    canvas.DrawCircle(point, PointRadius, _chartPaint);
                }
            }
            canvas.DrawPath(path, _chartPaint);
            canvasWrapper.NumberPlottedChart += 1;

            if (canvasWrapper.CanShowLegend)
            {
                RenderLegend(canvasWrapper, axis, canvas, PointPlotVariant.LineChart);
            }
        }
예제 #11
0
    public async ValueTask Draw(CanvasWrapper canvas)
    {
        await _blinky.Draw(canvas);

        await _pacMan.Draw(canvas);

        await _worm.Draw(canvas);
    }
예제 #12
0
        public override void applyToCanvas(CanvasWrapper c)
        {
            base.applyToCanvas(c);

            //c.DrawLineUsingActualCoords(P1.X, P1.Y, P2.X, P2.Y);
            c.PushActiveLayer();
            c.SwitchLayer(CanvasWrapper.LAYER_ALGORITHM);
            c.DrawLineUsingIndexes(StartXIndex, StartYIndex, EndXIndex, EndYIndex);
            c.PopActiveLayer();
        }
예제 #13
0
        public async ValueTask Draw(CanvasWrapper canvas)
        {
            await _pacMan.Draw(canvas);

            await _blinky.Draw(canvas);

            await _lookingBlinky.Draw(canvas);

            await _snagSprite.Draw(canvas);
        }
예제 #14
0
        public async ValueTask Draw(CanvasWrapper canvas)
        {
            await _maze.Draw(canvas);

            await _pacman.Draw(canvas);

            await _ghostCollection.DrawAll(canvas);

            await canvas.DrawMyText("GAME OVER", TextPoints.GameOverPoint, Colors.Red);
        }
예제 #15
0
        public override void RenderChart(CanvasWrapper canvasWrapper, Axis axis, IMinMax minMax)
        {
            var divisor     = 2.5f;
            var strokeWidth = 30;

            if (canvasWrapper.NumberOfCharts > 6)
            {
                switch (Device.RuntimePlatform)
                {
                case Device.WPF:
                case Device.GTK:
                case Device.macOS:
                case Device.UWP: {
                    divisor     = 2.0f;
                    strokeWidth = 15;
                    break;
                }

                default: {
                    divisor     = 1.5f;
                    strokeWidth = 30;
                    break;
                }
                }
                ;
            }


            var chartArea = canvasWrapper.ChartArea;
            var canvas    = canvasWrapper.Canvas;

            var radius = Math.Min(chartArea.MidX, chartArea.MidY) / divisor;

            radius = radius - (canvasWrapper.NumberPlottedChart * strokeWidth);

            _chartPaint.StrokeWidth = strokeWidth;
            _chartPaint.Style       = SKPaintStyle.Stroke;

            var teta = 360 - ((minMax.Ymax - OriginalData.ElementAt(0).Y) / (minMax.Ymax - minMax.Ymin) * 360);

            var rect = new SKRect(chartArea.MidX - radius, chartArea.MidY - radius, chartArea.MidX + radius, chartArea.MidY + radius);
            var path = new SKPath();

            path.AddArc(rect, 90, -teta);
            canvas.DrawPath(path, _chartPaint);

            _chartPaint.Color = ChartColor.WithAlpha(70);
            canvas.DrawCircle(chartArea.MidX, chartArea.MidY, radius, _chartPaint);
            canvasWrapper.NumberPlottedChart += 1;

            _chartPaint.Color = ChartColor;
            ChartName         = $"{Label} : {Value}";
            RenderLegend(canvasWrapper, axis, canvas, PointPlotVariant.ScatterChart);
        }
예제 #16
0
    public async ValueTask Draw(CanvasWrapper session)
    {
        await _maze.Draw(session);

        await _pacman.Draw(session);

        if (_step == 0)
        {
            await _ghostCollection.DrawAll(session);
        }
    }
예제 #17
0
        //Draw points
        protected SKCanvas DisplayPoints(CanvasWrapper canvasWrapper)
        {
            var canvas = canvasWrapper.Canvas;

            _chartPaint.IsStroke = IsStroked;
            foreach (var point in ConstructionData)
            {
                canvas.DrawCircle(point, PointRadius, _chartPaint);
            }
            return(canvas);
        }
예제 #18
0
        async ValueTask drawPlayerText(CanvasWrapper ds, int playerIndex, string text, Vector2 pos)
        {
            var shouldFlash = _gameStats.AnyonePlaying && !_gameStats.IsGameOver && _gameStats.CurrentPlayerStats.PlayerIndex == playerIndex;

            var shouldDraw = !shouldFlash || _tickTock;

            if (shouldDraw)
            {
                await ds.DrawMyText(text, pos, Colors.White);
            }
        }
예제 #19
0
        // public static async ValueTask DrawSprite(this ISprite sprite, ElementReference spriteSheet)
        // {
        //     if (sprite.Visible)
        //     {
        //         spr
        //         await DrawImage(
        //             spriteSheet,
        //             (sprite.Position - sprite.Origin).ToPoint(),
        //             new Rectangle(sprite.SpriteSheetPos.ToPoint(), sprite.Size));
        //     }
        // }

        public static async ValueTask DrawSprite(this CanvasWrapper session,
                                                 ISprite sprite,
                                                 ElementReference spriteSheet)
        {
            if (sprite.Visible)
            {
                await session.DrawImage(
                    spriteSheet,
                    (sprite.Position - sprite.Origin).toPoint(),
                    new Rectangle(sprite.SpriteSheetPos.toPoint(), sprite.Size));
            }
        }
예제 #20
0
    public async ValueTask Draw(CanvasWrapper session)
    {
        PlayerStats currentPlayerStats = _gameStats.CurrentPlayerStats;

        var gameOverAct = await resolveGameOverAct();

        await gameOverAct.Draw(session);

        await session.DrawMyText(
            currentPlayerStats.PlayerIndex == 0? "PLAYER ONE" : "PLAYER TWO", TextPoints.PlayerTextPoint,
            Colors.Cyan);
    }
예제 #21
0
 //Renders the x-y labels and the chart legend
 private void RenderXYLabelAndLegend(CanvasWrapper canvasWrapper)
 {
     if (typeof(ISingleValueChart).Equals(typeof(T)
                                          .GetInterface("ISingleValueChart")))
     {
         XYLableAndLegendForSingleValueChart(canvasWrapper);
     }
     else
     {
         XYLableAndLegendForMultiValueChart(canvasWrapper);
     }
 }
예제 #22
0
        public async ValueTask Draw(CanvasWrapper session)
        {
            await session.DrawMyText("PUSH START BUTTON", new Vector2(50, 115), Colors.Orange);

            var text = _coinBox.Credits < 2 ? "1 PLAYER ONLY" : "1 OR 2 PLAYERS";

            await session.DrawMyText(text, new Vector2(70, 145), Colors.Cyan);

            await session.DrawMyText("BONUS PAC-MAN FOR 10000 PTS", new Vector2(0, 175), Colors.White);

            await session.DrawMyText("(C) 1980 MIDWAY MFG. CO.", new Vector2(15, 190), Colors.White);
        }
예제 #23
0
 public async ValueTask Draw(CanvasWrapper ds)
 {
     if (_gameStats.AnyonePlaying)
     {
         await drawPlayerLives(ds);
         await drawFruit(ds);
     }
     else
     {
         await drawCredits(ds);
     }
 }
예제 #24
0
        public DemoAreaControl()
        {
            InitializeComponent();

            drawCanvas.MouseMove         += DrawCanvas_MouseMove;
            drawCanvas.MouseLeftButtonUp += DrawCanvas_MouseLeftButtonUp;

            CanvasWrapper = new CanvasWrapper(drawCanvas);

            associatedAlgorithm = null;

            demo = new DemoModel();
        }
예제 #25
0
        async ValueTask drawPlayerOneScore(CanvasWrapper ds)
        {
            await drawPlayerText(ds, 0, "1UP", _playerOneTextPos);

            int score = 0;

            if (_gameStats.HasPlayerStats(0))
            {
                score = _gameStats.GetPlayerStats(0).Score;
            }

            await drawRightAlignedScoreText(ds, score, _scorePos1Up);
        }
예제 #26
0
 private void XYLableAndLegendForSingleValueChart(CanvasWrapper canvasWrapper)
 {
     if (canvasWrapper.ThisIsiOSOrAndroid)
     {
         Axis.DrawAndPositionLegend(_charts.Count.ToString(), ChartArea.Bottom, ChartArea.Left, _gridPaint,
                                    canvasWrapper.LegendItemSpacing, true);
     }
     else
     {
         Axis.DrawAndPositionLegend(_charts.Count.ToString(), YOffset * 2, ChartArea.Left, _gridPaint,
                                    canvasWrapper.LegendItemSpacing, true);
     }
     return;
 }
예제 #27
0
        public override void applyToCanvas(CanvasWrapper c)
        {
            base.applyToCanvas(c);

            //c.DrawLineUsingActualCoords(P1.X, P1.Y, P2.X, P2.Y);
            c.PushActiveLayer();
            c.SwitchLayer(CanvasWrapper.LAYER_ALGORITHM);
            //c.DrawLineUsingIndexes(StartXIndex, StartYIndex, EndXIndex, EndYIndex);
            //c.DrawLineUsingValues(StartX, StartY, EndX, EndY);
            foreach (var p in Points)
            {
                c.HighlightPointUsingValues(p.X, p.Y, HighlightLevel);
            }
            c.PopActiveLayer();
        }
예제 #28
0
파일: Chart.cs 프로젝트: ekrogh/skia-chart
        //Initiates the rendering of all the charts in the collection
        internal void Plot(CanvasWrapper canvasWrapper)
        {
            ChartArea  = canvasWrapper.Converter.Rect;
            XOffset    = canvasWrapper.Converter.XOffset;
            YOffset    = canvasWrapper.Converter.YOffset;
            _converter = canvasWrapper.Converter;

            Axis.OrientAxis(canvasWrapper.Canvas, canvasWrapper.DeviceWidth, canvasWrapper.DeviceHeight, XOffset, YOffset);
            _gridPaint.TextSize = canvasWrapper.LabelTextSize * 1.2f;
            NormalizeAllDataPoints();
            RenderXYLabelAndLegend(canvasWrapper);
            SetGrid(canvasWrapper.Canvas, canvasWrapper.GridLines);
            canvasWrapper.NumberOfCharts = _charts.Count;
            _charts.ForEach(chart => chart.RenderChart(canvasWrapper, Axis, this));
        }
예제 #29
0
        async ValueTask drawPlayerLives(CanvasWrapper ds)
        {
            int x = 0;

            for (var i = 0; i < _gameStats.CurrentPlayerStats.LivesRemaining; i++, x += 16)
            {
                await ds.DrawImage(Spritesheet.Reference,
                                   new Rectangle(x, 0, 16, 16),
                                   new Rectangle(
                                       (int)PacMan.FacingLeftSpritesheetPos.X,
                                       (int)PacMan.FacingLeftSpritesheetPos.Y,
                                       16,
                                       16));
            }
        }
예제 #30
0
        private void RenderXTickMark(CanvasWrapper canvasWrapper, Axis axis, float x1, float x2, string xLabel)
        {
            var widthSpace = canvasWrapper.NumberOfCharts == 1 ? (x1 + (x2 - x1) / 2) : (x1 + (x2 - x1));

            if (canvasWrapper.ThisIsiOSOrAndroid)
            {
                axis.DrawAndPositionXTickMark(xLabel, widthSpace,
                                              canvasWrapper.ChartArea.Bottom, _labelPaint);
            }
            else
            {
                axis.DrawAndPositionXTickMark(xLabel, widthSpace,
                                              (canvasWrapper.Converter.YOffset * 2) + 4f, _labelPaint);
            }
        }