private void CheckAndMoveLanding(TouchManipulationBitmap bmp)
        {
            float xcol = (bmp.Matrix.TransX - StartOffset) / QuadSize;
            float yrow = (bmp.Matrix.TransY - StartOffset) / QuadSize;

            int col = (int)Math.Round(xcol);
            int row = (int)Math.Round(yrow);

            if (!(col > Cols + 1 || col < -1 || row > row + 1 || row < -1))
            {
                if (col > Cols - 1)
                {
                    col = Cols - 1;
                }
                if (col < 0)
                {
                    col = 0;
                }
                if (row > Rows - 1)
                {
                    row = Rows - 1;
                }
                if (row < 0)
                {
                    row = 0;
                }
                SKPoint pt = BoundPoints[row * Cols + col];
                bmp.Matrix = SKMatrix.MakeTranslation(pt.X, pt.Y);
            }
        }
        private void InitializePictures()
        {
            // Load bitmaps
            Assembly assembly = GetType().GetTypeInfo().Assembly;

            string[] resourceIDs = (from tmp in assembly.GetManifestResourceNames()
                                    where tmp.Contains(".Puzzle.")
                                    select tmp).ToArray();

            SKImageInfo inf = new SKImageInfo((int)(ActualHeight * 1.2), (int)(ActualHeight * 0.8));

            for (int i = 0; i < resourceIDs.Length; i++)
            {
                using (Stream stream = assembly.GetManifestResourceStream(resourceIDs[i]))
                {
                    SKBitmap bitmap = SKBitmap.Decode(stream).Resize(inf, SKFilterQuality.High);
                    Bitmaps.Add(bitmap);
                }
            }


            inf = new SKImageInfo(QuadSize, QuadSize);
            int      imageId = rnd.Next(Bitmaps.Count);
            SKBitmap chosen  = Bitmaps[imageId];

            bitmapCollection = new List <TouchManipulationBitmap>();
            SKPoint position = new SKPoint(StartOffset, StartOffset);

            for (int row = 0; row < Rows; row++)
            {
                for (int col = 0; col < Cols; col++)
                {
                    SKBitmap bmpNew = new SKBitmap(QuadSize, QuadSize);
                    SKRect   dest   = new SKRect(0, 0, QuadSize, QuadSize);
                    SKRect   source = new SKRect(col * QuadSize, row * QuadSize, (col + 1) * QuadSize, (row + 1) * QuadSize);

                    using (SKCanvas canvas = new SKCanvas(bmpNew))
                    {
                        canvas.Clear();
                        canvas.DrawBitmap(chosen, source, dest);
                    }
                    TouchManipulationBitmap tmpBmp = new TouchManipulationBitmap(bmpNew, row * Cols + col)
                    {
                        Matrix = SKMatrix.MakeTranslation(position.X, position.Y)
                    };
                    BoundPoints.Add(position);
                    if (col == Cols - 1)
                    {
                        position.Y += QuadSize;
                        position.X  = StartOffset;
                    }
                    else
                    {
                        position.X += QuadSize;
                    }
                    bitmapCollection.Add(tmpBmp);
                }
            }
        }
Exemplo n.º 3
0
        void OnTouchEffectAction(object sender, TouchActionEventArgs args)
        {
            // Convert Xamarin.Forms point to pixels
            Point   pt    = args.Location;
            SKPoint point =
                new SKPoint((float)(canvasView.CanvasSize.Width * pt.X / canvasView.Width),
                            (float)(canvasView.CanvasSize.Height * pt.Y / canvasView.Height));

            switch (args.Type)
            {
            case TouchActionType.Pressed:
                for (int i = bitmapCollection.Count - 1; i >= 0; i--)
                {
                    TouchManipulationBitmap bitmap = bitmapCollection[i];

                    if (bitmap.HitTest(point))
                    {
                        // Move bitmap to end of collection
                        bitmapCollection.Remove(bitmap);
                        bitmapCollection.Add(bitmap);

                        // Do the touch processing
                        bitmapDictionary.Add(args.Id, bitmap);
                        bitmap.ProcessTouchEvent(args.Id, args.Type, point);
                        canvasView.InvalidateSurface();
                        break;
                    }
                }
                break;

            case TouchActionType.Moved:
                if (bitmapDictionary.ContainsKey(args.Id))
                {
                    TouchManipulationBitmap bitmap = bitmapDictionary[args.Id];
                    bitmap.ProcessTouchEvent(args.Id, args.Type, point);
                    canvasView.InvalidateSurface();
                }
                break;

            case TouchActionType.Released:
            case TouchActionType.Cancelled:
                if (bitmapDictionary.ContainsKey(args.Id))
                {
                    TouchManipulationBitmap bitmap = bitmapDictionary[args.Id];
                    bitmap.ProcessTouchEvent(args.Id, args.Type, point);
                    bitmapDictionary.Remove(args.Id);
                    canvasView.InvalidateSurface();
                }
                break;
            }
        }
Exemplo n.º 4
0
 internal static void DrawBitmap(this SKCanvas canvas, TouchManipulationBitmap bitmap, float transX = 0, float transY = 0, float scale = 1)
 {
     using (SKPaint paint = new SKPaint())
     {
         paint.IsAntialias = true;
         if (!bitmap.IsHide)
         {
             canvas.Save();
             SKMatrix matrix       = bitmap.Matrix;
             SKMatrix bitmapMatrix = new SKMatrix(matrix.ScaleX * scale, matrix.SkewX * scale, (matrix.TransX + transX) * scale, matrix.SkewY * scale, matrix.ScaleY * scale, (matrix.TransY + transY) * scale, 0, 0, 1);
             //canvas.Concat(ref bitmapMatrix);
             canvas.SetMatrix(bitmapMatrix);
             canvas.DrawBitmap(bitmap.Bitmap, 0, 0, paint);
             canvas.Restore();
         }
     }
 }
        private async void OnTouchEffectAction(object sender, TouchActionEventArgs args)
        {
            if (!canProcessTouchEvent)
            {
                return;
            }
            // Convert Xamarin.Forms point to pixels
            Point   pt    = args.Location;
            SKPoint point =
                new SKPoint((float)(canvasView.CanvasSize.Width * pt.X / canvasView.Width),
                            (float)(canvasView.CanvasSize.Height * pt.Y / canvasView.Height));

            switch (args.Type)
            {
            case TouchActionType.Pressed:
                for (int i = bitmapCollection.Count - 1; i >= 0; i--)
                {
                    TouchManipulationBitmap bitmap = bitmapCollection[i];

                    if (bitmap.HitTest(point))
                    {
                        // Move bitmap to end of collection
                        bitmapCollection.Remove(bitmap);
                        bitmapCollection.Add(bitmap);
                        // Do the touch processing
                        bitmapDictionary.Add(args.Id, bitmap);
                        bitmap.ProcessTouchEvent(args.Id, args.Type, point);
                        canvasView.InvalidateSurface();
                        break;
                    }
                }
                break;

            case TouchActionType.Moved:
                if (bitmapDictionary.ContainsKey(args.Id))
                {
                    TouchManipulationBitmap bitmap = bitmapDictionary[args.Id];
                    bitmap.ProcessTouchEvent(args.Id, args.Type, point);
                    canvasView.InvalidateSurface();
                }
                break;

            case TouchActionType.Released:
            case TouchActionType.Cancelled:
                if (bitmapDictionary.ContainsKey(args.Id))
                {
                    TouchManipulationBitmap bitmap = bitmapDictionary[args.Id];
                    bitmap.ProcessTouchEvent(args.Id, args.Type, point);
                    bitmapDictionary.Remove(args.Id);
                    CheckAndMoveLanding(bitmap);
                    bool check = CheckRightCombination();
                    canvasView.InvalidateSurface();
                    if (check)
                    {
                        await DisplayAlert("Victory", "You have won", "Ok");

                        SaveResult();
                        await Navigation.PopAsync();
                    }
                }
                break;
            }
        }