예제 #1
0
    public void UpdatePosition()
    {
        if (_leaderGameObject == null)
        {
            Debug.LogError("leader object is null");
            return;
        }

        if (_tail == null)
        {
            return;
        }

        var position = _tail.transform.position;

        LastPosition = position;

        position = _leaderGameObject.LastPosition;
        _tail.transform.position = position;

        if (_levelManager.IsCellOccupiedByPlayer(new IntVector2((int)position.x, (int)position.y)))
        {
            ReducePlayerLife();
        }

        _levelManager.UpdateCentipedeCell(new IntVector2((int)LastPosition.x, (int)LastPosition.y),
                                          new IntVector2((int)position.x, (int)position.y));
    }
예제 #2
0
    public void UpdatePosition(Action action)
    {
        if (_head == null)
        {
            Debug.LogWarning("head is null");
            return;
        }

        if (_canMove && Vector3.Distance(_head.transform.position, _targetPosition) < 0.001f)
        {
            _onHeadMove = action;
            _canMove    = false;

            Vector3 newPosition = _targetPosition + Vector3.right * (int)HorizontalDirection;

            IntVector2 position = new IntVector2((int)newPosition.x, (int)newPosition.y);

            if (position.x > _gridSize.x - 1)
            {
                if (position.y >= _gridSize.y - 1 || position.y <= 0)
                {
                    VerticalDirection = VerticalDirection == VerticalDirection.Up
                        ? VerticalDirection.Down
                        : VerticalDirection.Up;
                }

                newPosition.x       = _gridSize.x - 1;
                newPosition        += Vector3.up * (int)VerticalDirection;
                HorizontalDirection = HorizontalDirection == HorizontalDirection.Left ? HorizontalDirection.Right : HorizontalDirection.Left;
            }

            if (position.x < 0)
            {
                if (position.y >= _gridSize.y - 1)
                {
                    VerticalDirection = VerticalDirection.Down;
                }
                else if (position.y <= 0)
                {
                    VerticalDirection = VerticalDirection.Up;
                }

                newPosition.x       = 0;
                newPosition        += Vector3.up * (int)VerticalDirection;
                HorizontalDirection = HorizontalDirection == HorizontalDirection.Left ? HorizontalDirection.Right : HorizontalDirection.Left;
            }

            if (_levelManager.IsCellOccupiedByMushroom(new IntVector2((int)newPosition.x, (int)newPosition.y)) ||
                _levelManager.IsCellOccupiedByCentipede(new IntVector2((int)newPosition.x, (int)newPosition.y)))
            {
                newPosition.x = _targetPosition.x;
                Vector3 cellPos = newPosition + Vector3.up * (int)VerticalDirection;
                if (cellPos.y >= _gridSize.y - 1 || cellPos.y <= 0)
                {
                    VerticalDirection = VerticalDirection == VerticalDirection.Up
                        ? VerticalDirection.Down
                        : VerticalDirection.Up;
                    newPosition += Vector3.up * (int)VerticalDirection;
                }
                else
                {
                    newPosition = cellPos;
                }

                HorizontalDirection = HorizontalDirection == HorizontalDirection.Left ? HorizontalDirection.Right : HorizontalDirection.Left;
            }

            if (_levelManager.IsCellOccupiedByPlayer(new IntVector2((int)newPosition.x, (int)newPosition.y)))
            {
                ReducePlayerLife();
            }

            _targetPosition = newPosition;
            MainApp.Instance.StartCoroutine(MoveHead(1f / _speed));
        }
    }