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; } }
public void checkTime() { /* * Mirar si queda tiempo para jugar */ time = endTime - Time.time; if (time < 0.0f) { time = 0.0f; st = StMov.Morir; } }