Esempio n. 1
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();
        }
    }