Esempio n. 1
0
    private void CalculaNextPosition(SnakePart part)
    {
        Vector2 currentDirection     = part.GetCurrentDirection(); //dirección actual
        Vector2 currentPosition      = part.GetPrevPosition();     //posición desde la que calculamos la siguiente
        float   desplazacimentoTotal = part.getWidth();            //cuanto desplazamiento entre prev y next ha de existir (es el ancho del sprite de la serpiente)

        Vector2 nextPosition = new Vector2(currentPosition.x + (desplazacimentoTotal * currentDirection.x), currentPosition.y + (desplazacimentoTotal * currentDirection.y));

        //asignamos la anterior dirección como siguiente dirección de la siguiente parte si tiene siguiente parte
        if (part.GetNextPart())
        {
            part.GetNextPart().GetComponent <SnakePart>().AddDirection(part.GetCurrentDirection());
        }

        //asignamos la nueva siguiente posición calculada
        part.SetNextPosition(nextPosition);
    }
Esempio n. 2
0
    private void ControlMovement(SnakePart part)
    {
        float moveHorizontal = Input.GetAxis("Horizontal");
        float moveVertical   = Input.GetAxis("Vertical");

        //si hay algun tipo de movimiento añadimos la dirección a la pila de direcciones
        if (moveHorizontal != 0 || moveVertical != 0)
        {
            //si pulsamos derecha
            if (moveHorizontal > 0)
            {
                part.AddDirection(Vector2.right);
            }
            //si pulsamos izquierda
            else if (moveHorizontal < 0)
            {
                part.AddDirection(Vector2.left);
            }
            //si pusamos arriba
            else if (moveVertical > 0)
            {
                part.AddDirection(Vector2.up);
            }
            //si pulsamos abajo
            else if (moveVertical < 0)
            {
                part.AddDirection(Vector2.down);
            }

            //si aun no nos movemos, cogemos directamente la siguiente dirección
            if (part.GetCurrentDirection() == Vector2.zero)
            {
                part.NextDirection();
            }
        }
    }
Esempio n. 3
0
    void Update()
    {
        if (GetGameOverState() == false && Time.timeScale != 0)
        {
            //cojemos la cabeza primero y su controlador
            GameObject obj  = cabeza;
            SnakePart  part = obj.GetComponent <SnakePart>();

            //control de movimiento (solo cabeza)
            ControlMovement(part);

            //actualizamos la posicion siguiente de cada parte de la serpiente
            while (obj != null)
            {
                //calcula la siguiente posición
                CalculaNextPosition(part);

                //si la dirección actual es distinta de 0 (si hay movimiento) o si hay cambios de dirección pendientes
                if (part.GetCurrentDirection() != Vector2.zero || part.GetNumDirections() > 0)
                {
                    //Si la posición actual es >= que la siguiente (si ya se ha llegado a la siguiente posición)
                    if (DistanciaMaxima(obj.transform.position, part.GetNextPosition(), part.GetCurrentDirection()))
                    {
                        //actualizamos la actual a la siguiente (la nueva siguiente se actualiza en el update)
                        part.SetPrevPosition(part.GetNextPosition());

                        //por si nos pasamos actualizamos la posición del objeto
                        obj.transform.position = part.GetPrevPosition();

                        //si tiene que crecer, añadimos una nueva parte
                        if (crecer && obj == ultimaParte)
                        {
                            crecer = false;
                            AddPart();
                        }

                        //si hay direcciones pendientes, cambiamos de dirección
                        if (part.GetNumDirections() > 0)
                        {
                            Vector2 newDirection = part.NextDirection();

                            obj.transform.position = Vector3.Lerp(obj.transform.position, new Vector3(obj.transform.position.x + newDirection.x, obj.transform.position.y + newDirection.y), Time.deltaTime * speed);
                        }
                        //si no hay direccion pendiente mantenemos la actual
                        else
                        {
                            obj.transform.position = Vector3.Lerp(obj.transform.position, new Vector3(obj.transform.position.x + part.GetCurrentDirection().x, obj.transform.position.y + part.GetCurrentDirection().y), Time.deltaTime * speed);
                        }

                        //comprovamos si hay siguiente parte e iniciamos movimiento si no se mueve
                        GameObject nextGameObject = part.GetNextPart();
                        if (nextGameObject)
                        {
                            SnakePart partNextObject = nextGameObject.GetComponent <SnakePart>();

                            if (partNextObject.GetCurrentDirection() == Vector2.zero)
                            {
                                partNextObject.NextDirection();
                            }
                        }
                    }
                    //si aun no se ha llegado a la siguiente posición, continua con el actual movimiento
                    else
                    {
                        obj.transform.position = Vector3.Lerp(obj.transform.position, new Vector3(obj.transform.position.x + part.GetCurrentDirection().x, obj.transform.position.y + part.GetCurrentDirection().y), Time.deltaTime * speed);
                    }
                }

                //cambiamos a la parte siguiente si existe
                obj = part.GetNextPart();
                if (obj)
                {
                    part = obj.GetComponent <SnakePart>();
                }
            }

            text.text = numParts.ToString();
        }
    }