#region File Description //----------------------------------------------------------------------------- // EvolvedBackdrop.cs // // Microsoft XNA Community Game Platform // Copyright (C) Microsoft Corporation. All rights reserved. //----------------------------------------------------------------------------- #endregion #region Using Statements using System; using System.Collections.Generic; using System.Text; using Microsoft.Xna.Framework.Graphics; using Microsoft.Xna.Framework; #endregion namespace Spacewar { /// /// Handles the drawing of the moving nebula backdrops /// public class EvolvedBackdrop : Shape, IDisposable { private const int xCount = 1; private const int yCount = 1; private Effect effect; private float layerFactor; private float timeFactor1; private float timeFactor2; private Vector4 layer1Offset; private Vector4 layer2Offset; private EffectParameter layer1TextureParam; private EffectParameter layer2TextureParam; private EffectParameter layer3TextureParam; private EffectParameter layerFactorParam; private EffectParameter layer1OffsetParam; private EffectParameter layer2OffsetParam; private Texture2D layer1; private Texture2D layer2; private Texture2D layer3; public EvolvedBackdrop(Game game) : base(game) { layer1Offset = Vector4.Zero; layer2Offset = Vector4.Zero; } /// /// Creates the quad needed to render the textures to /// public override void Create() { IGraphicsDeviceService graphicsService = (IGraphicsDeviceService)GameInstance.Services.GetService(typeof(IGraphicsDeviceService)); buffer = new VertexBuffer(graphicsService.GraphicsDevice, typeof(VertexPositionColor), 6, BufferUsage.WriteOnly); VertexPositionColor[] data = new VertexPositionColor[6]; data[0] = new VertexPositionColor(new Vector3(0, 0, 0), Color.White); data[1] = new VertexPositionColor(new Vector3(1280, 0, 0), Color.White); data[2] = new VertexPositionColor(new Vector3(1280, 720, 0), Color.White); data[3] = new VertexPositionColor(new Vector3(0, 0, 0), Color.White); //same as 0 data[4] = new VertexPositionColor(new Vector3(1280, 720, 0), Color.White); //same as 2 data[5] = new VertexPositionColor(new Vector3(0, 720, 0), Color.White); buffer.SetData(data); effect = SpacewarGame.ContentManager.Load(SpacewarGame.Settings.MediaPath + @"shaders\backdrop"); layer1TextureParam = effect.Parameters["layer1"]; layer2TextureParam = effect.Parameters["layer2"]; layer3TextureParam = effect.Parameters["layer3"]; layerFactorParam = effect.Parameters["layerFactor"]; layer1OffsetParam = effect.Parameters["layer1Offset"]; layer2OffsetParam = effect.Parameters["layer2Offset"]; //Preload the textures into the cache // TODO: This doesn't support multiple "boards" layer1 = SpacewarGame.ContentManager.Load(SpacewarGame.Settings.MediaPath + @"textures\B1_nebula01"); layer2 = SpacewarGame.ContentManager.Load(SpacewarGame.Settings.MediaPath + @"textures\B1_nebula02"); layer3 = SpacewarGame.ContentManager.Load(SpacewarGame.Settings.MediaPath + @"textures\B1_stars"); } /// /// Moves the layers and sets the fade values /// /// Current Game time /// Elapsed Game time since last update public override void Update(TimeSpan time, TimeSpan elapsedTime) { base.Update(time, elapsedTime); timeFactor1 += (float)elapsedTime.TotalSeconds; timeFactor2 += (float)elapsedTime.TotalSeconds * 2; //Animate the fading and moving backdrops //Cross fade between 0.0 and 1.0 layerFactor = (float)(Math.Sin(timeFactor2 * SpacewarGame.Settings.CrossFadeSpeed) * .5 + .5); //Move the nebula layers up to 200 pixels layer1Offset.X = (float)((100.0 / 1480.0) * .3 * (Math.Sin(timeFactor1 * SpacewarGame.Settings.OffsetSpeed / 2.0) + 1.0)); layer1Offset.Y = (float)((100.0 / 920.0) * (Math.Cos(timeFactor1 * SpacewarGame.Settings.OffsetSpeed / 1.4) + 1.0)); layer2Offset.X = (float)((100.0 / 1480.0) * (Math.Sin(timeFactor1 * SpacewarGame.Settings.OffsetSpeed) + 1.0)); layer2Offset.Y = (float)((100.0 / 920.0) * .7 * (Math.Cos(timeFactor1 * SpacewarGame.Settings.OffsetSpeed / 1.3) + 1.0)); } /// /// Renders the backdrop /// public override void Render() { IGraphicsDeviceService graphicsService = (IGraphicsDeviceService)GameInstance.Services.GetService(typeof(IGraphicsDeviceService)); GraphicsDevice device = graphicsService.GraphicsDevice; base.Render(); device.SetVertexBuffer(buffer); layer1TextureParam.SetValue(layer1); layer2TextureParam.SetValue(layer2); layer3TextureParam.SetValue(layer3); layerFactorParam.SetValue(layerFactor); layer1OffsetParam.SetValue(layer1Offset); layer2OffsetParam.SetValue(layer2Offset); effect.Techniques[0].Passes[0].Apply(); device.DrawPrimitives(PrimitiveType.TriangleList, 0, xCount * yCount * 2); } protected override void Dispose(bool all) { if (effect != null) { effect.Dispose(); effect = null; } base.Dispose(all); } public override void Dispose() { Dispose(true); GC.SuppressFinalize(this); } } }