Exemple #1
0
    private void SetupPrefabs(int rows, int columns, Texture2D slicedTexture, bool tryLoadGameState)
    {
        var boardService = ServiceLocator.Get <IBoardService>();

        boardService.Setup(rows * columns,
                           pieceOutlineContainer,
                           puzzleContainer.transform);

        var pieceScaleFactor = 1f + (ImgSlicer.PADDING_RATIO * 2f);

        BoardContext.Instance.Setup(pieceScaleFactor, puzzleContainer.topRightBounds.position,
                                    puzzleContainer.bottomLeftBounds.position);

        var gameStateService = ServiceLocator.Get <IGameStateService>();

        gameStateService.TryLoad(expectedPieceCount: rows * columns);

        for (int col = 0; col < columns; ++col)
        {
            for (int row = 0; row < rows; ++row)
            {
                var pieceAnchor  = puzzleContainer.GetPieceAnchor(row, col);
                var anchorInPool = pool.GetPieceAnchor(row, col, columns);

                var isOnPlayField = gameStateService.IsPieceOnPlayField(col, row);
                var parent        = isOnPlayField ? pieceAnchor : anchorInPool;

                var newPrefab = Instantiate <PiecePrefab>(piecePrefabPrototype, parent, false);

                var uv0x = (float)col / (float)columns;
                var uv0y = (float)row / (float)rows;

                var uv3x = (float)(col + 1) / (float)columns;
                var uv3y = (float)(row + 1) / (float)rows;

                newPrefab.Setup(slicedTexture, new Vector2(uv0x, uv0y), new Vector2(uv3x - uv0x, uv3y - uv0y),
                                col, row, isOnPlayField);

                newPrefab.transform.localPosition = Vector3.zero;

                newPrefab.transform.localScale = new Vector3(pieceScaleFactor, pieceScaleFactor);

                newPrefab.pieceAnchor           = pieceAnchor;
                newPrefab.anchorInPool          = anchorInPool;
                newPrefab.pieceOutlineContainer = pieceOutlineContainer;

                if (isOnPlayField)
                {
                    boardService.MarkPieceOnPlayField(newPrefab);
                    newPrefab.transform.position = gameStateService.GetWorldPosition(col, row);
                    anchorInPool.gameObject.SetActive(false);
                    newPrefab.TryMoveBackgroundToBackgroundDisplay();
                }
            }
        }

        if (tryLoadGameState)
        {
            if (gameStateService.HasWon)
            {
                ReplacePiecesWithBackgroundOnVictory(0f, 0f);
            }
            else
            {
                boardService.SnapAndConnectLoadedPieces();
            }
        }
    }