示例#1
0
    void Start()
    {
        triGrid = GetComponent <TriGrid>();
        var blockSize = triGrid.cellSize * 4;
        var gridSize  = triGrid.gridSize;

        this.gameObject.layer = LayerMask.NameToLayer("PuzzleBoard");
        var collider     = this.gameObject.AddComponent <BoxCollider2D>();
        var colliderSize = CoordsUtils.OrthoToSlope(new Vector2(blockSize * gridSize.x, blockSize * gridSize.y));

        collider.size   = colliderSize * 2;
        collider.offset = colliderSize / 2f;
        LoadPuzzle(puzzleId);
    }
示例#2
0
    // Start is called before the first frame update
    void Start()
    {
        GameObject grid = new GameObject();

        grid.name          = "grid";
        triGrid            = grid.AddComponent <TriGrid>();
        triGrid.gridSize   = new Vector2Int(1, 1);
        triGrid.blocks     = new TriBlock[] { shape };
        triGrid.cellPrefab = cellPrefab;
        triGrid.cellSize   = cellSize;
        grid.transform.SetParent(transform, false);
        grid.transform.localPosition = Vector3.zero;
        this.gameObject.layer        = LayerMask.NameToLayer("PuzzlePiece");

        var   collider     = gameObject.AddComponent <BoxCollider2D>();
        float blockSize    = cellSize * 4f;
        var   colliderSize = CoordsUtils.OrthoToSlope(new Vector2(blockSize, blockSize));

        collider.size   = colliderSize;
        collider.offset = colliderSize / 2f;
    }
示例#3
0
    void Start()
    {
        triCells = new TriCell[blocks.Length, 16];
        float blockSize = cellSize * 4;

        for (int y = 0; y < gridSize.y; y++)
        {
            for (int x = 0; x < gridSize.x; x++)
            {
                Vector2 origin = new Vector2(x, y) * blockSize;
                origin = CoordsUtils.OrthoToSlope(origin);
                GameObject blockObj = new GameObject();
                blockObj.name = "block" + x + "," + y;
                blockObj.transform.SetParent(transform, false);
                blockObj.transform.localPosition = origin;
                blockObj.hideFlags = HideFlags.DontSave;
                int      index = y * gridSize.x + x;
                TriBlock block = blocks[index];
                for (int i = 0; i < 16; i++)
                {
                    int        ix       = i % 4;
                    int        iy       = i / 4;
                    uint       mask     = invert ? ~block.mask : block.mask;
                    uint       cellMask = mask >> (i * 2) & 3;
                    GameObject cell     = Instantiate <GameObject>(cellPrefab);
                    cell.name = "cell" + i;
                    cell.transform.SetParent(blockObj.transform, false);
                    var cellPos = CoordsUtils.OrthoToSlope(new Vector2(ix, iy) * cellSize);
                    cell.transform.localPosition = cellPos;
                    var triCell = cell.GetComponent <TriCell>();
                    triCell.UpdatePresentation(cellMask);
                    triCells[index, i] = triCell;
                }
            }
        }
    }
示例#4
0
    void Update()
    {
        var mousePos = Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, 0));

        if (Input.GetButtonDown("Fire1"))
        {
            Ray          ray       = Camera.main.ScreenPointToRay(Input.mousePosition);
            RaycastHit2D hit       = Physics2D.GetRayIntersection(ray, Mathf.Infinity, LayerMask.GetMask("PuzzlePiece"));
            var          hitTarget = hit.collider?.gameObject;
            puzzlePiece = hitTarget?.GetComponent <PuzzlePiece>();
            if (puzzlePiece != null)
            {
                if (!puzzlePiece.canMove)
                {
                    var go         = Instantiate(puzzlePiece.selfPrefab);
                    var prevPuzzle = puzzlePiece;
                    var mask       = puzzlePiece.shape.mask;
                    go.transform.position  = puzzlePiece.transform.position;
                    puzzlePiece            = go.GetComponent <PuzzlePiece>();
                    puzzlePiece.shape.mask = mask;
                    puzzlePiece.variations = prevPuzzle.variations;
                    puzzlePiece.selfPrefab = prevPuzzle.selfPrefab;
                    puzzlePiece.canMove    = true;
                    puzzlePiece.selected   = true;
                }
                offset      = puzzlePiece.transform.position - mousePos;
                originalPos = puzzlePiece.transform.position;
                ItemSlots.Instance.DescreaseCount(puzzlePiece.id);
            }
        }

        if (Input.GetButton("Fire1"))
        {
            if (puzzlePiece != null)
            {
                puzzlePiece.transform.position = mousePos + offset;
            }
        }

        if (Input.GetButtonUp("Fire1"))
        {
            if (puzzlePiece != null)
            {
                Ray          ray         = Camera.main.ScreenPointToRay(Input.mousePosition);
                RaycastHit2D hit         = Physics2D.GetRayIntersection(ray, Mathf.Infinity, LayerMask.GetMask("PuzzleBoard"));
                var          hitTarget   = hit.collider?.gameObject;
                var          grid        = hitTarget?.GetComponent <TriGrid>();
                var          puzzleBoard = hitTarget?.GetComponent <PuzzleBoard>();
                if (grid != null && puzzleBoard != null)
                {
                    Vector2 relativePos = new Vector2(puzzlePiece.transform.position.x, puzzlePiece.transform.position.y) - new Vector2(grid.transform.position.x, grid.transform.position.y);
                    Vector2 orthoPos    = CoordsUtils.SlopeToOrtho(relativePos) / grid.cellSize;
                    Debug.Log("puzzle: " + puzzlePiece.transform.position + "; grid: " + grid.transform.position);
                    Vector2Int gridOffset   = new Vector2Int(Mathf.RoundToInt(orthoPos.x), Mathf.RoundToInt(orthoPos.y));
                    bool       canFit       = grid.CanFit(gridOffset.x, gridOffset.y, puzzlePiece.shape);
                    bool       isOutOfBound = grid.IsOutOfBound(gridOffset.x, gridOffset.y);
                    Debug.Log("canFit: " + canFit + ", isOutOfBound: " + isOutOfBound + " gridOffset: " + gridOffset);
                    if (canFit && !isOutOfBound)
                    {
                        puzzleBoard.Attach(gridOffset.x, gridOffset.y, puzzlePiece.shape);
                        ClinicManager.instance.MedicinesCost[puzzlePiece.id] += 1;
                    }
                }
                Destroy(puzzlePiece.gameObject);
            }
        }
    }