void OnContainerSizeChanged(object sender, EventArgs args)
        {
            View   container = (View)sender;
            double width     = container.Width;
            double height    = container.Height;

            if (width <= 0 || height <= 0)
            {
                return;
            }

            // Orient StackLayout based on portrait/landscape mode.
            stackLayout.Orientation = (width < height) ? StackOrientation.Vertical :
                                      StackOrientation.Horizontal;

            // Calculate tile size and position based on ContentView size.
            tileSize = Math.Min(width, height) / this.puzzle.width;
            absoluteLayout.WidthRequest  = this.puzzle.width * tileSize;
            absoluteLayout.HeightRequest = this.puzzle.width * tileSize;

            Random random = new Random();

            foreach (View fileView in absoluteLayout.Children)
            {
                JigsawTile tile = JigsawTile.Dictionary[fileView];

                AbsoluteLayout.SetLayoutBounds(fileView, new Rectangle(random.NextDouble() * ((this.puzzle.width - 1) * tileSize),
                                                                       random.NextDouble() * ((this.puzzle.width - 1) * tileSize), tileSize, tileSize));
            }
        }
Beispiel #2
0
 void FuzhiUsable()
 {
     usableJigsawTile.Clear();
     foreach (var item in curentJigsawTile)
     {
         JigsawTile tempTile = null;
         tempTile = item.GetJigsawTile(item.adjacentTile.upTileid);
         if (tempTile != null && !usableJigsawTile.Contains(tempTile))
         {
             usableJigsawTile.Add(tempTile);
         }
         tempTile = item.GetJigsawTile(item.adjacentTile.rightTileid);
         if (tempTile != null && !usableJigsawTile.Contains(tempTile))
         {
             usableJigsawTile.Add(tempTile);
         }
         tempTile = item.GetJigsawTile(item.adjacentTile.downTileid);
         if (tempTile != null && !usableJigsawTile.Contains(tempTile))
         {
             usableJigsawTile.Add(tempTile);
         }
         tempTile = item.GetJigsawTile(item.adjacentTile.leftTileid);
         if (tempTile != null && !usableJigsawTile.Contains(tempTile))
         {
             usableJigsawTile.Add(tempTile);
         }
     }
     foreach (var temp in curentJigsawTile)
     {
         if (usableJigsawTile.Contains(temp))
         {
             usableJigsawTile.Remove(temp);
         }
     }
 }
        public JigsawPuzzlePage(Puzzle puzzle, Attraction attraction)
        {
            InitializeComponent();
            gc = GameController.getInstance();
            subtitles.Source = ServerConection.URL_MEDIA + "subtitles.jpg";
            info.Source      = ServerConection.URL_MEDIA + "info.jpg";
            playVideo.Source = ServerConection.URL_MEDIA + "playVideo.jpg";
            scoreLabel.Text  = AppResources.score + ": " + gc.GetScore();
            how.Source       = ServerConection.URL_MEDIA + "how.png";
            this.puzzle      = puzzle;
            tiles            = new List <JigsawTile>();
            this.attraction  = attraction;

            for (int row = 0; row < puzzle.width; row++)
            {
                for (int col = 0; col < puzzle.height; col++)
                {
                    JigsawTile tile = new JigsawTile(row, col, puzzle.piecesURLS[row * puzzle.width + col]);

                    PanGestureRecognizer panGestureRecognizer = new PanGestureRecognizer();
                    panGestureRecognizer.PanUpdated += OnTilePanUpdated;
                    tile.TileView.GestureRecognizers.Add(panGestureRecognizer);

                    tiles.Add(tile);
                    absoluteLayout.Children.Add(tile.TileView);
                }
            }
        }
Beispiel #4
0
 //遍历已经合成的图块
 void Recursive(JigsawTile tree)
 {
     if (!tree.visited && tree.tilesTree.Count > 0)
     {
         tree.visited = true;
         foreach (var item in tree.tilesTree)
         {
             Recursive(item);
         }
     }
     if (!tempList.Contains(tree))
     {
         tempList.Add(tree);
     }
 }
Beispiel #5
0
    void Set(JigsawTile tile1, JigsawTile tile2)
    {
        //合成准备
        if (tile2.compound)
        {
            tile1.compound = true;
            tile1.transform.SetParent(tile2.parentTile.transform);
            tile1.parentTile = tile2.parentTile;
            if (!tile1.parentTile.curentJigsawTile.Contains(tile1))
            {
                parentTile.curentJigsawTile.Add(tile1);
            }
            tile1.SetPosition(tile2.GetPosition() + jg.GetTilePos(tile2.id, tile1.id));
            return;
        }

        //赋值相对位置
        tile1.compound = true;
        tile2.compound = true;
        GameObject tileParent = Instantiate(jg.tileParent);

        tile1.parentTile = tileParent.GetComponent <JigsawTileParent>();
        tile2.parentTile = tile1.parentTile;
        if (!tile1.parentTile.curentJigsawTile.Contains(tile1))
        {
            tile1.parentTile.curentJigsawTile.Add(tile1);
        }
        if (!tile1.parentTile.curentJigsawTile.Contains(tile2))
        {
            tile1.parentTile.curentJigsawTile.Add(tile2);
        }
        //Set
        tileParent.name = "tileParent";
        tileParent.transform.SetParent(jg.transform);
        tileParent.transform.localScale = Vector3.one;
        (tileParent.transform as RectTransform).anchoredPosition = tile1._thisRect.anchoredPosition;
        (tileParent.transform as RectTransform).sizeDelta        = tile1._thisRect.sizeDelta;
        //setParent
        tile1.transform.SetParent(tileParent.transform);
        tile2.transform.SetParent(tileParent.transform);
        tile2.SetPosition(tile1.GetPosition() + jg.GetTilePos(tile1.id, tile2.id));
    }
Beispiel #6
0
    /// <summary>
    /// 切割
    /// </summary>
    public void Split(int rc)
    {
        int count = 1;

        for (int r = 0; r < rc; r++)
        {
            for (int c = 0; c < rc; c++)
            {
                GameObject go = Instantiate(tileItem);
                go.name = $"tile{r}{c}";

                JigsawTile tile = go.GetComponent <JigsawTile>();
                tile.id        = count++;
                tile.DragEvent = () => { _curJigsawTile = tile; lastPos = tile._thisRect.anchoredPosition; };//拖拽事件
                tile.AllMove   = FinishTileMove;
                _allJigsawTiles.Add(tile);
                go.transform.SetParent(this.transform, false);
            }
        }
    }
Beispiel #7
0
    /// <summary>
    /// oh is good
    /// </summary>
    /// <param name="tile1">thisTile</param>
    /// <param name="tile2">item</param>
    public void Joint(JigsawTile tile1, JigsawTile tile2)
    {
        if (tile2.compound)
        {
            tile1.compound = true;
            tile1.transform.SetParent(tile2.parentTile.transform);
            tile1.parentTile = tile2.parentTile;
            if (!tile1.parentTile.curentJigsawTile.Contains(tile1))
            {
                tile1.parentTile.curentJigsawTile.Add(tile1);
            }
            tile1.SetPosition(tile2.GetPosition() + GetTilePos(tile2.id, tile1.id));
            tile1.parentTile.IsReachAStandard?.Invoke();
            return;
        }

        //赋值相对位置
        tile1.compound = true;
        tile2.compound = true;
        GameObject parent = Instance();

        tile1.parentTile = parent.GetComponent <JigsawTileParent>();
        tile2.parentTile = tile1.parentTile;
        if (!tile1.parentTile.curentJigsawTile.Contains(tile1))
        {
            tile1.parentTile.curentJigsawTile.Add(tile1);
        }
        if (!tile1.parentTile.curentJigsawTile.Contains(tile2))
        {
            tile1.parentTile.curentJigsawTile.Add(tile2);
        }
        //Set
        (parent.transform as RectTransform).anchoredPosition = tile1._thisRect.anchoredPosition;
        (parent.transform as RectTransform).sizeDelta        = tile1._thisRect.sizeDelta;
        //setParent
        tile1.transform.SetParent(parent.transform);
        tile2.transform.SetParent(parent.transform);
        tile2.SetPosition(tile1.GetPosition() + GetTilePos(tile1.id, tile2.id));
        tile2.parentTile.IsReachAStandard?.Invoke();
    }
        void OnTilePanUpdated(object sender, PanUpdatedEventArgs e)
        {
            View       tileView = (View)sender;
            JigsawTile tile     = JigsawTile.Dictionary[tileView];

            if (tile.isSetOnPossition)
            {
                return;
            }

            double newXPosition = getXPositionOfTile(e, tileView);

            if (!(newXPosition <= 0 || newXPosition >= Math.Abs(tileSize - absoluteLayout.WidthRequest)))
            {
                tileView.TranslationX = tileView.TranslationX + e.TotalX;
            }

            double newYPosition = getYPositionOfTile(e, tileView);

            if (!(newYPosition <= 0 || newYPosition >= Math.Abs(tileSize - absoluteLayout.HeightRequest)))
            {
                tileView.TranslationY = tileView.TranslationY + e.TotalY;
            }

            double xDeltaFromCorrectPossition = Math.Abs(tileSize * tile.correctCol - newXPosition);
            double yDeltaFromCorrectPossition = Math.Abs(tileSize * tile.correctRow - newYPosition);

            if (xDeltaFromCorrectPossition < 3 && yDeltaFromCorrectPossition < 3)
            {
                tileView.TranslationX = tileSize * tile.correctCol - tileView.X;
                tileView.TranslationY = tileSize * tile.correctRow - tileView.Y;
                absoluteLayout.LowerChild(tileView);
                tile.isSetOnPossition = true;
                isPuzzleSolvedAsync();
            }
        }
Beispiel #9
0
 //吸附
 void Adsorb()
 {
     foreach (var item in jg.AllJigsawTiles)
     {
         if (item.id == adjacentTile.upTileid)
         {
             Vector3 targetPos = jg.transform.InverseTransformPoint(item.downPoint.transform.position);
             Vector3 localPos  = jg.transform.InverseTransformPoint(this.upPoint.transform.position);
             if ((localPos - targetPos).sqrMagnitude < _adsorptionDistance)
             {
                 JigsawTile tempTile = item;
                 //清除两个图块的互交
                 this.adjacentTile.upTileid       = 0;
                 tempTile.adjacentTile.downTileid = 0;
                 //清除点
                 this.upPoint       = null;
                 tempTile.downPoint = null;
                 //连接两图块id
                 this.tileTree.upTileid       = tempTile.id;
                 tempTile.tileTree.downTileid = this.id;
                 //为连接的图块列表赋值
                 this.tilesTree.Add(GetJigsawTile(this.tileTree.upTileid));
                 tempTile.tilesTree.Add(GetJigsawTile(tempTile.tileTree.downTileid));
                 //合成准备
                 jg.Joint(this, tempTile);
             }
         }
         else if (item.id == adjacentTile.rightTileid)
         {
             Vector3 targetPos = jg.transform.InverseTransformPoint(item.leftPoint.transform.position);
             Vector3 localPos  = jg.transform.InverseTransformPoint(this.rightPoint.transform.position);
             if ((localPos - targetPos).sqrMagnitude < _adsorptionDistance)
             {
                 JigsawTile tempTile = item;
                 //清除两个图块的互交
                 this.adjacentTile.rightTileid    = 0;//使之只执行一次
                 tempTile.adjacentTile.leftTileid = 0;
                 //清除点
                 this.rightPoint    = null;
                 tempTile.leftPoint = null;
                 //连接两图块id
                 this.tileTree.rightTileid    = tempTile.id;
                 tempTile.tileTree.leftTileid = this.id;
                 //为连接的图块列表赋值
                 this.tilesTree.Add(GetJigsawTile(this.tileTree.rightTileid));
                 tempTile.tilesTree.Add(GetJigsawTile(tempTile.tileTree.leftTileid));
                 //合成准备
                 jg.Joint(this, tempTile);
             }
         }
         else if (item.id == adjacentTile.downTileid)
         {
             Vector3 targetPos = jg.transform.InverseTransformPoint(item.upPoint.transform.position);
             Vector3 localPos  = jg.transform.InverseTransformPoint(this.downPoint.transform.position);
             if ((localPos - targetPos).sqrMagnitude < _adsorptionDistance)
             {
                 JigsawTile tempTile = item;
                 //清除两个图块的互交
                 this.adjacentTile.downTileid   = 0;//使之只执行一次
                 tempTile.adjacentTile.upTileid = 0;
                 //清除点
                 this.downPoint   = null;
                 tempTile.upPoint = null;
                 //连接两图块id
                 this.tileTree.downTileid   = tempTile.id;
                 tempTile.tileTree.upTileid = this.id;
                 //为连接的图块列表赋值
                 this.tilesTree.Add(GetJigsawTile(this.tileTree.downTileid));
                 tempTile.tilesTree.Add(GetJigsawTile(tempTile.tileTree.upTileid));
                 //合成准备
                 jg.Joint(this, tempTile);
             }
         }
         else if (item.id == adjacentTile.leftTileid)
         {
             Vector3 targetPos = jg.transform.InverseTransformPoint(item.rightPoint.transform.position);
             Vector3 localPos  = jg.transform.InverseTransformPoint(this.leftPoint.transform.position);
             if ((localPos - targetPos).sqrMagnitude < _adsorptionDistance)
             {
                 JigsawTile tempTile = item;
                 //清除两个图块的互交
                 this.adjacentTile.leftTileid      = 0;//使之只执行一次
                 tempTile.adjacentTile.rightTileid = 0;
                 //清除点
                 this.leftPoint      = null;
                 tempTile.rightPoint = null;
                 //连接两图块id
                 this.tileTree.leftTileid      = tempTile.id;
                 tempTile.tileTree.rightTileid = this.id;
                 //为连接的图块列表赋值
                 this.tilesTree.Add(GetJigsawTile(this.tileTree.leftTileid));
                 tempTile.tilesTree.Add(GetJigsawTile(tempTile.tileTree.rightTileid));
                 //合成准备
                 jg.Joint(this, tempTile);
             }
         }
     }
 }