// Project: XnaGraphicEngineVs2005, File: YourGame.cs // Namespace: XnaGraphicEngine, Class: YourGame // Path: C:\code\XnaBook\XnaGraphicEngine, Author: Abi // Code lines: 323, Size of file: 8,65 KB // Creation date: 21.11.2006 03:56 // Last modified: 27.11.2006 07:09 // Generated with Commenter by abi.exDream.com #region Using directives using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Audio; using Microsoft.Xna.Framework.Content; using Microsoft.Xna.Framework.Graphics; using Microsoft.Xna.Framework.Input; using Microsoft.Xna.Framework.Storage; using System; using System.Collections.Generic; using XnaGraphicEngine.Game; using XnaGraphicEngine.Graphics; using Texture = XnaGraphicEngine.Graphics.Texture; using Model = XnaGraphicEngine.Graphics.Model; using XnaGraphicEngine.Helpers; using XnaGraphicEngine.GameScreens; using XnaGraphicEngine.Sounds; using XnaGraphicEngine.Properties; #endregion namespace XnaGraphicEngine { /// /// YourGame test class, very similar to the MyOwnGraphicEngine project /// from the Rocket Commander tutorials, but this time in XNA. While this /// class is pretty easy the graphic engine we build in the background /// is quite powerful and will enable us to create cool games very quickly /// now as we can see in a few chapters :) /// public class YourGame : BaseGame { #region Variables /// /// Game screens stack. We can easily add and remove game screens /// and they follow the game logic automatically. Very cool. /// private Stack gameScreens = new Stack(); /// /// Load the main menu and mouse textures at game start, this way /// we have access in all game screens and don't ever have to reload /// any of these textures. /// public Texture mainMenuTexture = null, mouseCursorTexture = null; /// /// Also preload the in game textures for all in game controls and stuff. /// Note: These Hud textures are saved in png format to save disk space. /// Light effect texture is used to show items from a far distance. /// public Texture hudTopTexture = null, hudBottomTexture = null; #endregion #region Constructor /// /// Create your game /// public YourGame() { // Disable mouse, we use our own mouse texture in the menu // and don't use any mouse cursor in the game anyway. this.IsMouseVisible = false; } // YourGame() #endregion #region Initialize /// /// Allows the game to perform any initialization it needs. /// protected override void Initialize() { base.Initialize(); // Make sure mouse is centered Input.Update(); Input.MousePos = new Point( Window.ClientBounds.X + width / 2, Window.ClientBounds.Y + height / 2); Input.Update(); // Load menu textures mainMenuTexture = new Texture("MainMenu"); mouseCursorTexture = new Texture("MouseCursor"); hudTopTexture = new Texture("HudTop"); hudBottomTexture = new Texture("HudBottom"); // Create main menu screen gameScreens.Push(new MainMenu()); // Start game //gameScreens.Push(new Mission()); //inGame = true; // Start music Sound.StartMusic(); } // Initialize() #endregion #region Toggle music on/off /// /// Toggle music on off /// public void ToggleMusicOnOff() { if (GameSettings.Default.MusicOn) Sound.StopMusic(); else Sound.StartMusic(); } // ToggleMusicOnOff() #endregion #region Add game screen static bool inGame = false; /// /// In game /// /// Bool public static bool InGame { get { return inGame; } // get } // InGame /// /// Add game screen, which will be used until we quit it or add /// another game screen on top of it. /// /// New game screen public void AddGameScreen(IGameScreen newGameScreen) { gameScreens.Push(newGameScreen); inGame = newGameScreen.GetType() == typeof(Mission); } // AddGameScreen(newGameScreen) #endregion #region Remove current game screen /// /// Remove current game screen /// public void RemoveCurrentGameScreen() { gameScreens.Pop(); inGame = gameScreens.Count > 0 && gameScreens.Peek().GetType() == typeof(Mission); } // RemoveCurrentGameScreen() #endregion #region Render menu background /// /// Render menu background /// public void RenderMenuBackground() { // Make sure alpha blending is enabled. BaseGame.EnableAlphaBlending(); mainMenuTexture.RenderOnScreen( BaseGame.ResolutionRect, new Rectangle(0, 0, 1024, 768)); } // RenderMenuBackground() #endregion #region Render game background /// /// Render game background /// public static void RenderGameBackground() { //TODO } // RenderGameBackground() #endregion #region Render button /// /// Render button /// /// Button type /// Rectangle public bool RenderMenuButton( MenuButton buttonType, Point pos) { // Calc screen rect for rendering (recalculate relative screen position // from 1024x768 to actual screen resolution, just in case ^^). Rectangle rect = new Rectangle( pos.X * BaseGame.Width / 1024, pos.Y * BaseGame.Height / 768, 200 * BaseGame.Width / 1024, 77 * BaseGame.Height / 768); // Is button highlighted? Rectangle innerRect = new Rectangle( rect.X, rect.Y + rect.Height / 5, rect.Width, rect.Height * 3 / 5); bool highlight = Input.MouseInBox( //rect); // Just use inner rect innerRect); // Was not highlighted last frame? if (highlight && Input.MouseWasNotInRectLastFrame(innerRect)) Sound.Play(Sound.Sounds.Highlight); // See MainMenu.dds for pixel locations int buttonNum = (int)buttonType; // Correct last 2 button numbers (exit and back) //if (buttonNum >= (int)MenuButton.Exit) // buttonNum -= 2; Rectangle pixelRect = new Rectangle(3 + 204 * buttonNum, 840 + 80 * (highlight ? 1 : 0), 200, 77); // Render mainMenuTexture.RenderOnScreen(rect, pixelRect); // Play click sound if button was just clicked bool ret = (Input.MouseLeftButtonJustPressed || Input.GamePadAJustPressed) && this.IsActive && highlight; if (buttonType == MenuButton.Back && Input.GamePadBackJustPressed) ret = true; if (buttonType == MenuButton.Missions && Input.GamePadStartPressed) ret = true; if (ret == true) Sound.Play(Sound.Sounds.Click); // Return true if button was pressed, false otherwise return ret; } // RenderButton(buttonType, rect) #endregion #region Render mouse cursor /// /// Render mouse cursor /// public void RenderMouseCursor() { #if !XBOX360 // We got 4 animation steps, rotate them by the current time int mouseAnimationStep = (int)(BaseGame.TotalTimeMs / 100) % 4; // And render mouse on screen. mouseCursorTexture.RenderOnScreen( new Rectangle(Input.MousePos.X, Input.MousePos.Y, 60 * 2 / 3, 64 * 2 / 3), new Rectangle(64 * mouseAnimationStep, 0, 60, 64)); // Draw all sprites (just the mouse cursor) SpriteHelper.DrawSprites(width, height); #endif } // RenderMouseCursor() #endregion #region Update /// /// Allows the game to run logic such as updating the world, /// checking for collisions, gathering input and playing audio. /// /// Provides a snapshot of timing values. protected override void Update(GameTime gameTime) { // If that game screen should be quitted, remove it from stack! if (gameScreens.Count > 0 && gameScreens.Peek().Quit) RemoveCurrentGameScreen(); // If no more game screens are left, it is time to quit! if (gameScreens.Count == 0) { #if DEBUG // Don't exit if this is just a unit test if (this.GetType() != typeof(TestGame)) #endif Exit(); } // if base.Update(gameTime); } // Update(gameTime) #endregion #region Draw /// /// This is called when the game should draw itself. /// /// Provides a snapshot of timing values. protected override void Draw(GameTime gameTime) { ClearBackground(); // Start post screen glow shader, will be shown in BaseGame.Draw BaseGame.GlowShader.Start(); try { // Execute the game screen on top. if (gameScreens.Count > 0) gameScreens.Peek().Run(this); } // try catch (Exception ex) { Log.Write("Failed to execute " + gameScreens.Peek().Name + "\nError: " + ex.ToString()); } // catch base.Draw(gameTime); // Show mouse cursor (in all modes except in the game) if (inGame == false && gameScreens.Count > 0) RenderMouseCursor(); else { // In game always center mouse Input.CenterMouse(); } // else // Add scene glow on top of everything (2d and 3d!) glowShader.Show(); } // Draw(gameTime) #endregion #region Start Game /// /// Start game /// public static void StartGame() { using (YourGame game = new YourGame()) { game.Run(); } // using (game) GameSettings.Save(); } // StartGame() #endregion #region Unit tests #if DEBUG #region TestRenderOurNewGraphicEngine /// /// Test render our new graphic engine /// public static void TestRenderOurNewGraphicEngine() { Texture backgroundTexture = null; Model rocketModel = null; TestGame.Start("TestRenderOurNewGraphicEngine", delegate { // Load background and rocket backgroundTexture = new Texture("SpaceBackground"); rocketModel = new Model("Rocket"); }, delegate { // Show background backgroundTexture.RenderOnScreen( BaseGame.ResolutionRect); SpriteHelper.DrawSprites(width, height); // Render model in center BaseGame.Device.RenderState.DepthBufferEnable = true; rocketModel.Render(Matrix.CreateScale(10)); // Draw 3d line BaseGame.DrawLine( new Vector3(-100, 0, 0), new Vector3(+100, 0, 0), Color.Red); // Draw save region box for the Xbox 360 (support for older monitors) Point upperLeft = new Point(width / 15, height / 15); Point upperRight = new Point(width * 14 / 15, height / 15); Point lowerRight = new Point(width * 14 / 15, height * 14 / 15); Point lowerLeft = new Point(width / 15, height * 14 / 15); BaseGame.DrawLine(upperLeft, upperRight); BaseGame.DrawLine(upperRight, lowerRight); BaseGame.DrawLine(lowerRight, lowerLeft); BaseGame.DrawLine(lowerLeft, upperLeft); // And finally some text TextureFont.WriteText(upperLeft.X + 15, upperLeft.Y + 15, "TestRenderOurNewGraphicEngine"); }); } // TestRenderOurNewGraphicEngine() #endregion #endif #endregion } // class YourGame } // namespace XnaGraphicEngine