示例#1
0
    void validatePreviousBlockDirection(Machine previousMachine, Machine nextMachine)
    {
        // change previous block direction if necessary
        if (previousMachine.position.z == nextMachine.position.z)   // horizontal relation --
        {
            Vector3           newRotation  = Vector3.zero;
            Machine.Direction newDirection = (previousMachine.position.x > nextMachine.position.x) ? Machine.Direction.Left : Machine.Direction.Right;

            newRotation.y = (float)newDirection;
            GameGrid.Instance.getMachineAt(previousMachine.position).gameObject.transform.rotation = Quaternion.Euler(newRotation);
            GameGrid.Instance.getMachineAt(previousMachine.position).direction = newDirection;
        }
        else if (previousMachine.position.x == nextMachine.position.x && previousMachine.direction != nextMachine.direction)     // vertical relation :
        {
            GameGrid.Instance.getMachineAt(previousMachine.position).gameObject.transform.rotation = nextMachine.gameObject.transform.rotation;
            GameGrid.Instance.getMachineAt(previousMachine.position).direction = nextMachine.direction;
        }
    }
示例#2
0
        public Toad(Machine.Direction dir) : this()
        {
            switch (dir)
            {
            case Machine.Direction.North:
                Rotate();
                FlipVertically();
                break;

            case Machine.Direction.East:
                break;

            case Machine.Direction.South:
                Rotate();
                break;

            case Machine.Direction.West:
                FlipHorizontally();
                break;

            default:
                break;
            }
        }
示例#3
0
        public Glider(Machine.Direction dir) : this()
        {
            switch (dir)
            {
            case Machine.Direction.NorthEast:
                FlipVertically();
                break;

            case Machine.Direction.SouthEast:
                break;

            case Machine.Direction.SouthWest:
                FlipHorizontally();
                break;

            case Machine.Direction.NorthWest:
                FlipHorizontally();
                FlipVertically();
                break;

            default:
                break;
            }
        }
示例#4
0
    private void placeBelt(Vector3 clickPoint)
    {
        Vector3 finalPosition = GameGrid.Instance.GetNearestPointOnGrid(clickPoint);

        // avoid overlapping
        if (finalPosition.y > 0.5f || !GameGrid.Instance.isAvailable(finalPosition))
        {
            // seems like he's trying to link existing belts
            if (previousMousePosition != finalPosition &&
                !GameGrid.Instance.isAvailable(previousMousePosition) &&
                GameGrid.Instance.getMachineAt(finalPosition) != GameGrid.Instance.getMachineAt(previousMousePosition)
                //GameGrid.Instance.getMachineAt(previousMousePosition).type == Machine.Type.Belt &&
                //GameGrid.Instance.getMachineAt(finalPosition).type == Machine.Type.Belt
                )
            {
                GameGrid.Instance.getMachineAt(finalPosition).addConnection(previousMousePosition, Machine.ConnectionType.Input);
                GameGrid.Instance.getMachineAt(previousMousePosition).addConnection(finalPosition, Machine.ConnectionType.Output);
            }
            previousMousePosition = finalPosition;
            return;
        }

        Vector3 mouseDirection = finalPosition - previousMousePosition;
        Vector3 itemDirection  = Vector3.zero;

        Machine.Direction direction = Machine.Direction.Right;

        if (mouseDirection.x < 0)
        {
            itemDirection.y = (float)Machine.Direction.Left;
            direction       = Machine.Direction.Left;
        }
        else if (mouseDirection.z > 0)
        {
            itemDirection.y = (float)Machine.Direction.Up;
            direction       = Machine.Direction.Up;
        }
        else if (mouseDirection.z < 0)
        {
            itemDirection.y = (float)Machine.Direction.Down;
            direction       = Machine.Direction.Down;
        }

        GameObject obj = Instantiate(selectedMachine.prefab, finalPosition, Quaternion.Euler(itemDirection));

        obj.name = finalPosition.ToString();
        Belt machine = new Belt(obj);

        machine.direction = direction;

        // if player started dragging from an existing conveyor belt, link it to the new one
        if (previousMousePosition != Vector3.zero &&
            !currentBelt.Contains(previousMousePosition) &&
            !GameGrid.Instance.isAvailable(previousMousePosition) &&
            GameGrid.Instance.getMachineAt(previousMousePosition).type == Machine.Type.Belt)
        {
            if (currentBelt.Count > 0)
            {
                validatePreviousBlockDirection(GameGrid.Instance.getMachineAt(currentBelt.Last()), GameGrid.Instance.getMachineAt(previousMousePosition));

                GameGrid.Instance.getMachineAt(currentBelt.Last()).addConnection(previousMousePosition, Machine.ConnectionType.Output);
                GameGrid.Instance.getMachineAt(previousMousePosition).addConnection(currentBelt.Last(), Machine.ConnectionType.Input);
            }
            currentBelt.Add(previousMousePosition);
        }

        GameGrid.Instance.place(machine);

        Belt lastMachine = null;

        if (currentBelt.Count > 0)
        {
            lastMachine = (Belt)GameGrid.Instance.machines[currentBelt.Last()];

            // new item and latest one are not neighbors
            if (!GameGrid.Instance.getNeighbors(finalPosition).Contains(lastMachine.position))
            {
                var lastItemNeighbors = GameGrid.Instance.getNeighbors(lastMachine.position);

                // find a common available neighbor to create the union
                foreach (Vector3 pos in GameGrid.Instance.getNeighbors(finalPosition))
                {
                    if (lastItemNeighbors.Contains(pos) && GameGrid.Instance.isAvailable(pos))
                    {
                        placeBelt(pos);

                        // refresh last item
                        lastMachine = (Belt)GameGrid.Instance.machines[currentBelt.Last()];
                        break;
                    }
                }
            }
        }

        currentBelt.Add(finalPosition);

        if (lastMachine != null)
        {
            validatePreviousBlockDirection(lastMachine, machine);

            // connect them
            GameGrid.Instance.getMachineAt(lastMachine.position).addConnection(finalPosition, Machine.ConnectionType.Output);
            GameGrid.Instance.getMachineAt(finalPosition).addConnection(lastMachine.position, Machine.ConnectionType.Input);
        }

        previousMousePosition = finalPosition;
    }