Пример #1
0
        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;

            }
        }
Пример #2
0
        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);
        }
Пример #3
0
        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;

        }
Пример #4
0
        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;
        }