public static Vector3[] computeCorners(Auto auto) { TgcObb obbAuto = auto.obb; Vector3[] corners = new Vector3[8]; Vector3 extents; Vector3[] orientation = obbAuto.Orientation; Vector3 center = obbAuto.Center; extents = auto.mesh.BoundingBox.calculateAxisRadius(); extents = TgcVectorUtils.abs(extents); Vector3 eX = extents.X * orientation[0]; Vector3 eY = extents.Y * orientation[1]; Vector3 eZ = extents.Z * orientation[2]; corners[0] = center - eX - eY - eZ; corners[1] = center - eX - eY + eZ; corners[2] = center - eX + eY - eZ; corners[3] = center - eX + eY + eZ; corners[4] = center + eX - eY - eZ; corners[5] = center + eX - eY + eZ; corners[6] = center + eX + eY - eZ; corners[7] = center + eX + eY + eZ; return corners; }
public override void init() { instance = this; pantallas.Add(new PantallaInicio()); pantallas.Add(new PantallaFinalizacion(0)); pantallas.Add(new PantallaFinalizacion(1)); pantalla = pantallas[0]; //Aumentamos el alcance del Frustum setDistanciaFrustum(200000f); //Paths de meshes de distintos vehículos string pathAutoMario = GuiController.Instance.AlumnoEjemplosMediaDir + "LosBorbotones\\Autos\\autoMario\\autoMario-TgcScene.xml"; string pathAutoLuigi = GuiController.Instance.AlumnoEjemplosMediaDir + "LosBorbotones\\Autos\\autoLuigi\\autoLuigi-TgcScene.xml"; // Creo los vehículos Auto autoMario = new Auto(pathAutoMario, "Mario", new Vector3(0, 0, 0), 2000, 90, 400, 47, new Vector3(2.4f, 2.4f, 2.4f), new Vector3(0,0,0)); Auto autoLuigi = new Auto(pathAutoLuigi, "Luigi", new Vector3(0, 0, 0), 3000, 80, 500, 40, new Vector3(3f, 3f, 3f), new Vector3(0, 0, 0)); this.autos.Add(autoMario); this.autos.Add(autoLuigi); TgcSceneLoader loader = new TgcSceneLoader(); //Crea los arboles string pathArbol = GuiController.Instance.AlumnoEjemplosMediaDir + "\\LosBorbotones\\ambientacion\\arbol\\arbol-TgcScene.xml"; ; int cantidadDeArboles = 8; for (int i = 0; i < cantidadDeArboles;i++ ) this.arboles.Add(loader.loadSceneFromFile(pathArbol)); //Crea el circuito this.niveles.Add( new Nivel(1) ); this.niveles.Add(new Nivel(2)); /// EFECTO BLUR /// Device d3dDevice = GuiController.Instance.D3dDevice; //Activamos el renderizado customizado. De esta forma el framework nos delega control total sobre como dibujar en pantalla //La responsabilidad cae toda de nuestro lado GuiController.Instance.CustomRenderEnabled = true; //Se crean 2 triangulos (o Quad) con las dimensiones de la pantalla con sus posiciones ya transformadas // x = -1 es el extremo izquiedo de la pantalla, x = 1 es el extremo derecho // Lo mismo para la Y con arriba y abajo // la Z en 1 simpre CustomVertex.PositionTextured[] screenQuadVertices = new CustomVertex.PositionTextured[] { new CustomVertex.PositionTextured( -1, 1, 1, 0,0), new CustomVertex.PositionTextured(1, 1, 1, 1,0), new CustomVertex.PositionTextured(-1, -1, 1, 0,1), new CustomVertex.PositionTextured(1,-1, 1, 1,1) }; //vertex buffer de los triangulos screenQuadVB = new VertexBuffer(typeof(CustomVertex.PositionTextured), 4, d3dDevice, Usage.Dynamic | Usage.WriteOnly, CustomVertex.PositionTextured.Format, Pool.Default); screenQuadVB.SetData(screenQuadVertices, 0, LockFlags.None); //Creamos un Render Targer sobre el cual se va a dibujar la pantalla renderTarget2D = new Texture(d3dDevice, d3dDevice.PresentationParameters.BackBufferWidth , d3dDevice.PresentationParameters.BackBufferHeight, 1, Usage.RenderTarget, Format.X8R8G8B8, Pool.Default); //Cargar shader con efectos de Post-Procesado string compilationErrors; effect = Effect.FromFile(GuiController.Instance.D3dDevice, GuiController.Instance.ExamplesMediaDir + "Shaders\\PostProcess.fx", null, null, ShaderFlags.None, null, out compilationErrors); if (effect == null) { throw new Exception("Error al cargar shader. Errores: " + compilationErrors); } //Configurar Technique dentro del shader effect.Technique = "BlurTechnique"; /// FIN EFECTO BLUR /// //MODIFIERS GuiController.Instance.Modifiers.addVertex2f("AlturaCamara", new Vector2(50, 200), new Vector2(800, 2000), new Vector2(200, 600)); GuiController.Instance.Modifiers.addVertex2f("PosicionFlechaDebug", new Vector2(-5000, -5000), new Vector2(5000, 5000), new Vector2(0, 0)); }
public PantallaJuego(Auto autito) { /*En PantallaInicio le paso a Pantalla juego con qué auto jugar. Acá lo asigno a la pantalla, cargo el coso que capta el teclado, creo el Nivel1 y lo pongo en la lista de renderizables, para que sepa con qué escenario cargarse */ this.auto = autito; auto.mesh.move(new Vector3(0, 0, -3100)); auto.mesh.rotateY(-1.57f); this.entrada = GuiController.Instance.D3dInput; this.nivel = EjemploAlumno.getInstance().getNiveles(0); //Barrita de vida vida = new Imagen(GuiController.Instance.AlumnoEjemplosMediaDir + "LosBorbotones\\vidaPersonaje\\vida.jpg"); barra = new Imagen(GuiController.Instance.AlumnoEjemplosMediaDir + "LosBorbotones\\vidaPersonaje\\fondobarra.png"); barra2 = new Imagen(GuiController.Instance.AlumnoEjemplosMediaDir + "LosBorbotones\\vidaPersonaje\\fondobarra2.png"); vida.setEscala(escalaInicial); barra.setEscala(new Vector2(6.81f, 1f)); barra2.setEscala(new Vector2(6.81f, 1f)); Vector2 posicionbarra = new Vector2(10, 5); vida.setPosicion(new Vector2(155f, 9.3f)); //CUENTA REGRESIVA uno = new Imagen(GuiController.Instance.AlumnoEjemplosMediaDir + "LosBorbotones\\cuentaRegresiva\\1.png"); uno.setCentrarYEscalar(); dos = new Imagen(GuiController.Instance.AlumnoEjemplosMediaDir + "LosBorbotones\\cuentaRegresiva\\2.png"); dos.setCentrarYEscalar(); tres = new Imagen(GuiController.Instance.AlumnoEjemplosMediaDir + "LosBorbotones\\cuentaRegresiva\\3.png"); tres.setCentrarYEscalar(); //Instrucción de misión del juego misionMario = new Imagen(GuiController.Instance.AlumnoEjemplosMediaDir + "LosBorbotones\\Mision\\m_mario.png"); misionMario.setCentrarYEscalar(); misionLuigi = new Imagen(GuiController.Instance.AlumnoEjemplosMediaDir + "LosBorbotones\\Mision\\m_luigi.png"); misionLuigi.setCentrarYEscalar(); // CAMARA TERCERA PERSONA GuiController.Instance.ThirdPersonCamera.Enable = true; GuiController.Instance.ThirdPersonCamera.resetValues(); Vector2 vectorCam = (Vector2)GuiController.Instance.Modifiers["AlturaCamara"]; GuiController.Instance.ThirdPersonCamera.setCamera(auto.mesh.Position, vectorCam.X, vectorCam.Y); GuiController.Instance.ThirdPersonCamera.rotateY(auto.mesh.Rotation.Y); //CARGAR MÚSICA. Musica track = new Musica("ramones.mp3"); this.musica = track; musica.playMusica(); musica.setVolume(35); Shared.debugMode = false; //Puntos de juego puntos = new TgcText2d(); puntos.Text = "0"; puntos.Color = Color.DarkRed; puntos.Align = TgcText2d.TextAlign.RIGHT; puntos.Position = new Point(30, 30); puntos.Size = new Size(100, 50); puntos.changeFont(new System.Drawing.Font("TimesNewRoman", 25, FontStyle.Bold)); //Reloxxxx this.horaInicio = DateTime.Now; this.tiempoRestante = new TgcText2d(); this.tiempoRestante.Text = "65"; this.tiempoRestante.Color = Color.Green; this.tiempoRestante.Align = TgcText2d.TextAlign.RIGHT; this.tiempoRestante.Position = new Point(300, 30); this.tiempoRestante.Size = new Size(100, 50); this.tiempoRestante.changeFont(new System.Drawing.Font("TimesNewRoman", 25, FontStyle.Bold)); this.comienzoNivel = true; //FLECHA NORMAL colision collisionNormalArrow = new TgcArrow(); collisionNormalArrow.BodyColor = Color.Blue; collisionNormalArrow.HeadColor = Color.Yellow; collisionNormalArrow.Thickness = 1.4f; collisionNormalArrow.HeadSize = new Vector2(10, 20); //FLECHA debug (la usamos para conocer posiciones donde querramos posicionar meshes) debugArrow = new TgcArrow(); debugArrow.BodyColor = Color.Purple; debugArrow.HeadColor = Color.Yellow; debugArrow.Thickness = 3f; debugArrow.HeadSize = new Vector2(10, 20); debugArrow.PStart = new Vector3(0, 400f, 0); debugArrow.PEnd = new Vector3(0, 10f, 0); debugArrow.updateValues(); //USER VARS GuiController.Instance.UserVars.addVar("DistMinima"); GuiController.Instance.UserVars.addVar("Velocidad"); GuiController.Instance.UserVars.addVar("Vida"); GuiController.Instance.UserVars.addVar("AngCol"); GuiController.Instance.UserVars.addVar("AngRot"); GuiController.Instance.UserVars.addVar("NormalObstaculoX"); GuiController.Instance.UserVars.addVar("NormalObstaculoZ"); }
public void modificarVelocidadRotacion(Auto auto) { if (FastMath.Abs(auto.velocidadActual) > auto.velocidadActual / 3) { if (FastMath.Abs(auto.velocidadActual) > auto.velocidadActual / 2) { if (FastMath.Abs(auto.velocidadActual) > auto.velocidadActual / 1.2f) auto.velocidadRotacion = auto.velocidadRotacionOriginal * 1.7f; else auto.velocidadRotacion = auto.velocidadRotacionOriginal * 1.4f; } else auto.velocidadRotacion = auto.velocidadRotacionOriginal * 1.2f; } else { auto.velocidadRotacion = auto.velocidadRotacionOriginal; } }
public void ajustarCamaraSegunColision(Auto auto, List<ObstaculoRigido> obstaculos) { TgcThirdPersonCamera camera = GuiController.Instance.ThirdPersonCamera; Vector3 segmentA; Vector3 segmentB; camera.generateViewMatrix(out segmentA, out segmentB); //Detectar colisiones entre el segmento de recta camara-personaje y todos los objetos del escenario Vector3 q; float minDistSq = FastMath.Pow2(camera.OffsetForward); foreach (ObstaculoRigido obstaculo in obstaculos) { //Hay colision del segmento camara-personaje y el objeto if (TgcCollisionUtils.intersectSegmentAABB(segmentB, segmentA, obstaculo.mesh.BoundingBox, out q)) { //Si hay colision, guardar la que tenga menor distancia float distSq = (Vector3.Subtract(q, segmentB)).LengthSq(); if (distSq < minDistSq) { minDistSq = distSq; //Le restamos un poco para que no se acerque tanto minDistSq /= 2; } } } //Acercar la camara hasta la minima distancia de colision encontrada (pero ponemos un umbral maximo de cercania) float newOffsetForward = FastMath.Sqrt(minDistSq); camera.OffsetForward = newOffsetForward; }
public void comenzar(Auto autoElegido) { /*Se llama al método de la clase EjemploAlumno que carga las pantalla. Si quiero empezar, elijo una pantalla de juego y le digo con qué autito cargarse*/ EjemploAlumno.getInstance().setPantalla(new PantallaJuego(autoElegido)); }