/// <summary> /// Método que se llama cada vez que hay que refrescar la pantalla. /// Escribir aquí todo el código referido al renderizado. /// Borrar todo lo que no haga falta /// </summary> public override void Render() { ClearTextures(); //Device de DirectX para renderizar var d3dDevice = D3DDevice.Instance.Device; //Reproduccion de sonidos ReproducirMusica(); //Actualizamos el dia dia.Actualizar(this, ElapsedTime); //Surface pSurf = null; if (dia.GetLluvia().EstaLloviendo()) { pOldRT = d3dDevice.GetRenderTarget(0); pOldStencil = d3dDevice.DepthStencilSurface; pSurf = renderTarget2D.GetSurfaceLevel(0); d3dDevice.SetRenderTarget(0, pSurf); d3dDevice.DepthStencilSurface = pOldStencil; } d3dDevice.Clear(ClearFlags.Target | ClearFlags.ZBuffer, Color.Black, 1.0f, 0); d3dDevice.BeginScene(); //TgcD3dInput d3dInput = GuiController.Instance.D3dInput; tiempo += ElapsedTime; informativo.Text = "Obtener Ayuda (F1)"; mostrarMenuMochila = false; mostrarMenuCajon = false; mostrarAyuda = false; foreach (var comando in controladorEntradas.ProcesarEntradasTeclado()) { comando.Ejecutar(this, ElapsedTime); } camara.Render(personaje, this); optimizador.Actualizar(personaje.mesh.Position, this); //Afectamos salud por paso de tiempo y por la temperatura personaje.AfectarSaludPorTiempo(ElapsedTime); personaje.AfectarSaludPorTemperatura(dia.TemperaturaActual(), ElapsedTime); //Actualizamos los objetos Fisicos y los renderizamos if (movimiento != null) { movimiento.update(ElapsedTime, terreno); movimiento.render(); if (movimiento.Finalizo) { movimiento = null; } } else { puebaFisica.renderizar(this); } if (movimientoPersonaje != null) { movimientoPersonaje.update(ElapsedTime, terreno); movimientoPersonaje.render(); if (movimientoPersonaje.Finalizo) { movimientoPersonaje = null; } } //Render Terreno terreno.Renderizar(this); //Render piso pisoEfecto.Actualizar(this); piso.render(); //Renderizar SkyBox foreach (var faces in skyBox.Faces) { skyboxEfecto.Actualizar(this); faces.render(); } //Actualiza los elementos var aux = new List <Elemento>(); aux.AddRange(elementos); //TODO. Porque sino con la actualizacion borramos o agregamos elementos de la coleccion y se rompe todo foreach (var elemento in aux) { elemento.Actualizar(this, ElapsedTime); } foreach (var elem in optimizador.ElementosRenderizacion) { elem.renderizar(this); } //dia.GetSol().Mesh.render(); d3dDevice.EndScene(); if (dia.GetLluvia().EstaLloviendo()) { //Liberar memoria de surface de Render Target pSurf.Dispose(); //Ahora volvemos a restaurar el Render Target original (osea dibujar a la pantalla) d3dDevice.SetRenderTarget(0, pOldRT); d3dDevice.DepthStencilSurface = pOldStencil; //Arrancamos la escena d3dDevice.BeginScene(); //Cargamos para renderizar el unico modelo que tenemos, un Quad que ocupa toda la pantalla, con la textura de todo lo dibujado antes d3dDevice.VertexFormat = CustomVertex.PositionTextured.Format; d3dDevice.SetStreamSource(0, screenQuadVB, 0); //Cargamos parametros en el shader de Post-Procesado efectoLluvia.SetValue("render_target2D", renderTarget2D); efectoLluvia.SetValue("intensidad_ancho", dia.GetLluvia().AnchoLluvia()); efectoLluvia.SetValue("intensidad_alto", dia.GetLluvia().AltoLluvia()); efectoLluvia.SetValue("lightIntensityRelitive", dia.GetSol().IntensidadRelativa()); //Limiamos la pantalla y ejecutamos el render del shader d3dDevice.Clear(ClearFlags.Target | ClearFlags.ZBuffer, Color.Black, 1.0f, 0); efectoLluvia.Begin(FX.None); efectoLluvia.BeginPass(0); d3dDevice.DrawPrimitives(PrimitiveType.TriangleStrip, 0, 2); efectoLluvia.EndPass(); efectoLluvia.End(); //Terminamos el renderizado de la escena d3dDevice.EndScene(); } d3dDevice.BeginScene(); //Personaje muerto if (personaje.estaMuerto()) { estadoJuego.Color = Color.Red; estadoJuego.Text = "Game Over"; estadoJuego.render(); } else if (tiempo > tiempoObjetivo) { estadoJuego.Color = Color.Green; estadoJuego.Text = "Has Ganado"; estadoJuego.render(); } if (informativo.Text != "") { informativo.render(); } Drawer2D.BeginDrawSprite(); Drawer2D.DrawSprite(saludIcono); Drawer2D.DrawSprite(hidratacionIcono); Drawer2D.DrawSprite(alimentacionIcono); Drawer2D.DrawSprite(cansancioIcono); salud.Scaling = new Vector2(personaje.PorcentajeDeSalud() * 0.5f, 0.3f); Drawer2D.DrawSprite(salud); hidratacion.Scaling = new Vector2(personaje.PorcentajeDeHidratacion() * 0.5f, 0.3f); Drawer2D.DrawSprite(hidratacion); alimentacion.Scaling = new Vector2(personaje.PorcentajeDeAlimentacion() * 0.5f, 0.3f); Drawer2D.DrawSprite(alimentacion); cansancio.Scaling = new Vector2(personaje.PorcentajeDeCansancio() * 0.5f, 0.3f); Drawer2D.DrawSprite(cansancio); Drawer2D.DrawSprite(objetivosIcono); Drawer2D.DrawSprite(miniMapa); Drawer2D.EndDrawSprite(); referenciaMiniMapa.Position = PosicionarReferencia(personaje.mesh.Position); referenciaMiniMapa.Color = Color.Orange; referenciaMiniMapa.render(); referenciaMiniMapa.Position = PosicionarReferencia(fuenteAgua.posicion()); referenciaMiniMapa.Color = Color.Blue; referenciaMiniMapa.render(); referenciaMiniMapa.Position = PosicionarReferencia(cajonReal.posicion()); referenciaMiniMapa.Color = Color.Brown; referenciaMiniMapa.render(); referenciaMiniMapa.Position = PosicionarReferencia(cajonOlla.posicion()); referenciaMiniMapa.Color = Color.Brown; referenciaMiniMapa.render(); mensajeObjetivo1.Text = "Sobrevivir " + Environment.NewLine + TimeSpan.FromSeconds(tiempoObjetivo - tiempo).ToString(@"hh\:mm\:ss"); mensajeObjetivo1.render(); Drawer2D.BeginDrawSprite(); linea.Rotation = personaje.mesh.Rotation.Y; Drawer2D.DrawSprite(linea); horaDia.Text = dia.HoraActualTexto(); temperaturaDia.Text = dia.TemperaturaActualTexto(); temperaturaPersonaje.Text = personaje.TemperaturaCorporalTexto(); horaDia.render(); temperaturaDia.render(); Drawer2D.DrawSprite(temperaturaPersonajeIcono); temperaturaPersonaje.render(); Drawer2D.DrawSprite(temperaturaDiaIcono); Drawer2D.DrawSprite(horaDiaIcono); if (dia.GetLluvia().EstaLloviendo()) { Drawer2D.DrawSprite(estadoDiaLluviaIcono); } else { if (dia.EsDeDia()) { Drawer2D.DrawSprite(estadoDiaSolIcono); } else { Drawer2D.DrawSprite(estadoDiaLunaIcono); } } Drawer2D.EndDrawSprite(); if (mostrarMenuMochila) { //Iniciar dibujado de todos los Sprites de la escena (en este caso es solo uno) Drawer2D.BeginDrawSprite(); //Dibujar sprite (si hubiese mas, deberian ir todos aquí) Drawer2D.DrawSprite(mochila); if (mostrarMenuCajon) { //El cajon se muestra siempre junto con la mochila Drawer2D.DrawSprite(cajon); } //Finalizar el dibujado de Sprites Drawer2D.EndDrawSprite(); //TODO. Por el momento podemos mantener todo en un renglon ya que no imprimimos ninguna imagen de los elementos en cuestion mochilaReglon1.Text = ""; for (var i = 0; i < 9; i++) { if (personaje.ContieneElementoEnPosicionDeMochila(i)) { mochilaReglon1.Text = mochilaReglon1.Text + (i + 1) + " " + personaje.DarElementoEnPosicionDeMochila(i).GetDescripcion() + Environment.NewLine; } else { mochilaReglon1.Text = mochilaReglon1.Text + (i + 1) + " " + "Disponible" + Environment.NewLine; } } mochilaReglon1.render(); if (mostrarMenuCajon) { //En texto que va en el renglon lo completa el cajon cuando hay una interaccion. cajonReglon1.render(); } } if (mostrarAyuda) { //TODO poner todos los Sprite dentro de una sola apertura y cierre del controlador Drawer2D.BeginDrawSprite(); Drawer2D.DrawSprite(ayuda); Drawer2D.EndDrawSprite(); ayudaReglon1.Position = new Point((int)ayuda.Position.X + 40, (int)ayuda.Position.Y + 130); ayudaReglon1.render(); ayudaReglon2.render(); } RenderFPS(); EndRenderScene(); }