指定区域是否被像素填充满

相关涉及到的一些坐标转换函数:

canvasCam.ViewportToWorldPoint(uvWorldPosition);

RectTransformUtility.PixelAdjustPoint(result.screenPosition, StratchCover,curCanvas );

RectTransformUtility.ScreenPointToLocalPointInRectangle(StratchCover, mousePosition, uiCam, out posIn)

一些基础定义:

using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class TargetImage
{
    public bool isPaintedFlag = false;
    //test 
    public Image Image;
    //
    public Rect Rect { get; private set; }
    private float AllSquare;
    private List<Point> points;
   
    private int wL = 10;
    private int hL = 10;

    public TargetImage(Rect rect)
    {
        Rect = rect;

        // initialize points
        points = new List<Point>((wL) * (hL));
        float stepX = Rect.width / wL;
        float stepY = Rect.height / hL;
        float X = Rect.x;
        float Y = Rect.y;

        for (int i = 0; i < wL; i++)
        {
            X = Rect.x;

            for (int j = 0; j < hL; j++)
            {
                var point = new Point(new Vector2(X, Y));
                points.Add(point);

                X += stepX;

                //     Debug.Log(string.Format("[{0}_{1}] {2}",i,j, point.Position));
            }
            
            Y += stepY;
        }

        //  Debug.Log("All counts"+points.Count);
    }

    public bool AddIntersectRects(Rect rect)
    {
        if (isPaintedFlag) return true;

        int paintCount = 0;
        for (var index = 0; index < points.Count; index++)
        {
            var point = points[index];

                  
            if (rect.Contains(point.Position) && !point.isPaint)
            {
                point.isPaint = true;
            }

            if (point.isPaint)
            {
                paintCount++;
            }

        }

        float percent = paintCount / (points.Count*1f);

        isPaintedFlag = percent > 0.7f;

        return isPaintedFlag;
    }
    public void ResetRects()
    {
        isPaintedFlag = false;
        int paintCount = 0;
        for (var index = 0; index < points.Count; index++)
        {
            var point = points[index];
            point.isPaint = false;
        }
    }
}

class Point
{
    public Vector2 Position { get; private set; }
    public bool isPaint { get; set; }

    public Point(Vector2 position)
    {
        Position = position;
    }
}

具体使用实例:

  void Update()
    {
        if (UIManager.instance.IsUIOpen("DlgWait") == false)
        {
            if (Input.GetMouseButton(0))
            {
                if (Input.mousePosition != mousePosition)
                {
                    mousePosition = Input.mousePosition;
                    TouchProcessing();
                }
            }

            if (Input.GetMouseButtonUp(0))
            {
                guagualeaudionum = 0;
            }

            if (Input.GetKeyDown(KeyCode.R))
            {
                TicketReset();

            }
        }

     
    }
    private void TouchProcessing()
    {
        if (brushCounter >= MAX_BRUSH_COUNT)
            return;

        Vector3 screenpos = Vector3.zero;
        Vector3 uvWorldPosition = Vector3.zero;

        if (GetPositionsOnPaintView(ref screenpos, ref uvWorldPosition))
        {
            PaintStratch(uvWorldPosition);
            BrushRect.x = screenpos.x - BrushRect.width / 2;
            BrushRect.y = screenpos.y - BrushRect.height / 2;
            LotteryTicket.CanculateIntersects(BrushRect);
        }
    }
    public void CanculateIntersects(Rect brushRect)
    {
        var opened = 0;

        for (var index = 0; index < m_scratchBonus.Length; index++)
        {
            var bonus = m_scratchBonus[index];
            if (bonus.TargetImage.isPaintedFlag)
            {
                continue;
            }
            opened++;

            Rect result;
            //Debug.Log(brushRect+":"+bonus.TargetImage.Rect);

            // RectTransformUtility.PointInRectangle(brushRect,);
            
            if (brushRect.Intersects(bonus.TargetImage.Rect, out result))
            {
                var addIntersectRects = bonus.TargetImage.AddIntersectRects(result);
                if (addIntersectRects)
                {
                   // bonus.TargetImage.Image.color = Color.green;
                }
            }
        }

        if (opened == 0)
        {
            ShowResult();
        }
     

    }

猜你喜欢

转载自blog.csdn.net/osuckseed/article/details/108552695