public void activar(ref AlumnoEjemplos.MiGrupo.EjemploAlumno.states estado) { //pantalla De Inicio GuiController.Instance.Drawer2D.beginDrawSprite(); sprite.render(); //Finalizar el dibujado de Sprites GuiController.Instance.Drawer2D.endDrawSprite(); //Mostrar Lineas en Menu foreach (TgcText2d linea in menuLineas) { linea.render(); } if (input.keyPressed(Key.BackSpace)) { estado = EjemploAlumno.states.inicio; } }
public void renderizarBarco(AlumnoEjemplos.BarbaAlpha.Barco.Barco barco, float elapsedTime) { barco.actualizarPosicionAnterior(); plano = obtenerPlano(barco); setearVariablesBarcoShader(plano, barco.posicion(), effect); /* * calculos para la aceeracion del barco segun la inclinacion * de la ola. * * sentidoBarco = barco.getSentido(); prodInterno = Vector3.Dot(plano.normal, sentidoBarco); cosAngulo = prodInterno; barco.aumentarAceleracionPorInclinacion(cosAngulo);*/ barco.render(elapsedTime); }
public Plano obtenerPlano (AlumnoEjemplos.BarbaAlpha.Barco.Barco barco) { Vector3 centroBase; Vector3 puntoBase; float radioEnY; float largo; float ancho; Vector3 posicionAncho1; Vector3 posicionAncho2; Vector3 puntoAncho1; Vector3 puntoAncho2; Vector3 posicionLargo1; Vector3 posicionLargo2; Vector3 puntoLargo1; Vector3 puntoLargo2; Vector3 vector1; Vector3 vector2; Vector3 sentidoAux; Vector3 normalNoNormalizada; radioEnY = barco.BoundingBox().calculateAxisRadius().Y; centroBase = barco.posicion() - new Vector3(0, radioEnY, 0); ancho = barco.BoundingBox().calculateAxisRadius().X * 2; largo = barco.BoundingBox().calculateAxisRadius().Z * 2; puntoBase = aplicarTrigonometrica(centroBase, radioEnY, time, frecuenciaOlas, alturaOlas); sentidoAux = barco.getSentido(); //posicionAncho1 = centroBase + new Vector3(ancho / 2, 0, 0); posicionAncho1 = centroBase + Vector3.Multiply(setearOrtogonal(sentidoAux, ortogonal), (ancho / 2)); puntoAncho1 = aplicarTrigonometrica(posicionAncho1, radioEnY, time, frecuenciaOlas, alturaOlas); //posicionAncho2 = centroBase + new Vector3(-ancho / 2, 0, 0); posicionAncho2 = centroBase - Vector3.Multiply(ortogonal, (ancho / 2)); puntoAncho2 = aplicarTrigonometrica(posicionAncho2, radioEnY, time, frecuenciaOlas, alturaOlas); //posicionLargo1 = centroBase + new Vector3(0, 0, largo / 2); posicionLargo1 = centroBase + Vector3.Multiply(sentidoAux, (largo / 2)); puntoLargo1 = aplicarTrigonometrica(posicionLargo1, radioEnY, time, frecuenciaOlas, alturaOlas); //posicionLargo2 = centroBase + new Vector3(0, 0, -largo / 2); posicionLargo2 = centroBase - Vector3.Multiply(sentidoAux, (largo / 2)); puntoLargo2 = aplicarTrigonometrica(posicionLargo2, radioEnY, time, frecuenciaOlas, alturaOlas); vector1 = puntoAncho1 - puntoAncho2; vector2 = puntoLargo1 - puntoLargo2; normalNoNormalizada = Vector3.Cross(vector1, vector2); if (sentidoAux.Z != 0) { normalNoNormalizada.Z *= -FastMath.Sin(sentidoAux.Z); } normalPlano = Vector3.Normalize(normalNoNormalizada); /* * De esta forma se determina el vector normal * calculando el plano tangente a la superficie en un punto * no sirve porque es muy sensible a las variaciones * y se mueve muy espasticamente * * float primaX; float primaZ; radioEnY = barco.BoundingBox().calculateAxisRadius().Y; centroBase = barco.posicion() - new Vector3(0, radioEnY, 0); puntoBase = aplicarTrigonometrica(centroBase, radioEnY,6 time, frecuenciaOlas, alturaOlas); primaX = (FastMath.Cos(time + puntoBase.X) * FastMath.Cos(time + puntoBase.Z) - FastMath.Sin(time + puntoBase.X)); primaZ = (FastMath.Cos(time + puntoBase.Z) - FastMath.Sin(time + puntoBase.X) * FastMath.Sin(time + puntoBase.Z)); normalPlano.X = -primaX; normalPlano.Y = alturaOlas; normalPlano.Z = -primaZ; Vector3.Normalize(normalPlano);*/ planoSubyacente.normal = normalPlano; planoSubyacente.punto = puntoBase; return planoSubyacente; }
public void activar(ref AlumnoEjemplos.MiGrupo.EjemploAlumno.states estado, float elapsedTime) { TgcD3dInput d3dInput = GuiController.Instance.D3dInput; var original_pos = motorcycle.Position; var original_rot = motorcycle.Rotation; float bigElapsed = elapsedTime * 20 + 0.1f; float aceleracion = 0f; float moveForward = 0f; float rotate = 0; bool moving = false; bool rotating = false; float aceleracionVar = (float)GuiController.Instance.Modifiers.getValue("Aceleracion"); float velMax = (float)GuiController.Instance.Modifiers.getValue("VelocidadMax"); float rozamiento = (float)GuiController.Instance.Modifiers.getValue("Rozamiento"); float velocidadRotacion = (float)GuiController.Instance.Modifiers.getValue("VelocidadRotacion"); GuiController.Instance.UserVars.setValue("elapsedTime", TgcParserUtils.printFloat(elapsedTime)); if (d3dInput.keyPressed(Key.B)) { showBB = !showBB; } if (d3dInput.keyPressed(Key.C)) { motorcycle.Position = ultimoCheck + new Vector3(0, 10, 0); characterElipsoid.setCenter(ultimoCheck + new Vector3(0, 10, 0)); tiempoAcelerando = 0f; tiempoDescelerando = 0f; velIni = 0f; motorcycle.Rotation = new Vector3(0, 0, 0); } if (d3dInput.keyPressed(Key.P)) { motorcycle.move(new Vector3(0, 5, 0)); characterElipsoid.moveCenter(new Vector3(0, 5, 0)); tiempoAcelerando = 1f; tiempoDescelerando = 1f; } if (d3dInput.keyUp(Key.W)) { tiempoAcelerando = 0f; } if (d3dInput.keyUp(Key.S)) { tiempoDescelerando = 0f; } //Adelante if (d3dInput.keyDown(Key.W) && collisionManager.isOnTheGround()) { aceleracion = aceleracionVar; moveForward = (-aceleracion * tiempoAcelerando + velIni) * bigElapsed; if (moveForward < -velMax) { moveForward = -velMax; } velIni = moveForward; tiempoAcelerando += elapsedTime; tiempoDescelerando = 0f; } //Atras if (d3dInput.keyDown(Key.S) && collisionManager.isOnTheGround()) { aceleracion = -aceleracionVar; moveForward = (-aceleracion * tiempoDescelerando + velIni) * bigElapsed; if (moveForward > velMax / 2) { moveForward = velMax / 2; } velIni = moveForward; tiempoDescelerando += elapsedTime; tiempoAcelerando = 0f; } if ((!d3dInput.keyDown(Key.S) && !d3dInput.keyDown(Key.W)) || !collisionManager.isOnTheGround()) { aceleracion = 0f; moveForward = velIni; } if (moveForward != 0 && tocandoPiso) { if (moveForward < 0) { moveForward += rozamiento * bigElapsed; } if (moveForward > 0) { moveForward -= rozamiento * bigElapsed; } velIni = moveForward; } if (moveForward >= rozamiento || moveForward <= -rozamiento) { moving = true; } else { moveForward = 0; velIni = moveForward; } GuiController.Instance.UserVars.setValue("moveForward", TgcParserUtils.printFloat(moveForward)); GuiController.Instance.UserVars.setValue("velIni", TgcParserUtils.printFloat(velIni)); GuiController.Instance.UserVars.setValue("aceleracion", TgcParserUtils.printFloat(aceleracion)); GuiController.Instance.UserVars.setValue("tiempoAcel", TgcParserUtils.printFloat(tiempoAcelerando)); GuiController.Instance.UserVars.setValue("tiempoDesce", TgcParserUtils.printFloat(tiempoDescelerando)); //Derecha if (d3dInput.keyDown(Key.D) && !collisionManager.isOnTheGround()) { rotate = -velocidadRotacion; rotating = true; } //Izquierda if (d3dInput.keyDown(Key.A) && !collisionManager.isOnTheGround()) { rotate = velocidadRotacion; rotating = true; } //ROTACION if (rotating) { //Rotar personaje y la camara, hay que multiplicarlo por el tiempo transcurrido para no atarse a la velocidad el hardware float rotAngle = Geometry.DegreeToRadian(rotate * elapsedTime); motorcycle.rotateX(rotAngle); } //Actualizar valores de gravedad collisionManager.GravityEnabled = (bool)GuiController.Instance.Modifiers["HabilitarGravedad"]; collisionManager.GravityForce = (Vector3)GuiController.Instance.Modifiers["Gravedad"] * elapsedTime; GuiController.Instance.UserVars.setValue("GravedadActual", TgcParserUtils.printFloat(collisionManager.GravityForce.Y)); collisionManager.SlideFactor = (float)GuiController.Instance.Modifiers["SlideFactor"]; collisionManager.OnGroundMinDotValue = (float)GuiController.Instance.Modifiers["Pendiente"]; Vector3 realMovement; Vector3 movementVector; if (!collisionManager.isOnTheGround() && !rotating) { if (motorcycle.Rotation.X < -0.1) { motorcycle.rotateX(1f * elapsedTime); } if (motorcycle.Rotation.X > 0.1) { motorcycle.rotateX(-1f * elapsedTime); } } //CALCULO VECTOR MOVIMIENTO movementVector = Vector3.Empty; if (moving && collisionManager.isOnTheGround()) { //Aplicar movimiento, desplazarse en base a la rotacion actual del personaje movementVector = new Vector3( 0, -FastMath.Sin(motorcycle.Rotation.X) * moveForward, FastMath.Cos(motorcycle.Rotation.X) * moveForward ); } if (moving && !collisionManager.isOnTheGround()) { //Aplicar movimiento, desplazarse en base a la rotacion actual del personaje movementVector = ultimoMov; } realMovement = movementVector; if (moving && collisionManager.isOnTheGround()) { var asd = anguloEntreVectores(ultimaNormal, new Vector3(0, 1, 0)); if (anguloEntreVectores(ultimaNormal, new Vector3(0, 0, 1)) > 1.5708f) { asd = -asd; } motorcycle.Rotation = new Vector3(asd, 0, 0); } // if (!terminoDeSaltar) // { // if(framesParaSaltar == 0) // { // terminoDeSaltar = true; // framesParaSaltar = 51; //} // framesParaSaltar--; //} //MOVIMIENTO EN SI guarda en realMovement el movimiento que no colisiona if ((bool)GuiController.Instance.Modifiers["Collisions"])// && terminoDeSaltar) { realMovement = collisionManager.moveCharacter(characterElipsoid, movementVector, objetosColisionables); motorcycle.move(realMovement); ultimoMov = realMovement; //Cargar desplazamiento realizar en UserVar GuiController.Instance.UserVars.setValue("Movement", TgcParserUtils.printVector3(realMovement)); GuiController.Instance.UserVars.setValue("Rotation", TgcParserUtils.printVector3(motorcycle.Rotation)); } else { // if (!terminoDeSaltar) // { // movementVector += (Vector3)GuiController.Instance.Modifiers.getValue("Gravedad"); // } motorcycle.move(movementVector); ultimoMov = movementVector; } //guardo el checkpoint if (pasoPorAlgunCheck()) { ultimoCheck = motorcycle.Position; } /*if((d3dInput.keyDown(Key.W) || d3dInput.keyDown(Key.S)) && realMovement == new Vector3(0, 0, 0)) { if(trabada == 150) { motorcycle.move(new Vector3(0, 1, 0)); characterElipsoid.moveCenter(new Vector3(0, 1, 0)); trabada = 0; } trabada++; }*/ GuiController.Instance.UserVars.setValue("AnguloY", TgcParserUtils.printFloat(anguloEntreVectores(collisionManager.Result.collisionNormal, new Vector3(0, 1, 0)))); GuiController.Instance.UserVars.setValue("AnguloZ", TgcParserUtils.printFloat(anguloEntreVectores(collisionManager.Result.collisionNormal, new Vector3(0, 0, 1)))); //actualizo la camara GuiController.Instance.ThirdPersonCamera.Target = motorcycle.Position + new Vector3(0,0,-100); //DEBUG //Actualizar valores de la linea de movimiento directionArrow.PStart = characterElipsoid.Center; directionArrow.PEnd = characterElipsoid.Center + Vector3.Multiply(movementVector, 50); directionArrow.updateValues(); //Actualizar valores de normal de colision if (collisionManager.Result.collisionFound) { collisionNormalArrow.PStart = collisionManager.Result.collisionPoint; collisionNormalArrow.PEnd = collisionManager.Result.collisionPoint + Vector3.Multiply(collisionManager.Result.collisionNormal, 80); ; collisionNormalArrow.updateValues(); collisionPoint.Position = collisionManager.Result.collisionPoint; tocandoPiso = true; } else { tocandoPiso = false; // tiempoAcelerando = 0f; // tiempoDescelerando = 0f; } if (collisionManager.isOnTheGround()) { saltando = false; } else { saltando = true; } if (TgcCollisionUtils.testAABBAABB(motorcycle.BoundingBox, lineaFin.BoundingBox)) { terminoJuego = true; objetosColisionables.Clear(); } if (terminoJuego) { GuiController.Instance.ThirdPersonCamera.Target = lineaFin.Position; if(mejor_tiempo == 0) { mejor_tiempo = tiempoTranscurrido; } mejor_tiempo = Math.Min(mejor_tiempo, tiempoTranscurrido); motorcycle.move(0, 100, -150); } ultimaNormal = collisionManager.Result.collisionNormal; //TERMINA DEBUG // if (anguloEntreVectores(original_rot, motorcycle.Rotation) > 0.45f || anguloEntreVectores(original_rot, motorcycle.Rotation) < -0.45f) // { // tocandoPiso = false; // motorcycle.Rotation = original_rot; // motorcycle.Position = original_pos; // terminoDeSaltar = false; // } //Renders if (!terminoJuego) { tiempoTranscurrido += elapsedTime; } textoContadorTiempo.Text = "Tiempo: " + FormatearTiempo(tiempoTranscurrido); textoMejorTiempo.Text = "Record: " + FormatearTiempo(mejor_tiempo); ojalaQueAnde.activar(elapsedTime,textGanaste,textGanaste2,textoContadorTiempo,textoMejorTiempo,piramid,skyBox,terminoJuego,timer,textFPS); // motorcycle.render(); // scene.renderAll(); if (showBB) { collisionNormalArrow.render(); collisionPoint.render(); directionArrow.render(); characterElipsoid.render(); foreach (TgcBoundingBox bb in checkpoints) { bb.render(); } } motoSprite.Position = motoSprite.Position + new Vector2(-(motorcycle.Position.Z - zAnterior)*textureSize.Width*0.7f/13200, 0); //Iniciar dibujado de todos los Sprites de la escena (en este caso es solo uno) GuiController.Instance.Drawer2D.beginDrawSprite(); //Dibujar sprite (si hubiese mas, deberian ir todos aquí) mapita.render(); motoSprite.render(); //Finalizar el dibujado de Sprites GuiController.Instance.Drawer2D.endDrawSprite(); zAnterior = motorcycle.Position.Z; }