예제 #1
0
        /// <summary>
        ///     Se llama en cada frame.
        ///     Se debe escribir toda la lógica de computo del modelo, así como también verificar entradas del usuario y reacciones
        ///     ante ellas.
        /// </summary>
        public override void Update()
        {
            PreUpdate();
            if (disposing)
            {
                PostUpdate();
                return;
            }
            time += ElapsedTime;
            effect.SetValue("health", Player.Health());

            Hud.Update(Input);
            estaEnAlgunMenu = Hud.GetCurrentStatus() == Hud.Status.MainMenu || Hud.GetCurrentStatus() == Hud.Status.Instructions;

            //Que no se pueda hacer nada si estas en game over salvo dar enter
            if (Hud.GetCurrentStatus() == Hud.Status.GameOver || Hud.GetCurrentStatus() == Hud.Status.Win)
            {
                // si gano hay que hacer update del tiburon para verlo desaparecer
                if (Hud.GetCurrentStatus() == Hud.Status.Win)
                {
                    shark.Update(ElapsedTime);
                }
                PostUpdate();
                return;
            }
            if ((estadoAnterior == Hud.Status.MainMenu || estadoAnterior == Hud.Status.Instructions) && !estaEnAlgunMenu)
            {
                // me meto en la nave cuando paso del menu
                estaEnNave = true;
                Player.Update(ElapsedTime, ref estaEnNave, true);
            }
            estadoAnterior = Hud.GetCurrentStatus();
            if (estaEnAlgunMenu && !disposing)
            {
                sonidoUnderwater.play(true);
                // update de elementos de agua
                nave.Update();
                Oceano.Update(time);
                oceano.Update();
                Particulas.Update(time);
                foreach (var pez in peces)
                {
                    pez.Update(ElapsedTime);
                }
                foreach (var coral in corales)
                {
                    coral.Update(ElapsedTime);
                }
                foreach (var metal in metales)
                {
                    metal.Update(ElapsedTime);
                }
                foreach (var piedra in piedras)
                {
                    piedra.Update(ElapsedTime);
                }

                fog.updateValues();
                effect.SetValue("ColorFog", fog.Color.ToArgb());
                effect.SetValue("CameraPos", TGCVector3.TGCVector3ToFloat4Array(Camera.Position));
                effect.SetValue("StartFogDistance", fog.StartDistance);
                effect.SetValue("EndFogDistance", fog.EndDistance);
                effect.SetValue("Density", fog.Density);
                effect.SetValue("eyePos", TGCVector3.TGCVector3ToFloat3Array(Camera.Position));
            }
            if (!estaEnAlgunMenu)
            {
                arma.Update();
                if (estaEnNave)
                {
                    interiorNave.Update();
                    sharkSound.stop();
                    sonidoUnderwater.stop();
                    efectoInterior.SetValue("eyePos", TGCVector3.TGCVector3ToFloat3Array(Camera.Position));
                }
                else
                {
                    sonidoUnderwater.play(true);
                    // update de elementos de agua
                    nave.Update();
                    Oceano.Update(time);
                    oceano.Update();
                    Particulas.Update(time);

                    DateTime actualTimestamp = DateTime.Now;
                    // Mostrar Tiburon cada X cantidad de tiempo
                    if (actualTimestamp.Subtract(timestamp).TotalSeconds > 15)
                    {
                        shark.Spawn();
                        timestamp = actualTimestamp;
                    }
                    shark.Update(ElapsedTime);

                    foreach (var pez in peces)
                    {
                        pez.Update(ElapsedTime);
                    }
                    foreach (var coral in corales)
                    {
                        coral.Update(ElapsedTime);
                    }
                    foreach (var metal in metales)
                    {
                        metal.Update(ElapsedTime);
                    }
                    foreach (var piedra in piedras)
                    {
                        piedra.Update(ElapsedTime);
                    }

                    fog.updateValues();
                    effect.SetValue("ColorFog", fog.Color.ToArgb());
                    effect.SetValue("CameraPos", TGCVector3.TGCVector3ToFloat4Array(Camera.Position));
                    effect.SetValue("StartFogDistance", fog.StartDistance);
                    effect.SetValue("EndFogDistance", fog.EndDistance);
                    effect.SetValue("Density", fog.Density);
                    effect.SetValue("eyePos", TGCVector3.TGCVector3ToFloat3Array(Camera.Position));
                }

                //Camara y jugador
                FPSCamara.Update(ElapsedTime);

                Player.Update(ElapsedTime, ref estaEnNave);
            }

            // esto se hace siempre
            //Lockear mouse
            Cursor.Position = mousePosition;
            PostUpdate();
        }
예제 #2
0
        public override void Render()
        {
            ClearTextures();
            D3DDevice.Instance.Device.BeginScene();
            D3DDevice.Instance.Device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, Color.Black, 1.0f, 0);

            //Cargar valores de niebla
            var fogShader = fogShaderModifier.Value;

            fog.Enabled       = !fogShaderModifier.Value;
            fog.StartDistance = startDistanceModifier.Value;
            fog.EndDistance   = endDistanceModifier.Value;
            fog.Density       = densityModifier.Value;
            fog.Color         = colorModifier.Value;

            if (fog.Enabled)
            {
                fog.updateValues();
            }

            if (fogShader)
            {
                // Cargamos las variables de shader, color del fog.
                effect.SetValue("ColorFog", fog.Color.ToArgb());
                effect.SetValue("CameraPos", TGCVector3.Vector3ToFloat4Array(Camara.Position));
                effect.SetValue("StartFogDistance", fog.StartDistance);
                effect.SetValue("EndFogDistance", fog.EndDistance);
                effect.SetValue("Density", fog.Density);
            }

            //Actualizar valores
            foreach (var mesh in skyBox.Faces)
            {
                if (fogShader)
                {
                    mesh.Effect    = effect;
                    mesh.Technique = "RenderScene";
                }
                else
                {
                    mesh.Effect    = TgcShaders.Instance.TgcMeshShader;
                    mesh.Technique = "DIFFUSE_MAP";
                }

                mesh.Render();
            }

            //skyBox.render();

            foreach (var mesh in scene.Meshes)
            {
                if (fogShader)
                {
                    mesh.Effect    = effect;
                    mesh.Technique = "RenderScene";
                }
                else
                {
                    mesh.Effect    = TgcShaders.Instance.TgcMeshShader;
                    mesh.Technique = "DIFFUSE_MAP";
                }
                mesh.UpdateMeshTransform();
                mesh.Render();
            }

            RenderAxis();
            RenderFPS();
            D3DDevice.Instance.Device.EndScene();
            D3DDevice.Instance.Device.Present();
        }