/// <summary> /// Se llama cuando termina la ejecución del ejemplo. /// Hacer Dispose() de todos los objetos creados. /// Es muy importante liberar los recursos, sobretodo los gráficos ya que quedan bloqueados en el device de video. /// </summary> public override void Dispose() { disposing = true; shark.Dispose(); efectoDesaparecer.Dispose(); sonidoUnderwater.dispose(); Player.Dispose(); oceano.Dispose(); heightmap.Dispose(); foreach (var pez in peces) { pez.Dispose(); } foreach (var coral in corales) { coral.Dispose(); } foreach (var metal in metales) { metal.Dispose(); } foreach (var piedra in piedras) { piedra.Dispose(); } nave.Dispose(); interiorNave.Dispose(); mesaNave.Dispose(); sogaInterior.Dispose(); lamparaNave.Dispose(); sillaInterior.Dispose(); timonInterior.Dispose(); Particulas.Dispose(); Oceano.Dispose(); Hud.Dispose(); maskTexture.dispose(); perlinTexture.dispose(); arma.Dispose(); effect.Dispose(); renderTarget.Dispose(); fullScreenQuad.Dispose(); depthStencil.Dispose(); coralesBrillantes.Dispose(); FBVerticalBloom.Dispose(); FBHorizontalBool.Dispose(); }
//Gameplay functions private void GameplayUpdate(float ElapsedTime) { if (!godmode) { if (IsOutsideWater()) { RecoverOxygen(ElapsedTime); } else { LoseOxygen(ElapsedTime); } } if (IsDead()) { gameOver.play(false); Hud.ChangeStatus(Hud.Status.GameOver); } }
/// <summary> /// 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() { if (disposing) { return; } //ClearTextures(); var device = D3DDevice.Instance.Device; // Capturamos las texturas de pantalla Surface screenRenderTarget = device.GetRenderTarget(0); Surface screenDepthSurface = device.DepthStencilSurface; // Especificamos que vamos a dibujar en una textura device.SetRenderTarget(0, renderTarget.GetSurfaceLevel(0)); device.DepthStencilSurface = depthStencil; // Captura de escena en render target device.BeginScene(); device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, Color.Black, 1.0f, 0); bool flagFuera = true; if (estaEnAlgunMenu) { oceano.Render(); heightmap.Render(); foreach (var pez in peces) { if (IsInFrustum(pez.GetMesh())) { pez.Technique("RenderScene"); pez.Render(); } } if (IsInFrustum(shark.GetMesh())) { shark.Technique("RenderScene"); shark.Render(); } foreach (var coral in corales) { if (IsInFrustum(coral.GetMesh())) { coral.Technique("RenderScene"); coral.Render(); } } Particulas.Render(ElapsedTime); foreach (var piedra in piedras) { if (IsInFrustum(piedra.GetMesh())) { piedra.Render(); } } //Efecto metalico effect.SetValue("shininess", 30f); effect.SetValue("KSpecular", 1.0f); effect.SetValue("KAmbient", 1.0f); effect.SetValue("KDiffuse", 0.5f); if (IsInFrustum(nave.obtenerMeshes())) { nave.Technique("RenderSceneLight"); nave.Render(); } effect.SetValue("shininess", 10f); effect.SetValue("KSpecular", 1.1f); effect.SetValue("KAmbient", 1.2f); effect.SetValue("KDiffuse", 0.25f); foreach (var metal in metales) { if (IsInFrustum(metal.GetMesh())) { metal.Technique("RenderSceneLight"); metal.Render(); } } Oceano.Render(); Player.Render(); } if (!estaEnAlgunMenu) { if (estaEnNave) { efectoInterior.SetValue("shininess", 1f); efectoInterior.SetValue("KSpecular", 0.1f); efectoInterior.SetValue("KAmbient", 3.0f); efectoInterior.SetValue("KDiffuse", 0f); interiorNave.Render(); // constantes de iluminacion de la mesa efectoInterior.SetValue("shininess", 1f); efectoInterior.SetValue("KSpecular", 0.2f); efectoInterior.SetValue("KAmbient", 3.0f); efectoInterior.SetValue("KDiffuse", 0.1f); mesaNave.Render(); // es el mismo material (madera) mantengo las mismas constantes sillaInterior.Render(); timonInterior.Render(); // constantes de iluminacion de la soga efectoInterior.SetValue("shininess", 1f); efectoInterior.SetValue("KSpecular", 0.15f); efectoInterior.SetValue("KAmbient", 2.0f); efectoInterior.SetValue("KDiffuse", 0f); sogaInterior.Render(); efectoInterior.SetValue("shininess", 5.0f); efectoInterior.SetValue("KSpecular", 2.5f); efectoInterior.SetValue("KAmbient", 5.0f); efectoInterior.SetValue("KDiffuse", 0f); lamparaNave.Render(); if (Player.Instance().puedoEnfrentarTiburon()) { // renderizo arma arma.Effect(effect); arma.Technique("RenderScene"); arma.Render(); } } else { flagFuera = false; oceano.Render(); heightmap.Render(); foreach (var pez in peces) { if (IsInFrustum(pez.GetMesh())) { pez.Technique("RenderScene"); pez.Render(); } } foreach (var coral in corales) { if (IsInFrustum(coral.GetMesh())) { coral.Technique("RenderScene"); coral.Render(); } } foreach (var piedra in piedras) { if (IsInFrustum(piedra.GetMesh())) { piedra.Technique("RenderScene"); piedra.Render(); } } if (IsInFrustum(shark.GetMesh())) { shark.Technique("RenderScene"); shark.Render(); } Particulas.Render(ElapsedTime); //Efecto metalico effect.SetValue("shininess", 30f); effect.SetValue("KSpecular", 1.0f); effect.SetValue("KAmbient", 1.0f); effect.SetValue("KDiffuse", 0.5f); if (IsInFrustum(nave.obtenerMeshes())) { nave.Technique("RenderSceneLight"); nave.Render(); } effect.SetValue("shininess", 10f); effect.SetValue("KSpecular", 1.1f); effect.SetValue("KAmbient", 1.2f); effect.SetValue("KDiffuse", 0.25f); foreach (var metal in metales) { if (IsInFrustum(metal.GetMesh())) { metal.Technique("RenderSceneLight"); metal.Render(); } } if (Player.Instance().puedoEnfrentarTiburon()) { // renderizo arma arma.Effect(effect); arma.Technique("RenderScene"); arma.Render(); } Oceano.Render(); } Player.Render(); } device.EndScene(); if (!flagFuera || estaEnAlgunMenu) { device.SetRenderTarget(0, coralesBrillantes.GetSurfaceLevel(0)); device.DepthStencilSurface = depthStencil; device.BeginScene(); device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, Color.Black, 1.0f, 0); // dibujo 15 corales con luz int j = 0; //todo: poner 10 while (j < 25) { if (IsInFrustum(corales[j].GetMesh())) { corales[j].Technique("Bloom"); corales[j].Render(); } j++; } foreach (var pez in peces) { if (IsInFrustum(pez.GetMesh())) { pez.Technique("BloomMask"); pez.Render(); } } if (shark.estoyVivo() && IsInFrustum(shark.GetMesh())) { shark.Technique("BloomMask"); shark.Render(); } if (IsInFrustum(nave.obtenerMeshes())) { nave.Technique("BloomMask"); nave.Render(); } foreach (var metal in metales) { if (IsInFrustum(metal.GetMesh())) { metal.Technique("BloomMask"); metal.Render(); } } foreach (var piedra in piedras) { if (IsInFrustum(piedra.GetMesh())) { piedra.Technique("BloomMask"); piedra.Render(); } } if (Player.Instance().puedoEnfrentarTiburon()) { // renderizo arma arma.Effect(effect); arma.Technique("BloomMask"); arma.Render(); } device.EndScene(); // aplico pasada de blur horizontal y vertical al FB de los corales q brillan var bufferPasada = coralesBrillantes; for (int index = 0; index < 4; index++) { device.SetRenderTarget(0, FBHorizontalBool.GetSurfaceLevel(0)); device.DepthStencilSurface = depthStencil; device.BeginScene(); device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, Color.Black, 1.0f, 0); effect.Technique = "BlurHorizontal"; device.VertexFormat = CustomVertex.PositionTextured.Format; device.SetStreamSource(0, fullScreenQuad, 0); effect.SetValue("fBCoralesBrillantes", bufferPasada); effect.Begin(FX.None); effect.BeginPass(0); device.DrawPrimitives(PrimitiveType.TriangleStrip, 0, 2); effect.EndPass(); effect.End(); device.EndScene(); device.SetRenderTarget(0, FBVerticalBloom.GetSurfaceLevel(0)); device.DepthStencilSurface = depthStencil; device.BeginScene(); device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, Color.Black, 1.0f, 0); effect.Technique = "BlurVertical"; device.VertexFormat = CustomVertex.PositionTextured.Format; device.SetStreamSource(0, fullScreenQuad, 0); effect.SetValue("fBCoralesBrillantes", FBHorizontalBool); effect.Begin(FX.None); effect.BeginPass(0); device.DrawPrimitives(PrimitiveType.TriangleStrip, 0, 2); effect.EndPass(); effect.End(); device.EndScene(); bufferPasada = FBVerticalBloom; } } // Especificamos que vamos a dibujar en pantalla device.SetRenderTarget(0, screenRenderTarget); device.DepthStencilSurface = screenDepthSurface; device.BeginScene(); device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, Color.Black, 1.0f, 0); if (estaEnAlgunMenu) { effect.Technique = "PostProcessMenu"; } else if (flagFuera) { effect.Technique = "PostProcess"; } else { effect.Technique = "PostProcessMar"; } device.VertexFormat = CustomVertex.PositionTextured.Format; device.SetStreamSource(0, fullScreenQuad, 0); effect.SetValue("sceneFrameBuffer", renderTarget); effect.SetValue("verticalBlurFrameBuffer", FBVerticalBloom); // Dibujamos el full screen quad effect.Begin(FX.None); effect.BeginPass(0); device.DrawPrimitives(PrimitiveType.TriangleStrip, 0, 2); effect.EndPass(); effect.End(); Hud.Render(); RenderFPS(); RenderAxis(); device.EndScene(); device.Present(); }
/// <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(); }
/// <summary> /// Se llama una sola vez, al principio cuando se ejecuta el ejemplo. /// Escribir aquí todo el código de inicialización: cargar modelos, texturas, estructuras de optimización, todo /// procesamiento que podemos pre calcular para nuestro juego. /// Borrar el codigo ejemplo no utilizado. /// </summary> public override void Init() { //Device de DirectX para crear primitivas. var d3dDevice = D3DDevice.Instance.Device; timestamp = DateTime.Now; //Utilizando esta propiedad puedo activar el update/render a intervalos constantes. FixedTickEnable = true; //Se puede configurar el tiempo en estas propiedades TimeBetweenUpdates y TimeBetweenRenders, por defecto esta puedo en 1F / FPS_60 es a lo minimo que deberia correr el TP. //De no estar a gusto como se ejecuta el metodo Tick (el que maneja el GameLoop) el mismo es virtual con lo cual pueden sobrescribirlo. //Esconder cursor focusWindows = d3dDevice.CreationParameters.FocusWindow; mousePosition = focusWindows.PointToScreen(new Point(focusWindows.Width / 2, focusWindows.Height / 2)); //Cursor.Hide(); Sounds.SoundsManager.Instance().sound = DirectSound.DsDevice; Sounds.SoundsManager.Instance().mediaDir = MediaDir; //Burbujas D3DDevice.Instance.ParticlesEnabled = true; D3DDevice.Instance.EnableParticles(); Particulas.Init(MediaDir, 20); //Oceano Oceano.Init(TGCVector3.Up * nivelDelAgua * 0.8f, 100, 100, ShadersDir); //Settear jugador y camara FPSCamara = new FPSCamara(Camera, Input); Player = Player.Instance(); Player.SetInput(Input); Player.Init(FPSCamara); //Inicializar camara var cameraPosition = new TGCVector3(0, 100, -250); var lookAt = new TGCVector3(0, nivelDelAgua, 0); Camera.SetCamera(cameraPosition, lookAt); sonidoUnderwater = new TgcStaticSound(); sonidoUnderwater.loadSound(MediaDir + "Sounds\\mar.wav", DirectSound.DsDevice); effect = TGCShaders.Instance.LoadEffect(ShadersDir + "e_fog.fx"); efectoInterior = TGCShaders.Instance.LoadEffect(ShadersDir + "interior.fx"); //Iniciar HUD Hud.Init(MediaDir); Hud.ChangeStatus(Hud.Status.MainMenu); //Cargar enviroment oceano = new Fondo(MediaDir, ShadersDir); oceano.Init(); oceano.Camera = Camera; heightmap = new TgcSimpleTerrain(); heightmap.loadHeightmap(MediaDir + marBnwDir, marScaleXZ, marScaleY, new TGCVector3(0, marOffsetY, 0)); heightmap.loadTexture(MediaDir + marTexDir); //Cargar entidades var loader = new TgcSceneLoader(); var scene = loader.loadSceneFromFile(MediaDir + "yellow_fish-TgcScene.xml"); var mesh = scene.Meshes[0]; peces = new List <Fish>(); corales = new List <Coral>(); metales = new List <Metal>(); piedras = new List <Metal>(); int i = 0; while (i < 20) { Fish fish; string meshName = i.ToString(); fish = new Fish(mesh.clone(meshName)); fish = (Fish)setearMeshParaLista(fish, i); peces.Add(fish); fish.Effect(effect); fish.Technique("RenderScene"); i++; } scene = loader.loadSceneFromFile(MediaDir + "shark-TgcScene.xml"); mesh = scene.Meshes[0]; shark = new Shark(mesh); shark.Init(); sharkSound = new Tgc3dSound(MediaDir + "Sounds\\shark.wav", shark.GetMesh().Position, DirectSound.DsDevice); shark.setearSonido(sharkSound); shark.setearAlturaMaxima(nivelDelAgua - 19f); efectoDesaparecer = TGCShaders.Instance.LoadEffect(ShadersDir + "perlin.fx"); shark.setearEfectoPerlin(efectoDesaparecer); perlinTexture = TgcTexture.createTexture(D3DDevice.Instance.Device, MediaDir + "Textures\\perlin.png"); shark.setearPerlin(perlinTexture); scene = loader.loadSceneFromFile(MediaDir + "coral-TgcScene.xml"); mesh = scene.Meshes[0]; i = 0; while (i < 25) { Coral coral; string meshName = i.ToString(); coral = new Coral(mesh.createMeshInstance(meshName)); coral = (Coral)setearMeshParaLista(coral, i * 4, -17); corales.Add(coral); coral.Effect(effect); coral.Technique("RenderScene"); i++; } scene = loader.loadSceneFromFile(MediaDir + "Oro-TgcScene.xml"); mesh = scene.Meshes[0]; i = 0; while (i < 15) { Metal oro; string meshName = i.ToString(); oro = new Metal(mesh.createMeshInstance(meshName)); oro = (Metal)setearMeshParaLista(oro, i * 8, -17); oro.Tipo = ElementoRecolectable.oro; metales.Add(oro); oro.Effect(effect); oro.Technique("RenderSceneLight"); i++; } scene = loader.loadSceneFromFile(MediaDir + "Hierro-TgcScene.xml"); mesh = scene.Meshes[0]; i = 0; while (i < 15) { Metal hierro; string meshName = i.ToString() + i.ToString(); hierro = new Metal(mesh.createMeshInstance(meshName)); hierro = (Metal)setearMeshParaLista(hierro, (i + 10) * 8, -17); hierro.Tipo = ElementoRecolectable.hierro; metales.Add(hierro); hierro.Effect(effect); hierro.Technique("RenderScene"); i++; } scene = loader.loadSceneFromFile(MediaDir + "Roca-TgcScene.xml"); mesh = scene.Meshes[0]; i = 0; while (i < 15) { Metal roca; string meshName = i.ToString() + i.ToString() + i.ToString(); roca = new Metal(mesh.createMeshInstance(meshName)); roca = (Metal)setearMeshParaLista(roca, (i + 10) * 8, -17); roca.Tipo = ElementoRecolectable.madera; roca.escalar(new TGCVector3(0.3f, 0.3f, 0.3f)); piedras.Add(roca); roca.Effect(effect); roca.Technique("RenderScene"); i++; } scene = loader.loadSceneFromFile(MediaDir + "ship-TgcScene.xml"); nave = Nave.Instance(); nave.Init(scene, nivelDelAgua); scene = loader.loadSceneFromFile(MediaDir + "EspadaDoble-TgcScene.xml"); mesh = scene.Meshes[0]; arma = new Arma(mesh); scene = loader.loadSceneFromFile(MediaDir + "Mesa-TgcScene.xml"); mesaNave = MesaNave.Instance(); mesaNave.Init(scene); mesaNave.Effect(efectoInterior); mesaNave.Technique("RenderScene"); scene = loader.loadSceneFromFile(MediaDir + "SogaEnrollada-TgcScene.xml"); mesh = scene.Meshes[0]; sogaInterior = SogaInterior.Instance(); sogaInterior.Init(mesh); sogaInterior.Effect(efectoInterior); sogaInterior.Technique("RenderScene"); scene = loader.loadSceneFromFile(MediaDir + "silla-TgcScene.xml"); sillaInterior = SillaInterior.Instance(); sillaInterior.Init(scene); sillaInterior.Effect(efectoInterior); sillaInterior.Technique("RenderScene"); scene = loader.loadSceneFromFile(MediaDir + "Timon-TgcScene.xml"); timonInterior = TimonInterior.Instance(); timonInterior.Init(scene); timonInterior.Effect(efectoInterior); timonInterior.Technique("RenderScene"); scene = loader.loadSceneFromFile(MediaDir + "LamparaTecho-TgcScene.xml"); lamparaNave = new LamparaNave(scene.Meshes[0]); lamparaNave.Effect(efectoInterior); lamparaNave.Technique("RenderScene"); //Cargar shaders fog = new TgcFog(); fog.Color = Color.FromArgb(30, 144, 255); fog.Density = 1; fog.EndDistance = 1000; fog.StartDistance = 1; fog.Enabled = true; effect.SetValue("screen_dx", d3dDevice.PresentationParameters.BackBufferWidth); effect.SetValue("screen_dy", d3dDevice.PresentationParameters.BackBufferHeight); //Fog + Lights effect.SetValue("nivelAgua", nivelDelAgua); interiorNave = InteriorNave.Instance(); interiorNave.Init(MediaDir); DirectSound.ListenerTracking = Player.Instance().mesh; //Mascara post process maskTexture = TgcTexture.createTexture(D3DDevice.Instance.Device, MediaDir + "Textures\\mascara.png"); effect.SetValue("textura_mascara", maskTexture.D3dTexture); // seteamos los efectos aca porque son fijos oceano.Effect(effect); oceano.Technique("RenderScene"); heightmap.Effect = effect; heightmap.Technique = "RenderScene"; shark.Effect(effect); shark.Technique("RenderScene"); nave.Effect(effect); nave.Technique("RenderSceneLight"); effect.SetValue("ambientColor", Color.FromArgb(255, 255, 255).ToArgb()); effect.SetValue("diffuseColor", Color.FromArgb(255, 255, 255).ToArgb()); effect.SetValue("specularColor", Color.FromArgb(255, 255, 255).ToArgb()); efectoInterior.SetValue("ambientColor", Color.FromArgb(255, 255, 255).ToArgb()); efectoInterior.SetValue("diffuseColor", Color.FromArgb(255, 255, 255).ToArgb()); efectoInterior.SetValue("specularColor", Color.FromArgb(255, 255, 255).ToArgb()); // dibujo el full screen quad CustomVertex.PositionTextured[] vertices = { 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 fullScreenQuad = new VertexBuffer(typeof(CustomVertex.PositionTextured), 4, d3dDevice, Usage.Dynamic | Usage.WriteOnly, CustomVertex.PositionTextured.Format, Pool.Default); fullScreenQuad.SetData(vertices, 0, LockFlags.None); // dibujo render target depthStencil = d3dDevice.CreateDepthStencilSurface(d3dDevice.PresentationParameters.BackBufferWidth, d3dDevice.PresentationParameters.BackBufferHeight, DepthFormat.D24S8, MultiSampleType.None, 0, true); renderTarget = new Texture(d3dDevice, d3dDevice.PresentationParameters.BackBufferWidth, d3dDevice.PresentationParameters.BackBufferHeight, 1, Usage.RenderTarget, Format.X8R8G8B8, Pool.Default); // inicializo los FB que uso para el Bloom coralesBrillantes = new Texture(d3dDevice, d3dDevice.PresentationParameters.BackBufferWidth, d3dDevice.PresentationParameters.BackBufferHeight, 1, Usage.RenderTarget, Format.X8R8G8B8, Pool.Default); FBHorizontalBool = new Texture(d3dDevice, d3dDevice.PresentationParameters.BackBufferWidth, d3dDevice.PresentationParameters.BackBufferHeight, 1, Usage.RenderTarget, Format.X8R8G8B8, Pool.Default); FBVerticalBloom = new Texture(d3dDevice, d3dDevice.PresentationParameters.BackBufferWidth, d3dDevice.PresentationParameters.BackBufferHeight, 1, Usage.RenderTarget, Format.X8R8G8B8, Pool.Default); }
/// <summary> /// Se llama una sola vez, al principio cuando se ejecuta el ejemplo. /// Escribir aquí todo el código de inicialización: cargar modelos, texturas, estructuras de optimización, todo /// procesamiento que podemos pre calcular para nuestro juego. /// Borrar el codigo ejemplo no utilizado. /// </summary> public override void Init() { estrellasS.ForEach(e => e.AutoTransform = true); CustomVertex.PositionTextured[] screenQuadVertices = { 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.Instance.Device, Usage.Dynamic | Usage.WriteOnly, CustomVertex.PositionTextured.Format, Pool.Default); screenQuadVB.SetData(screenQuadVertices, 0, LockFlags.None); //Creamos un DepthStencil que debe ser compatible con nuestra definicion de renderTarget2D. depthStencil = D3DDevice.Instance.Device.CreateDepthStencilSurface(D3DDevice.Instance.Device.PresentationParameters.BackBufferWidth, D3DDevice.Instance.Device.PresentationParameters.BackBufferHeight, DepthFormat.D24S8, MultiSampleType.None, 0, true); depthStencilOld = D3DDevice.Instance.Device.DepthStencilSurface; escena = new Texture(D3DDevice.Instance.Device, D3DDevice.Instance.Device.PresentationParameters.BackBufferWidth, D3DDevice.Instance.Device.PresentationParameters.BackBufferHeight, 1, Usage.RenderTarget, Format.X8R8G8B8, Pool.Default); propulsores = new Texture(D3DDevice.Instance.Device, D3DDevice.Instance.Device.PresentationParameters.BackBufferWidth, D3DDevice.Instance.Device.PresentationParameters.BackBufferHeight, 1, Usage.RenderTarget, Format.X8R8G8B8, Pool.Default); propulsoresBlurAux = new Texture(D3DDevice.Instance.Device, D3DDevice.Instance.Device.PresentationParameters.BackBufferWidth, D3DDevice.Instance.Device.PresentationParameters.BackBufferHeight, 1, Usage.RenderTarget, Format.X8R8G8B8, Pool.Default); propulsoresBlurAux2 = new Texture(D3DDevice.Instance.Device, D3DDevice.Instance.Device.PresentationParameters.BackBufferWidth, D3DDevice.Instance.Device.PresentationParameters.BackBufferHeight, 1, Usage.RenderTarget, Format.X8R8G8B8, Pool.Default); //Device de DirectX para crear primitivas. var d3dDevice = D3DDevice.Instance.Device; D3DDevice.Instance.Device.Transform.Projection = Matrix.PerspectiveFovLH(D3DDevice.Instance.FieldOfView, D3DDevice.Instance.AspectRatio, D3DDevice.Instance.ZNearPlaneDistance, D3DDevice.Instance.ZFarPlaneDistance * 1.8f); this.postProcessMerge = TgcShaders.loadEffect(this.ShadersDir + "PostProcess.fx"); this.blurEffect = TgcShaders.loadEffect(this.ShadersDir + "GaussianBlur.fx"); blurEffect.SetValue("screen_dx", d3dDevice.PresentationParameters.BackBufferWidth); blurEffect.SetValue("screen_dy", d3dDevice.PresentationParameters.BackBufferHeight); this.escenarios = new List <Escenario>(); this.enemigos = new List <NaveEnemiga>(); //Crear SkyBox skyBox = new TgcSkyBox(); skyBox.Center = new TGCVector3(0, 0, -2300f); skyBox.Size = new TGCVector3(10000, 10000, 18000); var texturesPath = MediaDir + "XWing\\Textures\\"; skyBox.setFaceTexture(TgcSkyBox.SkyFaces.Up, texturesPath + "space.jpg"); skyBox.setFaceTexture(TgcSkyBox.SkyFaces.Down, texturesPath + "space.jpg"); skyBox.setFaceTexture(TgcSkyBox.SkyFaces.Left, texturesPath + "space.jpg"); skyBox.setFaceTexture(TgcSkyBox.SkyFaces.Right, texturesPath + "space.jpg"); skyBox.setFaceTexture(TgcSkyBox.SkyFaces.Front, texturesPath + "space.jpg"); skyBox.setFaceTexture(TgcSkyBox.SkyFaces.Back, texturesPath + "space.jpg"); skyBox.Init(); this.navePrincipal = new NaveEspacial(MediaDir, "xwing-TgcScene.xml", Color.DarkBlue, 10, 250, null, 250f); this.navePrincipal.ScaleFactor = TGCMatrix.Scaling(0.5f, 0.5f, 0.5f); this.navePrincipal.RotationVector = new TGCVector3(0, FastMath.PI_HALF, 0); this.navePrincipal.MovementVector = new TGCVector3(1200f, -1100f, 4000f); for (int i = 0; i < 5; i++) { escenarios.Add(Escenario.GenerarEscenarioDefault(MediaDir, i)); } for (int i = 0; i < enemigosAlMismoTiempo; i++) { enemigos.Add(new NaveEnemiga(MediaDir, "X-Wing-TgcScene.xml", dañoEnemigos, 500, navePrincipal)); enemigos[i].MovementVector = new TGCVector3(0, 0, 500000000000f); enemigos[i].CreateOOB(); } //escenarios.ForEach(es => es.generarTorre(MediaDir)); currentScene = escenarios[0]; this.navePrincipal.CreateOOB(); //Suelen utilizarse objetos que manejan el comportamiento de la camara. //Lo que en realidad necesitamos gráficamente es una matriz de View. //El framework maneja una cámara estática, pero debe ser inicializada. //Posición de la camara. var cameraPosition = new TGCVector3(0, 0, 0); //Quiero que la camara mire hacia el origen (0,0,0). var lookAt = new TGCVector3(-50000, -1, 0); //Configuro donde esta la posicion de la camara y hacia donde mira. Camara.SetCamera(cameraPosition, lookAt); //Internamente el framework construye la matriz de view con estos dos vectores. //Luego en nuestro juego tendremos que crear una cámara que cambie la matriz de view con variables como movimientos o animaciones de escenas. Camara = new CamaraStarWars(this.navePrincipal.GetPosition(), 20, 100); sol = TGCBox.fromSize(new TGCVector3(0, 5000, 4000), new TGCVector3(50, 50, 50), Color.Yellow); sol.AutoTransform = true; menu = new Menu(MediaDir, Input); //Cargo sonidos pathSonidoMenu = MediaDir + "Sound\\musica_menu.mp3"; pathSonidoAmbiente = MediaDir + "Music\\StarWarsMusic.mp3"; pathSonidoDisparo = MediaDir + "Music\\laserSound.wav"; if (menu.playSonidoMenu) { playerAmbiente.closeFile(); playerAmbiente.FileName = pathSonidoMenu; playerAmbiente.play(true); } drawer = new Drawer2D(); hud = new Hud(MediaDir, Input); //ShadowMap // Creo el shadowmap. // Format.R32F // Format.X8R8G8B8 g_pShadowMap = new Texture(D3DDevice.Instance.Device, SHADOWMAP_SIZE, SHADOWMAP_SIZE, 1, Usage.RenderTarget, Format.R32F, Pool.Default); // tengo que crear un stencilbuffer para el shadowmap manualmente // para asegurarme que tenga la el mismo tamano que el shadowmap, y que no tenga // multisample, etc etc. g_pDSShadow = D3DDevice.Instance.Device.CreateDepthStencilSurface(SHADOWMAP_SIZE, SHADOWMAP_SIZE, DepthFormat.D24S8, MultiSampleType.None, 0, true); // por ultimo necesito una matriz de proyeccion para el shadowmap, ya // que voy a dibujar desde el pto de vista de la luz. // El angulo tiene que ser mayor a 45 para que la sombra no falle en los extremos del cono de luz // de hecho, un valor mayor a 90 todavia es mejor, porque hasta con 90 grados es muy dificil // lograr que los objetos del borde generen sombras var aspectRatio = D3DDevice.Instance.AspectRatio; g_mShadowProj = TGCMatrix.PerspectiveFovLH(Geometry.DegreeToRadian(50), aspectRatio, 50, 15000); D3DDevice.Instance.Device.Transform.Projection = TGCMatrix.PerspectiveFovLH(Geometry.DegreeToRadian(45.0f), aspectRatio, near_plane, far_plane).ToMatrix(); }
private void CheckInputs(float ElapsedTime, ref bool estaEnNave_) { int w = Input.keyDown(Key.W) ? 1 : 0; int s = Input.keyDown(Key.S) ? 1 : 0; int d = Input.keyDown(Key.D) ? 1 : 0; int a = Input.keyDown(Key.A) ? 1 : 0; int space = Input.keyDown(Key.Space) ? 1 : 0; int ctrl = Input.keyDown(Key.LeftControl) ? 1 : 0; bool o = Input.keyDown(Key.O); bool i = Input.keyDown(Key.I); // nuestra "implementacion" del key pressed (porque nos da false todo el tiempo el de TGC) if (o) { o = false; presionoO = true; } else { if (presionoO) { o = true; presionoO = false; } } if (i) { i = false; presionoI = true; } else { if (presionoI) { i = true; presionoI = false; } } float fmov = w - s; //foward movement float hmov = a - d; //horizontal movement float vmov = space - ctrl; //vertical movement //Check for in-ship movement var LookDir = Camara.LookDir(); var LeftDir = Camara.LeftDir(); if (estaEnNave) { LookDir.Y = 0; LeftDir.Y = 0; vmov = 0; } //Move player TGCVector3 movement = LookDir * fmov * speed + Camara.LeftDir() * hmov * speed + TGCVector3.Up * vmov * vspeed; movement *= ElapsedTime; movement.Y = mesh.Position.Y + movement.Y < MIN_Y_POS ? 0 : movement.Y; if (IsOnTopOfWater()) { movement.Y = FastMath.Min(movement.Y, 0); } Move(movement, ElapsedTime); if (i) { if (!Hud.IsCurrentStatus(Hud.Status.MainMenu) && !Hud.IsCurrentStatus(Hud.Status.GameOver)) { if (!Hud.IsCurrentStatus(Hud.Status.Inventory) && !Hud.IsCurrentStatus(Hud.Status.Crafting)) { if (!estaEnNave) { Hud.ChangeStatus(Hud.Status.Inventory); } else { Hud.ChangeStatus(Hud.Status.Crafting); } } else { Hud.ChangeStatus(Hud.Status.Gameplay); } } } if (o) { estaEnNave_ = !estaEnNave_; walking.stop(); if (estaEnNave_) { // guardar la posicion en la que estaba para que cuando vuelva, ponerlo en esa posicion anterior // posiciono dentro de nave posicionMar = mesh.Position; mesh.Position = posicionInteriorNave; } else { mesh.Position = posicionMar; } Hud.ChangeStatus(Hud.Status.Gameplay); } //Dev bool p = Input.keyDown(Key.P); // usar nuestra implementacion del key pressed if (p) { p = false; presionoP = true; } else { if (presionoP) { p = true; presionoP = false; } } if (p) { godmode = !godmode; GodMode(godmode); } }
public override void Init() { Tiempo = 0; var d3dDevice = D3DDevice.Instance.Device; Plaza = new TgcSceneLoader().loadSceneFromFile(MediaDir + "Plaza-TgcScene.xml"); MayasIA = new TgcSceneLoader().loadSceneFromFile(MediaDir + "AutoPolicia-TgcScene.xml").Meshes; MayasAutoFisico1 = new TgcSceneLoader().loadSceneFromFile(MediaDir + "AutoAmarillo-TgcScene.xml").Meshes; MayasAutoFisico2 = new TgcSceneLoader().loadSceneFromFile(MediaDir + "AutoNaranja-TgcScene.xml").Meshes; PathHumo = MediaDir + "Textures\\TexturaHumo.png"; //Shader Invisibilidad Invisibilidad = TGCShaders.Instance.LoadEffect(ShadersDir + "\\Invisibilidad.fx"); Invisibilidad.Technique = "DefaultTechnique"; g_pDepthStencil = d3dDevice.CreateDepthStencilSurface(d3dDevice.PresentationParameters.BackBufferWidth, d3dDevice.PresentationParameters.BackBufferHeight, DepthFormat.D24S8, MultiSampleType.None, 0, true); g_pRenderTarget = new Texture(d3dDevice, d3dDevice.PresentationParameters.BackBufferWidth , d3dDevice.PresentationParameters.BackBufferHeight, 1, Usage.RenderTarget, Format.X8R8G8B8, Pool.Default); Invisibilidad.SetValue("g_RenderTarget", g_pRenderTarget); // Resolucion de pantalla Invisibilidad.SetValue("screen_dx", d3dDevice.PresentationParameters.BackBufferWidth); Invisibilidad.SetValue("screen_dy", d3dDevice.PresentationParameters.BackBufferHeight); CustomVertex.PositionTextured[] vertices = { 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 g_pVBV3D = new VertexBuffer(typeof(CustomVertex.PositionTextured), 4, d3dDevice, Usage.Dynamic | Usage.WriteOnly, CustomVertex.PositionTextured.Format, Pool.Default); g_pVBV3D.SetData(vertices, 0, LockFlags.None); // -------------------------------------------------------------------- //Shader EnvMap EnvMap = TGCShaders.Instance.LoadEffect(ShadersDir + "\\EnvMap.fx"); EnvMap.Technique = "RenderScene"; posicionLuz = new TGCVector3(1500, 600, 1500); // -------------------------------------------------------------------- //Cielo Cielo = new TgcSkyBox { Center = TGCVector3.Empty, Size = new TGCVector3(10000, 10000, 10000) }; var cieloPath = MediaDir + "Cielo\\"; Cielo.setFaceTexture(TgcSkyBox.SkyFaces.Up, cieloPath + "cloudtop_up.jpg"); Cielo.setFaceTexture(TgcSkyBox.SkyFaces.Down, cieloPath + "cloudtop_down.jpg"); Cielo.setFaceTexture(TgcSkyBox.SkyFaces.Left, cieloPath + "cloudtop_left.jpg"); Cielo.setFaceTexture(TgcSkyBox.SkyFaces.Right, cieloPath + "cloudtop_right.jpg"); Cielo.setFaceTexture(TgcSkyBox.SkyFaces.Front, cieloPath + "cloudtop_front.jpg"); Cielo.setFaceTexture(TgcSkyBox.SkyFaces.Back, cieloPath + "cloudtop_back.jpg"); Cielo.SkyEpsilon = 11f; Cielo.Init(); // Implemento la fisica Fisica = new FisicaMundo(); for (int i = 30; i < 238; i++) { var objetos = BulletRigidBodyFactory.Instance.CreateRigidBodyFromTgcMesh(Plaza.Meshes[i]); Fisica.dynamicsWorld.AddRigidBody(objetos); } // Inicializo los coches AutoFisico1 = new AutoManejable(MayasAutoFisico1, new TGCVector3(-1000, 0, 3500), 270, Fisica, PathHumo, MediaDir, DirectSound.DsDevice); AutoFisico2 = new AutoManejable(MayasAutoFisico2, new TGCVector3(4000, 0, 3500), 270, Fisica, PathHumo, MediaDir, DirectSound.DsDevice); AutoFisico2.ConfigurarTeclas(Key.W, Key.S, Key.D, Key.A, Key.LeftControl, Key.Tab); AutoFisico1.ConfigurarTeclas(Key.UpArrow, Key.DownArrow, Key.RightArrow, Key.LeftArrow, Key.RightControl, Key.Space); AutoFisico1.Vida = 1000; AutoFisico2.Vida = 1000; Jugadores = new[] { AutoFisico1, AutoFisico2 }; GrupoPolicias = new PoliciasIA(MayasIA, Fisica, PathHumo, Jugadores, MediaDir, DirectSound.DsDevice); Players = new List <AutoManejable> { AutoFisico1, AutoFisico2 }; // Para el sonido y las colisiones // Jugadores foreach (var auto in Players) { auto.sonidoAceleracion = new TgcStaticSound(); auto.sonidoDesaceleracion = new TgcStaticSound(); auto.frenada = new TgcStaticSound(); auto.choque = new TgcStaticSound(); auto.sonidoDesaceleracion.loadSound(MediaDir + "Musica\\Desacelerando.wav", -2000, DirectSound.DsDevice); auto.sonidoAceleracion.loadSound(MediaDir + "Musica\\Motor2.wav", -1700, DirectSound.DsDevice); auto.frenada.loadSound(MediaDir + "Musica\\Frenada.wav", -2000, DirectSound.DsDevice); auto.choque.loadSound(MediaDir + "Musica\\Choque1.wav", -2000, DirectSound.DsDevice); } SwitchInicio = 1; SwitchCamara = 1; Hud = new Hud(MediaDir, Jugadores); Sonidos = new Sonidos(MediaDir, DirectSound.DsDevice); }