// Project: XnaShooter, File: Mission.cs
// Namespace: XnaShooter.GameScreens, Class: Mission
// Path: C:\code\XnaShooter\GameScreens, Author: Abi
// Code lines: 46, Size of file: 857 Bytes
// Creation date: 01.11.2005 23:55
// Last modified: 08.12.2005 16:14
// Generated with Commenter by abi.exDream.com
#region Using directives
using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using XnaShooter.Graphics;
using XnaShooter.Helpers;
using XnaShooter.Game;
using XnaShooter.Sounds;
using Texture = XnaShooter.Graphics.Texture;
using Model = XnaShooter.Graphics.Model;
using XnaShooter.Shaders;
#endregion
namespace XnaShooter.GameScreens
{
///
/// Mission, just manages the on screen display for the game.
/// Controlling is done in SpaceCamera class.
/// Most graphical stuff is done in AsteroidManager.
///
public class Mission : IGameScreen
{
#region Variables
///
/// Link to game.hudTexture and inGameTexture, the texture itself is not
/// loaded here, but in the main game. This are just references.
///
private Texture hudTopTexture, hudBottomTexture;
///
/// Background model for the landscape ground and all objects
/// we render on it.
///
internal Model[] landscapeModels = null,
shipModels = null,
itemModels = null;
///
/// Landscape model size for rendering.
///
float[] LandscapeModelSize = new float[]
{
// LandscapeGround,
100,
// Building1,
12,//25,
// Building2,
11,//35,
// Building3,
11,//20,
// Building4,
11,//25,
// Building5,
12,//30,
// Kaktus1,
3.5f,//4,
// Kaktus2,
3.5f,//3,
// Kaktus3,
4.0f,//4,
// Kaktus4,
4.5f,//5,
};
///
/// Number of landscape models
///
const int NumOfLandscapeModels = 10;
///
/// Model size for all items.
///
internal const float ItemModelSize = 2.5f;
///
/// Landscape model size for rendering.
///
internal static readonly float[] ShipModelSize = new float[]
{
// OwnShip
5,
// Corvette
5,
// SmallTransporter
4,
// Firebird
7,
// RocketFrigate
13,
// Rocket
1.25f,
// Asteroid
3.4f,
};
///
/// All ships z height
///
public const float AllShipsZHeight = 5;
///
/// Ship model types
///
internal enum ShipModelTypes
{
OwnShip,
Corvette,
SmallTransporter,
Firebird,
RocketFrigate,
Rocket,
Asteroid,
} // enum ShipModelTypes
///
/// Matrix and number for landscape objects
///
class MatrixAndNumber
{
public Matrix renderMatrix;
public int number;
public MatrixAndNumber(Matrix setMatrix, int setNumber)
{
renderMatrix = setMatrix;
number = setNumber;
} // MatrixAndNumber(setMatrix, setNumber)
} // class MatrixAndNumber
///
/// Only keep lists of this and the next segment landscape objects.
///
List
thisLandscapeSegmentObjects = new List(),
nextLandscapeSegmentObjects = new List();
///
/// Generated landscape segment number for objects.
///
int generatedLandscapeSegmentNumber = 0;
///
/// Max. number of objects we generate each segment
///
const int MaxNumberOfObjectsGeneratedEachSegment = 24;
///
/// Segment length
///
public const float SegmentLength = 122,// 122.12f,
ViewDistance = 70,
GroundZValue = -16,
LookAheadYValue = 40;
///
/// Look at position.
///
static Vector3 lookAtPosition = new Vector3(0, 0, -16);
///
/// Look at position.
///
public static Vector3 LookAtPosition
{
get
{
return lookAtPosition;
} // get
} // LookAtPosition
#endregion
#region Units
///
/// Current enemy units.
///
internal static List units = new List();
///
/// Add unit
///
/// Unit
/// Pos
public static void AddEnemyUnit(
Unit.UnitTypes unitType, Vector2 position,
Unit.MovementPattern movementAI)
{
units.Add(new Unit(unitType, position, movementAI));
} // AddWeaponProjectile(weaponType, position, direction)
///
/// Render enemy units
///
private void RenderEnemyUnits()
{
for (int num = 0; num < units.Count; num++)
{
// Remove this enemy unit if it died
if (units[num].Render(this))
{
// If this is a transporter or rocket frigate,
// create an item here in 25% of the time we kill such a unit.
if ((units[num].unitType == Unit.UnitTypes.SmallTransporter ||
units[num].unitType == Unit.UnitTypes.RocketFrigate) &&
RandomHelper.GetRandomInt(
// Create more items if we only have the MG
Player.currentWeapon == Player.WeaponTypes.MG ? 2 : 4) == 0)
AddItem((Item.ItemTypes)RandomHelper.GetRandomInt(6),
units[num].position);
units.RemoveAt(num);
num--;
} // if
} // for
} // RenderEnemyUnits()
#endregion
#region Items
///
/// Items.
///
internal static List- items = new List
- ();
///
/// Add item
///
/// Item
/// Pos
public static void AddItem(
Item.ItemTypes itemType, Vector2 position)
{
// Don't create a item we currently have as our weapon
if (itemType == Item.ItemTypes.Mg &&
Player.currentWeapon == Player.WeaponTypes.MG ||
itemType == Item.ItemTypes.Gattling &&
Player.currentWeapon == Player.WeaponTypes.Gattling ||
itemType == Item.ItemTypes.Plasma &&
Player.currentWeapon == Player.WeaponTypes.Plasma ||
itemType == Item.ItemTypes.Rockets &&
Player.currentWeapon == Player.WeaponTypes.Rockets)
{
if (Player.health < 0.75f)
itemType = Item.ItemTypes.Health;
else if (Player.empBombs < 3)
itemType = Item.ItemTypes.Emp;
else
itemType = (Item.ItemTypes)(((int)itemType + 1) % 6);
} // if
// Always give health item if health is low.
if (Player.health < 0.25f)
itemType = Item.ItemTypes.Health;
items.Add(new Item(itemType, position));
} // AddItem(itemType, position)
///
/// Render items
///
private void RenderItems()
{
for (int num = 0; num < items.Count; num++)
{
// Remove items if we are done
if (items[num].Render(this))
{
items.RemoveAt(num);
num--;
} // if
} // for
} // RenderItems()
#endregion
#region Weapon projectiles
///
/// Current weapon projectiles.
///
static List weaponProjectiles = new List();
///
/// Add weapon projectile
///
/// Weapon
/// Pos
/// True for player, false for enemy
public static void AddWeaponProjectile(
Projectile.WeaponTypes weaponType, Vector3 position,
bool ownProjectile)
{
weaponProjectiles.Add(
new Projectile(weaponType, position, ownProjectile));
} // AddWeaponProjectile(weaponType, position, direction)
///
/// Render weapon projectiles
///
private void RenderWeaponProjectiles()
{
for (int num = 0; num < weaponProjectiles.Count; num++)
{
// Remove weapon projectile if we are done
if (weaponProjectiles[num].Render(this))
{
weaponProjectiles.RemoveAt(num);
num--;
} // if
} // for
} // RenderWeaponProjectiles()
#endregion
#region Properties
///
/// Name of this game screen
///
/// String
public string Name
{
get
{
return "Mission";
} // get
} // Name
private bool quit = false;
///
/// Returns true if we want to quit this screen and return to the
/// previous screen. If no more screens are left the game is exited.
///
/// Bool
public bool Quit
{
get
{
return quit;
} // get
} // Quit
#endregion
#region Constructor
///
/// Create mission
///
public Mission()
{
Player.Reset();
thisLandscapeSegmentObjects = GenerateLandscapeSegment(0);
nextLandscapeSegmentObjects = GenerateLandscapeSegment(1);
} // Mission()
#endregion
#region Generate landscape segment
///
/// Generate landscape segment
///
/// Segment number
private List GenerateLandscapeSegment(int segmentNumber)
{
#region Generate enemy units
int numOfNewEnemies = 8 + RandomHelper.GetRandomInt(segmentNumber / 2);//3);
if (segmentNumber == 0)
numOfNewEnemies = 0;
// Finished level?
if (segmentNumber > 60)
{
Player.victory = true;
Sound.PlayVictorySound();
Player.SetGameOverAndUploadHighscore();
} // if
else
{
for (int num = 0; num < numOfNewEnemies; num++)
{
AddEnemyUnit((Unit.UnitTypes)
(segmentNumber < 3 ? RandomHelper.GetRandomInt(2) :
segmentNumber < 7 ? RandomHelper.GetRandomInt(3) :
segmentNumber < 11 ? RandomHelper.GetRandomInt(4) :
segmentNumber < 21 ? RandomHelper.GetRandomInt(5) :
segmentNumber < 35 ? 1 + RandomHelper.GetRandomInt(4) :
2 + RandomHelper.GetRandomInt(3)),
new Vector2(RandomHelper.GetRandomFloat(-20, +20),
segmentNumber * SegmentLength +
RandomHelper.GetRandomFloat(-SegmentLength / 2, 3*SegmentLength / 2)),
(Unit.MovementPattern)
RandomHelper.GetRandomInt(Unit.NumOfMovementPatterns));
} // for
} // else
#endregion
#region Generate random landscape objects on the ground
generatedLandscapeSegmentNumber = segmentNumber;
List ret = new List();
int numOfNewObjects = RandomHelper.GetRandomInt(
MaxNumberOfObjectsGeneratedEachSegment);
if (numOfNewObjects < 8)
numOfNewObjects = 8;
for (int num = 0; num < numOfNewObjects; num++)
{
int type = 1+RandomHelper.GetRandomInt(NumOfLandscapeModels-1);
// Create buildings only left and right
if (type <= 5)
{
int rotSimple = RandomHelper.GetRandomInt(4);
float rot = rotSimple == 0 ? 0 :
rotSimple == 1 ? MathHelper.PiOver2 :
rotSimple == 1 ? MathHelper.Pi : MathHelper.PiOver2 * 3;
bool side = RandomHelper.GetRandomInt(2) == 0;
float yPos = segmentNumber * SegmentLength + 0.94f *
RandomHelper.GetRandomFloat(-SegmentLength / 2, SegmentLength / 2);
Vector3 pos = new Vector3(side ? -18 : +18, yPos, -16);
// Do we have this position already?
bool tooClose = false;
int tries = 10;
do
{
tooClose = false;
foreach (MatrixAndNumber obj in ret)
if (Vector3.Distance(obj.renderMatrix.Translation, pos) < 16)
tooClose = true;
if (tooClose)
{
yPos = segmentNumber * SegmentLength + 0.92f *
RandomHelper.GetRandomFloat(-SegmentLength / 2, SegmentLength / 2);
side = RandomHelper.GetRandomInt(2) == 0;
pos = new Vector3(side ? -18 : +18, yPos, -15);
} // if
} while (tooClose && tries-- > 0);
// Add very little height to each object to avoid same height
// if buildings collide into each other.
pos += new Vector3(0, 0, 0.001f * num);
ret.Add(new MatrixAndNumber(
Matrix.CreateScale(LandscapeModelSize[type]) *
Matrix.CreateRotationZ(rot) *
Matrix.CreateTranslation(pos),
type));
} // if
else
{
ret.Add(new MatrixAndNumber(
Matrix.CreateScale(LandscapeModelSize[type]) *
Matrix.CreateRotationZ(
RandomHelper.GetRandomFloat(0, MathHelper.Pi * 2)) *
Matrix.CreateTranslation(new Vector3(
RandomHelper.GetRandomFloat(-20, +20),
segmentNumber * SegmentLength +
RandomHelper.GetRandomFloat(-SegmentLength / 2, SegmentLength / 2),
-15)),
type));
} // else
} // for
#endregion
return ret;
} // GenerateLandscapeSegment(segmentNumber)
#endregion
#region Render level background
///
/// Helper structure to keep models and matrices for rendering in a list.
///
internal struct ModelAndMatrix
{
public Model model;
public Matrix matrix;
} // struct ModelAndMatrix
///
/// Max. number of models we can render each frame. We got between 20 and
/// 50 landscape objects (ground+objects), and usually between 5 and 20
/// ships on the screen. This list should be sufficiant for most scenes,
/// if we got more than 100 models a few landscape objects might be
/// skipped (they are rendered at last).
///
const int MaxNumberOfModelsToRender = 100;
///
/// List of all models we have to render this frame. The main reason
/// for this list is maintainability because we have to render everything
/// 3 times: Once for shadow map generation, once for receiving shadows
/// and finally on the screen.
/// The list is created only once and is reused, dynamic lists and foreach
/// would be too slow on the Xbox 360.
///
internal ModelAndMatrix[] modelsToRender =
new ModelAndMatrix[MaxNumberOfModelsToRender];
///
/// Keep track on how many models we currently have in our list. If this
/// reaches MaxNumberOfModelsToRender no more new objects are added.
///
internal int numOfModelsToRender = 0;
///
/// Helper method to simply add a new model for rendering.
///
/// Model
/// Render Matrix
internal void AddModelToRender(Model setModel, Matrix renderMatrix)
{
if (numOfModelsToRender >= MaxNumberOfModelsToRender)
return;
modelsToRender[numOfModelsToRender].model = setModel;
modelsToRender[numOfModelsToRender].matrix = renderMatrix;
numOfModelsToRender++;
} // AddModelToRender(setModel, renderMatrix)
///
/// Render level background
///
public void RenderLevelBackground(float levelPosition)
{
#if DEBUG
// Landscape or unit ship models not initialized yet?
// Can happen in certain unit tests, initialize them for us!
if (landscapeModels == null)
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"),
};
if (shipModels == null)
shipModels = new Model[]
{
new Model("OwnShip"),
new Model("Corvette"),
new Model("SmallTransporter"),
new Model("Firebird"),
new Model("RocketFrigate"),
new Model("Rocket"),
new Model("Asteroid"),
};
if (itemModels == null)
itemModels = new Model[]
{
new Model("ItemMg"),
new Model("ItemGattling"),
new Model("ItemPlasma"),
new Model("ItemRockets"),
new Model("ItemEmp"),
};
#endif
#region Update camera
// Construct camera position, it will just move up.
Vector3 cameraPosition = new Vector3(0, levelPosition, ViewDistance);
// For widescreen look closer to the ground, else it does not fit on the screen
if ((float)BaseGame.Width / (float)BaseGame.Height >= 1.5f)
{
cameraPosition.Z -= 10;
cameraPosition.Y -= 2;
} // if
lookAtPosition = new Vector3(0, levelPosition + LookAheadYValue, GroundZValue);
BaseGame.ViewMatrix = Matrix.CreateLookAt(
cameraPosition,
lookAtPosition,
new Vector3(0, 1, 0));
if (Player.GameOver)
{
cameraPosition += new Vector3(0, 0, -20) +
Vector3.TransformNormal(new Vector3(30, 0, 0),
Matrix.CreateRotationZ(BaseGame.TotalTimeMs / 2593.0f));
BaseGame.ViewMatrix = Matrix.CreateLookAt(
cameraPosition,
lookAtPosition,
new Vector3(0, 1, 0));
} // if
#endregion
#region Update landscape position
// Show current landscape block and the next one with a wall
// segment between them. We usually just see one block.
int blockPosition = (int)((levelPosition + LookAheadYValue) / SegmentLength);
if (blockPosition + 1 != generatedLandscapeSegmentNumber)
{
// Copy over last objects
thisLandscapeSegmentObjects = nextLandscapeSegmentObjects;
nextLandscapeSegmentObjects =
GenerateLandscapeSegment(blockPosition + 1);
} // if
#endregion
#region Prepare rendering
Vector3 levelVector = new Vector3(0, levelPosition + LookAheadYValue - 5, 0);
// Start new list
numOfModelsToRender = 0;
#endregion
#region Render landscape
Model landscapeModel = landscapeModels[(int)0];
Matrix landscapeScaleMatrix = Matrix.CreateScale(
LandscapeModelSize[(int)0]);
AddModelToRender(landscapeModel, landscapeScaleMatrix *
Matrix.CreateTranslation(
new Vector3(0, blockPosition * SegmentLength, 0)));
AddModelToRender(landscapeModel, landscapeScaleMatrix *
Matrix.CreateTranslation(
new Vector3(0, blockPosition * SegmentLength + SegmentLength, 0)));
#endregion
#region Render ships
Player.shipPos =
new Vector3(Player.position, AllShipsZHeight) + levelVector;
AddModelToRender(
shipModels[(int)ShipModelTypes.OwnShip],
Matrix.CreateScale(ShipModelSize[(int)ShipModelTypes.OwnShip]) *
Matrix.CreateRotationZ(MathHelper.Pi) *
Matrix.CreateRotationX(Player.shipRotation.Y) *
Matrix.CreateRotationY(Player.shipRotation.X) *
Matrix.CreateTranslation(Player.shipPos));
// Add smoke effects for our ship
EffectManager.AddRocketOrShipFlareAndSmoke(
Player.shipPos + new Vector3(-0.3f, -2.65f, +0.35f), 1.35f,
5 * Player.MovementSpeedPerSecond);
EffectManager.AddRocketOrShipFlareAndSmoke(
Player.shipPos + new Vector3(0.3f, -2.65f, +0.35f), 1.35f,
5 * Player.MovementSpeedPerSecond);
// Render enemy units and all weapon projectiles
RenderEnemyUnits();
RenderWeaponProjectiles();
RenderItems();
#endregion
#region Render landscape objects
// Show all landscape models
// Note: Avoid foreach to optimize performance on Xbox 360!
for (int num = 0; num < thisLandscapeSegmentObjects.Count; num++)
{
MatrixAndNumber obj = thisLandscapeSegmentObjects[num];
AddModelToRender(landscapeModels[obj.number], obj.renderMatrix);
} // for
for (int num = 0; num < nextLandscapeSegmentObjects.Count; num++)
{
MatrixAndNumber obj = nextLandscapeSegmentObjects[num];
AddModelToRender(landscapeModels[obj.number], obj.renderMatrix);
} // for
#endregion
#region Render all and add shadows
#region Generate shadows
// Generate shadows
ShaderEffect.shadowMapping.GenerateShadows(
delegate
{
// Generate shadows for all models except the first two (landscape)
for (int num = 2; num < numOfModelsToRender; num++)
modelsToRender[num].model.GenerateShadow(
modelsToRender[num].matrix);
});
// Render shadows
ShaderEffect.shadowMapping.RenderShadows(
delegate
{
// Show and render shadows for all models including the landscape
for (int num = 0; num < numOfModelsToRender; num++)
modelsToRender[num].model.UseShadow(
modelsToRender[num].matrix);
});
#endregion
#region Render normally
// Time to render all models the normal way (with normal mapping)
for (int num = 0; num < numOfModelsToRender; num++)
modelsToRender[num].model.Render(
modelsToRender[num].matrix);
// And finally bring everything on the screen
BaseGame.MeshRenderManager.Render();
#endregion
#region Show shadows
ShaderEffect.shadowMapping.ShowShadows();
#endregion
#endregion
} // RenderLevelBackground()
#endregion
#region Render hud
private void RenderHud()
{
Rectangle rect =
BaseGame.CalcRectangleKeep4To3(hudTopTexture.GfxRectangle);
#if XBOX360
// Make it 7% smaller!
rect.X = (int)(rect.X + BaseGame.Width * 0.035f);
rect.Y = (int)(rect.Y + BaseGame.Height * 0.035f);
rect.Width = (int)(rect.Width * 0.93f);
//rect.Height = (int)(rect.Height * 0.93f);
#endif
// Render top hud part
hudTopTexture.RenderOnScreen(
rect, hudTopTexture.GfxRectangle);
// Time
BaseGame.NumbersFont.WriteTime(
rect.X + (int)(73 * rect.Width / 1024.0f),
rect.Y + BaseGame.YToRes(8),
(int)Player.gameTimeMs);
// Score
BaseGame.NumbersFont.WriteNumberCentered(
rect.X + (int)(485 * rect.Width / 1024.0f),
rect.Y + BaseGame.YToRes(8),
Player.score);
// Highscore
BaseGame.NumbersFont.WriteNumberCentered(
rect.X + (int)(920 * rect.Width / 1024.0f),
rect.Y + BaseGame.YToRes(8),
Highscores.TopHighscore);
// Render bottom hud part
Rectangle bottomHudGfxRect = new Rectangle(0, 25, 1024, 39);
rect = BaseGame.CalcRectangleKeep4To3(bottomHudGfxRect);
rect.Y = BaseGame.YToRes(768-40);
#if XBOX360
// Make it 10% smaller!
rect.X = (int)(rect.X + BaseGame.Width * 0.035f);
rect.Y = (int)(rect.Y - BaseGame.Height * 0.035f);
rect.Width = (int)(rect.Width * 0.93f);
//rect.Height = (int)(rect.Height * 0.93f);
#endif
hudBottomTexture.RenderOnScreen(
rect, bottomHudGfxRect);
// Health
//tst: Player.health = 0.35f;
Rectangle healthGfxRect = new Rectangle(50, 0, 361, 24);
healthGfxRect = new Rectangle(healthGfxRect.X, healthGfxRect.Y,
(int)(healthGfxRect.Width * Player.health), healthGfxRect.Height);
hudBottomTexture.RenderOnScreen(
//Relative4To3(50, 768 - 31,
new Rectangle(
rect.X + (int)(50 * rect.Width / 1024.0f),
rect.Bottom - BaseGame.YToRes(31),
(int)(healthGfxRect.Width * rect.Width / 1024.0f),
BaseGame.YToRes(24)),
healthGfxRect);
// Weapon and Emps!
Rectangle weaponMgGfxRect = new Rectangle(876, 0, 31, 24);
Rectangle weaponGattlingGfxRect = new Rectangle(909, 0, 27, 24);
Rectangle weaponPlasmaGfxRect = new Rectangle(939, 0, 33, 24);
Rectangle weaponRocketsGfxRect = new Rectangle(975, 0, 24, 24);
Rectangle weaponEmpGfxRect = new Rectangle(1001, 0, 23, 24);
int xPos = rect.X + (int)(608 * rect.Width / 1024.0f);
int yPos = rect.Bottom - BaseGame.YToRes(20) -
TextureFont.Height / 3;
TextureFont.WriteText(xPos, yPos, "Weapon: ");
// Show weapon icon!
Rectangle weaponRect =
Player.currentWeapon == Player.WeaponTypes.MG ? weaponMgGfxRect :
Player.currentWeapon == Player.WeaponTypes.Gattling ? weaponGattlingGfxRect :
Player.currentWeapon == Player.WeaponTypes.Plasma ? weaponPlasmaGfxRect :
weaponRocketsGfxRect;
hudBottomTexture.RenderOnScreen(
new Rectangle(
rect.X + (int)(704 * rect.Width / 1024.0f),
rect.Bottom - BaseGame.YToRes(30),
(int)((weaponRect.Width-2) * rect.Width / 1024.0f),
BaseGame.YToRes(weaponRect.Height-2)),
weaponRect);
// And weapon name
xPos += BaseGame.XToRes(735 - 606);
TextureFont.WriteText(xPos, yPos, Player.currentWeapon.ToString());
xPos += BaseGame.XToRes(858 - 747);
TextureFont.WriteText(xPos, yPos, "EMPs: ");
// Show emp icons if we have any
//tst:Player.empBombs = 3;
xPos = rect.Right - BaseGame.XToRes(1024 - 916);
yPos = rect.Y + BaseGame.YToRes(8);// (int)((768 - 31) * rect.Height / 768.0f);
for (int num = 0; num < Player.empBombs; num++)
hudBottomTexture.RenderOnScreen(
new Rectangle(xPos+BaseGame.XToRes(24*num), yPos,
BaseGame.XToRes(weaponEmpGfxRect.Width),
BaseGame.XToRes(weaponEmpGfxRect.Height)),
weaponEmpGfxRect);
} // RenderHud()
#endregion
#region Run
///
/// Run game screen. Called each frame.
///
/// Form for access to asteroid manager and co
public void Run(XnaShooterGame game)
{
// Make sure the textures and models are linked correctly
hudTopTexture = game.hudTopTexture;
hudBottomTexture = game.hudBottomTexture;
landscapeModels = game.landscapeModels;
shipModels = game.shipModels;
itemModels = game.itemModels;
// Render landscape, ships and neutral objects
RenderLevelBackground(
//tst: 30+
Player.gameTimeMs / 64.0f);//66.0f);//33.0f);
// Handle game logic, move player around, weapons, collisions, etc.
Player.HandleGameLogic(this);
// Handle effect stuff
BaseGame.effectManager.HandleAllEffects();
// Render hud on top of 3d stuff
RenderHud();
// End game if escape was pressed or game is over and space or mouse
// button was pressed.
if (Input.KeyboardEscapeJustPressed ||
Input.GamePadBackJustPressed ||
(Player.GameOver &&
(Input.KeyboardSpaceJustPressed ||
Input.GamePadAJustPressed ||
Input.GamePadBJustPressed ||
Input.GamePadXJustPressed ||
Input.GamePadXJustPressed ||
Input.MouseLeftButtonJustPressed)))
{
// Upload new highscore (as we currently are in game,
// no bonus or anything will be added, this score is low!)
Player.SetGameOverAndUploadHighscore();
// Reset camera to origin and notify we are not longer in game mode
XnaShooterGame.camera.SetPosition(Vector3.Zero);
// Quit to the main menu
quit = true;
} // if
} // Run(game)
#endregion
#region Unit Testing
#if DEBUG
///
/// Test render level background with landscape objects.
///
public static void TestRenderLevelBackground()
{
Mission dummyMission = null;
TestGame.Start("TestRenderLevelBackground",
delegate
{
dummyMission = new Mission();
},
delegate
{
dummyMission.RenderLevelBackground(
BaseGame.TotalTimeMs / 33.0f);
});
} // TestRenderLevelBackground()
///
/// Test hud
///
public static void TestHud()
{
Mission dummyMission = null;
TestGame.Start("TestHud",
delegate
{
dummyMission = new Mission();
dummyMission.hudTopTexture = new Texture("HudTop");
dummyMission.hudBottomTexture = new Texture("HudBottom");
},
delegate
{
dummyMission.RenderLevelBackground(
BaseGame.TotalTimeMs / 33.0f);
dummyMission.RenderHud();
});
} // TestHud()
#endif
#endregion
} // class Mission
} // namespace XnaShooter.GameScreens