コード例 #1
0
    public void Update()
    {
        checkTime (); // lo primero es mirar si queda tiempo para jugar
        updateText (); // lo segundo actualizar lo que ve el jugador
        switch (st) { // "maquina de estados"
            case StMov.Parado: // esperando una tecla
            if (Game.S.checkMapHole (x,y)) { // si hay un agujero donde estoy
                st = StMov.Caer;
                break;
            } else if (Game.S.checkGoal(x,y) && inBase ()){ // estoy en el objetivo y bien puesto
                st = StMov.Ganar;
                break;
            }
            dir = getDir (); // obtener direccion seleccionada
            if(dir == "none") break; // ninguna direccion
            movs ++; // un movimiento mas en este nivel

            // variables para colocar el pivote
            float sentido = 1.0f; // 1 o -1 para generalizar cuentas
            Vector3 altura = new Vector3(0.0f,0.5f,0.0f); // mitad de altura de la figura
            Vector3 offset = Vector3.zero; // hacia que lado (izq o der) debo mover el pivote
            reference = transform.position * 2; // si mi figura es de dos pisos, hacia donde estan esos dos pisos
            reference.x = reference.x %2;
            reference.y = reference.y %2;
            reference.z = reference.z %2;
            // reference deja un 1.0 en el sentido que esten los dos pisos.
            float tall = transform.localScale.y/2.0f; // mitad de altura (0.5 o 1)

            switch(dir)
            {
            case "S": // como W pero en sentido contrario
                sentido = -1.0f;
                goto case "W";
            case "W":
                offset     = Vector3.forward * sentido; // hacia adelante
                pivotAngle = Vector3.right   * sentido; // angulo a la derecha
                if(isVertical()){ //la base es cuadrada de tamaño 1
                    altura = new Vector3(0.0f,tall,0.0f); // la correccion de la altura es con tall
                }else{ // no estoy en la base... :(
                    if(reference.z>0){ // me muevo a W o S y los dos pisos estan en mi direccion
                        offset *= transform.localScale.y;
                    }
                }
                offset *= 0.5f;
                break;
            case "A": // como D pero en sentido contrario
                sentido = -1.0f;
                goto case "D";
            case "D":
                offset     = Vector3.right   * sentido; // hacia la derecha
                pivotAngle = Vector3.forward * ( -1.0f * sentido ); // hacia delante
                if(isVertical()){ //la base siempre es cuadrada de tamaño 1
                    altura = new Vector3(0.0f,tall,0.0f);
                }else{ // no estoy en la base... :(
                    if(reference.x>0){
                        offset *= transform.localScale.y;
                    }
                }
                offset *= 0.5f;
                break;
            default:
                break;
            }

            int dif = Game.S.difHeight(dir); // calcular la diferencia de altura

            if(dif < 0){ // caida
                muerte = dif < -1; // si hay mas de un piso moriremos
                pivotLimit = 180.0f;
            }else if (dif == 0){ // mismo nivel
                pivotLimit = 90.0f;
            }else if (dif == 1){ //subida
                pivotLimit = 180.0f;
                altura = -altura; // el pivote en lugar de estar en la base inferior estara en la superior
            }else{
                break; // algo fue mal
            }
            pivotPoint = transform.position - altura + offset;  // posicion del pivote
            pivote.position = pivotPoint; // pintado del pivote
            st = StMov.Mov; // siguiente paso moverse
            break;
        case StMov.Mov: // el jugador se esta moviendo
            float amount = Time.deltaTime * speed * 20.0f;
            pivotAmount = pivotAmount + amount;
            amount = amount - (pivotAmount > pivotLimit ? pivotAmount - pivotLimit : 0.0f);
            transform.RotateAround (pivotPoint, pivotAngle, amount); // girar lo que corresponde

            if (pivotAmount >= pivotLimit) { // termine de girar
                RoundRotation(); // redondear mi rotacion
                RoundPosition(); // redondear mi posicion
                acamount= 0.0f;
                st = muerte ? StMov.Caer:StMov.Parado; // si me movia hacia la muerte muere
                pivotAmount = 0;
                actualizaPos (dir); // actualizar posicion logica
            }
            break;
        case StMov.Caer: // tienes que caer.. cae!
            transform.GetComponent<Rigidbody>().useGravity = true;
            transform.GetComponent<Rigidbody>().isKinematic = false;
            acamount += Time.deltaTime * speed * 20.0f; // si caes por desnivel
            if (muerte && acamount > limitAmount) // te dejamos caer un poco
                st = StMov.Morir;
            if (transform.position.y < bottomY) // si caes por agujero.. un poco diferente
                st = StMov.Morir;
            break;
        case StMov.Morir: // tienes que morir.. MUERE!
            morir ();
            break;
        case StMov.Ganar: // no se como pero has ganado ¬¬
            ganar ();
            break;
        default:
            break;
        }
    }
コード例 #2
0
 public void checkTime()
 {
     /*
      * Mirar si queda tiempo para jugar
      */
     time = endTime - Time.time;
     if (time < 0.0f) {
         time = 0.0f;
         st = StMov.Morir;
     }
 }