示例#1
0
    protected override void Awake()
    {
        base.Awake();

        selection = Instantiate(selection);
        selection.transform.localScale = new Vector3(GridManager.PIECE_WIDTH, GridManager.PIECE_WIDTH, GridManager.PIECE_WIDTH);

        nextBombSpawnScore = bombInterval;

        inputReceiver.ClickEvent += OnClick;
        inputReceiver.SwipeEvent += OnSwipe;
    }
示例#2
0
    // Rotate the selected hexagon pieces on the grid around the center point by degrees
    public IEnumerator RotateSelection(TupleSelection selection, float degrees)
    {
        Quaternion currentAngles   = Quaternion.Euler(selection.transform.localEulerAngles);
        Vector3    initialRotation = new Vector3();
        Vector3    targetRotation  = new Vector3(0f, 0f, degrees);

        HexagonPiece piece1 = selection.Tuple.piece1;
        HexagonPiece piece2 = selection.Tuple.piece2;
        HexagonPiece piece3 = selection.Tuple.piece3;

        // Rotation happens by rotation the direction vectors
        Vector3 selectionCenter = selection.transform.localPosition;
        Vector3 dir1            = piece1.transform.localPosition - selectionCenter;
        Vector3 dir2            = piece2.transform.localPosition - selectionCenter;
        Vector3 dir3            = piece3.transform.localPosition - selectionCenter;

        float t           = 0f;
        float tMultiplier = selectionRotateSpeed / Mathf.Abs(degrees);

        while ((t = t + Time.deltaTime * tMultiplier) < 1f)
        {
            // Using Quaternion.LerpUnclamped applies no rotation for degrees=360, this is actually smart but not desirable in this case
            Quaternion rotation = Quaternion.Euler(Vector3.LerpUnclamped(initialRotation, targetRotation, t));

            selection.transform.localRotation = currentAngles * rotation;
            piece1.transform.localPosition    = selectionCenter + rotation * dir1;
            piece2.transform.localPosition    = selectionCenter + rotation * dir2;
            piece3.transform.localPosition    = selectionCenter + rotation * dir3;

            yield return(null);
        }

        // Can't rely on floating point precision, rotated pieces may deviate from their intended positions after a number of turns,
        // put the rotated pieces at their exact position after the rotation is complete
        selection.transform.localRotation = currentAngles * Quaternion.Euler(targetRotation);
        piece1.transform.localPosition    = GridManager.Instance[piece1.X].CalculatePositionAt(piece1.Y);
        piece2.transform.localPosition    = GridManager.Instance[piece2.X].CalculatePositionAt(piece2.Y);
        piece3.transform.localPosition    = GridManager.Instance[piece3.X].CalculatePositionAt(piece3.Y);
    }