Xamarin.forms 滑雪者旋转轮子游戏。双目标共谋

Xamarin.forms 滑雪者旋转轮子游戏。双目标共谋,xamarin.forms,skiasharp,Xamarin.forms,Skiasharp,我正在学习滑雪和做旋转轮子游戏。 我成功地画出了一个分为六段的不同颜色的圆圈,并让它旋转了10秒钟 我现在想做什么,但我失败了,也许我能得到你的理解和意见。 我想当圆圈停止旋转时,选择一种颜色,使大头针在里面 我试图寻找skiasharp的勾结,但没有成功 这是我的密码 My spin.cs: public partial class Spin : ContentPage { Stopwatch stopwatch = new Stopwatch();

我正在学习滑雪和做旋转轮子游戏。 我成功地画出了一个分为六段的不同颜色的圆圈,并让它旋转了10秒钟

我现在想做什么,但我失败了,也许我能得到你的理解和意见。 我想当圆圈停止旋转时,选择一种颜色,使大头针在里面

我试图寻找skiasharp的勾结,但没有成功

这是我的密码

My spin.cs:

public partial class Spin : ContentPage
    {
        Stopwatch stopwatch = new Stopwatch();

        bool _pageIsActive;
        float _degrees;

        class ChartData
        {
            public ChartData(int value, SKColor color)
            {
                Value = value;
                Color = color;
            }

            public int Value { private set; get; }

            public SKColor Color { private set; get; }
        }

        ChartData[] chartData =
        {
            new ChartData(10, SKColors.Red),
            new ChartData(10, SKColors.Green),
            new ChartData(10, SKColors.Blue),
            new ChartData(10, SKColors.Magenta),
            new ChartData(10, SKColors.Cyan),
            new ChartData(10, SKColors.Brown)
        };
        public Spin()
        {
            InitializeComponent();
        }

        protected override void OnAppearing()
        {
            base.OnAppearing();
            _pageIsActive = true;
        }
        protected override void OnDisappearing()
        {
            base.OnDisappearing();
            _pageIsActive = false;
        }
        async Task AnimationLoop()
        {
            stopwatch.Reset();
            stopwatch.Start();

            while (_pageIsActive && stopwatch.Elapsed < TimeSpan.FromSeconds(10))
            {
                skiaView.InvalidateSurface();
                await Task.Delay(TimeSpan.FromSeconds(1.0 / 90));
            }
            stopwatch.Stop();

        }
        void OnCanvasViewPaintSurface(object sender, SKPaintSurfaceEventArgs args)
        {
            IncrementDegrees();

            SKImageInfo info = args.Info;
            SKSurface surface = args.Surface;
            SKCanvas canvas = surface.Canvas;

            var x1 = info.Width / 6;
            var x2 = info.Width / 3 + x1;
            var x3 = info.Width / 3 * 2 + x1;
            var y = info.Height / 2;
            int _squareWidth = Math.Min(info.Width, info.Height) / 10;

            canvas.Clear();

            int totalValues = 0;

            foreach (ChartData item in chartData)
            {
                totalValues += item.Value;
            }

            SKPoint center = new SKPoint(info.Width / 2, info.Height / 2);
            float explodeOffset = 50;
            float radius = Math.Min(info.Width / 2, info.Height / 2) - 2 * explodeOffset;
            SKRect rect = new SKRect(center.X - radius, center.Y - radius,
                                     center.X + radius, center.Y + radius);

            float startAngle = 0;

            foreach (ChartData item in chartData)
            {
                float sweepAngle = 360f * item.Value / totalValues;

                using (SKPath path = new SKPath())
                using (SKPaint fillPaint = new SKPaint())
                using (SKPaint outlinePaint = new SKPaint())
                using (var path3 = new SKPath())
                {
                    path.MoveTo(center);
                    path.ArcTo(rect, startAngle, sweepAngle, false);
                    path.Close();

                    fillPaint.Style = SKPaintStyle.Fill;
                    fillPaint.Color = item.Color;

                    outlinePaint.Style = SKPaintStyle.Stroke;
                    outlinePaint.StrokeWidth = 5;
                    outlinePaint.Color = SKColors.Black;

                    canvas.Save();

                    // Fill and stroke the path
                    //canvas.DrawPath(path, fillPaint);
                   // canvas.DrawPath(path, outlinePaint);


                    var cx3 = x3 - _squareWidth / 2;
                    var cy3 = y + _squareWidth / 2;
                    path3.MoveTo(cx3, cy3);
                    path3.LineTo(cx3 + _squareWidth, cy3);
                    path3.LineTo(cx3 + _squareWidth, cy3 - _squareWidth);
                    path3.LineTo(cx3, cy3 - _squareWidth);
                    path3.LineTo(cx3, cy3);
                    DrawRotatedWithMatrices(canvas, path, fillPaint, outlinePaint, _degrees, (int)center.X, y);
                    canvas.Restore();


                }

                startAngle += sweepAngle;
            }
            canvas.RotateDegrees(90);
        }
        private void IncrementDegrees()
        {
            _degrees += 3.5f;

            if (_degrees >= 360)
            {
                _degrees = 0;
            }
        }
        void DrawRotatedWithMatrices(SKCanvas canvas, SKPath path, SKPaint fill,SKPaint outline ,float degrees, int cx, int cy)
        {
            var result = SKMatrix.MakeIdentity();
            var translate = SKMatrix.MakeTranslation(-cx, -cy);
            var rotate = SKMatrix.MakeRotationDegrees(degrees);
            var translate2 = SKMatrix.MakeTranslation(cx, cy);

            SKMatrix.PostConcat(ref result, translate);
            SKMatrix.PostConcat(ref result, rotate);
            SKMatrix.PostConcat(ref result, translate2);

            path.Transform(result);
            canvas.DrawPath(path, fill);
            canvas.DrawPath(path, outline);
        }

        private void Button_Clicked(object sender, EventArgs e)
        {
            _pageIsActive = true;

            AnimationLoop();

        }

        private void Button_Clicked_1(object sender, EventArgs e)
        {
            _pageIsActive = false;

        }
    }
public部分类自旋:ContentPage
{
秒表秒表=新秒表();
bool_pageIsActive;
浮动_度;
类图表数据
{
公共图表数据(int值、SKColor颜色)
{
价值=价值;
颜色=颜色;
}
公共int值{private set;get;}
公共SKColor Color{private set;get;}
}
ChartData[]ChartData=
{
新图表数据(10种颜色,红色),
新图表数据(10种颜色,绿色),
新图表数据(10种颜色,蓝色),
新图表数据(10种颜色,洋红色),
新图表数据(10,SKColors.青色),
新图表数据(10,SKColors.Brown)
};
公共自旋()
{
初始化组件();
}
出现时受保护的覆盖无效()
{
base.OnAppearing();
_pageIsActive=true;
}
受保护的覆盖无效OnDisappearing()
{
base.OnDisappearing();
_pageIsActive=false;
}
异步任务AnimationLoop()
{
秒表复位();
秒表。开始();
while(_pageIsActive&&stopwatch.passed=360)
{
_度=0;
}
}
void DrawRotatedWithMatrix(SKCanvas画布、SKPath路径、SKPaint填充、SKPaint轮廓、浮动度、int cx、int cy)
{
var result=SKMatrix.MakeIdentity();
var translate=SKMatrix.maketranslate(-cx,-cy);
var rotate=SKMatrix.MakeRotationDegrees(度);
var translate2=SKMatrix.maketranslate(cx,cy);
SKMatrix.PostConcat(参考结果,翻译);
SKMatrix.PostConcat(参考结果,旋转);
SKMatrix.PostConcat(参考结果,翻译2);
路径变换(结果);
canvas.DrawPath(路径,填充);
canvas.DrawPath(路径、轮廓);
}
已单击私有无效按钮(对象发送者,事件参数e)
{
_pageIsActive=true;
动画循环();
}
私有无效按钮\u单击\u 1(对象发送者,事件参数e)
{
_pageIsActive=false;
}
}
我的spin.xaml

<StackLayout x:Name="viewx">
                <skia:SKCanvasView x:Name="skiaView" PaintSurface="OnCanvasViewPaintSurface" HeightRequest="500" WidthRequest="500"/>

            </StackLayout>

使用

如果点(x,y)包含在
ChartData[] chartData =
{
    new ChartData(10, SKColors.Red),
    new ChartData(10, SKColors.Green),
    new ChartData(10, SKColors.Blue),
    new ChartData(10, SKColors.Magenta),
    new ChartData(10, SKColors.Cyan),
    new ChartData(10, SKColors.Brown)
};
var segment = (rotationInDegrees / 360f) * chartData.Length;
var data = chartData[segement];
var color = data.Color;