topical media & game development

talk show tell print

game-xna-intro-XnaShooter-XnaShooterGame.cs / cs



  // Project: XnaShooter, File: XnaShooterGame.cs
  // Namespace: XnaShooter, Class: XnaShooterGame
  // Path: C:\code\XnaShooter  Author: Abi
  // Code lines: 182, Size of file: 5,41 KB
  // Creation date: 02.10.2006 01:33
  // Last modified: 27.10.2006 02:40
  // Generated with Commenter by abi.exDream.com
  
  #region Using directives
  using System;
  using System.Collections.Generic;
  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 XnaShooter.Game;
  using XnaShooter.Helpers;
  using XnaShooter.GameScreens;
  using XnaShooter.Sounds;
  using XnaShooter.Graphics;
  using XnaShooter.Properties;
  using Texture = XnaShooter.Graphics.Texture;
  using Model = XnaShooter.Graphics.Model;
  #endregion
  
  namespace XnaShooter
  {
  
<summary> XnaShooterGame main class </summary> public class XnaShooterGame : BaseGame { #region Variables <summary> Game screens stack. We can easily add and remove game screens and they follow the game logic automatically. Very cool. </summary> private Stack<IGameScreen> gameScreens = new Stack<IGameScreen>();

  
<summary> 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. </summary> public Texture mainMenuTexture = null, mouseCursorTexture = null;

  
<summary> 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. </summary> public Texture hudTopTexture = null, hudBottomTexture = null;

  
<summary> Background landscape models and ship models. </summary> public Model[] landscapeModels = null, shipModels = null, itemModels = null;

                  /*obs
  
<summary> Explosion texture, displayed when any ship is exploding. </summary> public AnimatedTexture explosionTexture = null;

  
                  #endregion
  
                  #region Constructor
  
<summary> Create your game </summary> public XnaShooterGame() { // 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; } // XnaShooterGame() #endregion

                  #region Initialize
  
<summary> Allows the game to perform any initialization it needs. </summary> 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");
  
                          // Load explosion effect
                          //explosionTexture = new AnimatedTexture("Destroy");
  
                          // Load background landscape and wall models
                          landscapeModels = new Model[]
                                  {
                                          new Model("BackgroundGround"),
                                          new Model("Building"),
                                          new Model("Building2"),
                                          new Model("Building3"),
                                          new Model("Building4"),
                                          new Model("Building5"),
                                          new Model("Kaktus"),
                                          new Model("Kaktus2"),
                                          new Model("KaktusBenny"),
                                          new Model("KaktusSeg"),
                                  };
                          shipModels = new Model[]
                                  {
                                          new Model("OwnShip"),
                                          new Model("Corvette"),
                                          new Model("SmallTransporter"),
                                          new Model("Firebird"),
                                          new Model("RocketFrigate"),
                                          new Model("Rocket"),
                                          new Model("Asteroid"),
                                  };
                          itemModels = new Model[]
                                  {
                                          new Model("ItemHealth"),
                                          new Model("ItemMg"),
                                          new Model("ItemGattling"),
                                          new Model("ItemPlasma"),
                                          new Model("ItemRockets"),
                                          new Model("ItemEmp"),
                                  };
  
                          // Create main menu screen
                          gameScreens.Push(new MainMenu());
                          // Start game
                          //gameScreens.Push(new Mission());
                          //inGame = true;
                          
                          // Start music
                          Sound.StartMusic();
                  } // Initialize()
                  #endregion
  
                  #region Dispose
                  protected override void Dispose(bool disposing)
                  {
                          base.Dispose(disposing);
                          if (disposing)
                                  GameSettings.Save();
                  } // Dispose(disposing)
                  #endregion
  
                  #region Toggle music on/off
  
<summary> Toggle music on off </summary> public void ToggleMusicOnOff() { if (GameSettings.Default.MusicOn) Sound.StopMusic(); else Sound.StartMusic(); } // ToggleMusicOnOff() #endregion

                  #region Add game screen
                  static bool inGame = false;
  
<summary> In game </summary> <returns>Bool</returns> public static bool InGame { get { return inGame; } // get } // InGame

  
<summary> Add game screen, which will be used until we quit it or add another game screen on top of it. </summary> <param name="newGameScreen">New game screen</param> public void AddGameScreen(IGameScreen newGameScreen) { gameScreens.Push(newGameScreen);

                          inGame = newGameScreen.GetType() == typeof(Mission);
                  } // AddGameScreen(newGameScreen)
                  #endregion
  
                  #region Remove current game screen
  
<summary> Remove current game screen </summary> public void RemoveCurrentGameScreen() { gameScreens.Pop();

                          inGame = gameScreens.Count > 0 &&
                                  gameScreens.Peek().GetType() == typeof(Mission);
                  } // RemoveCurrentGameScreen()
                  #endregion
  
                  #region Render menu background
  
<summary> Render menu background </summary> 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 button
  
<summary> Render button </summary> <param name="buttonType">Button type</param> <param name="rect">Rectangle</param> 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 ||
                                  Input.KeyboardEscapeJustPressed))
                                  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
  
<summary> Render mouse cursor </summary> 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
  
<summary> Allows the game to run logic such as updating the world, checking for collisions, gathering input and playing audio. </summary> <param name="gameTime">Provides a snapshot of timing values.</param> 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
  
<summary> This is called when the game should draw itself. </summary> <param name="gameTime">Provides a snapshot of timing values.</param> protected override void Draw(GameTime gameTime) { // Kill background (including z buffer, which is important for 3D) ClearBackground();

                          // Start post screen glow shader, will be shown in BaseGame.Draw
                          BaseGame.GlowShader.Start();
  
                          // Disable z buffer, mostly now only 2d content is rendered now.
                          //BaseGame.Device.RenderState.DepthBufferEnable = false;
  
  if !DEBUG
                          try
                          {
  endif
                                  // Execute the game screen on top.
                                  if (gameScreens.Count > 0)
                                          gameScreens.Peek().Run(this);
  if !DEBUG
                          } // try
                          catch (Exception ex)
                          {
                                  Log.Write("Failed to execute " + gameScreens.Peek().Name +
                                          "\nError: " + ex.ToString());
                          } // catch
  endif
  
                          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
          } // class XnaShooterGame
  } // namespace XnaShooter
  


(C) Æliens 20/2/2008

You may not copy or print any of this material without explicit permission of the author or the publisher. In case of other copyright issues, contact the author.