Beispiel #1
0
        /// <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();
        }