X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;ds=sidebyside;f=CarFire%2FCarFire%2FCarFire%2FGame.cs;h=38088419c59db8bebb2c20f097cbe56102e11f4c;hb=3ca5852a7df47d4129743ed449816c7c7347b699;hp=b1b723866dd838003522da855f9121f688c20eb0;hpb=f5b00f187579c137436bb023c5f4c71dbeb02847;p=chaz%2Fcarfire
diff --git a/CarFire/CarFire/CarFire/Game.cs b/CarFire/CarFire/CarFire/Game.cs
index b1b7238..3808841 100644
--- a/CarFire/CarFire/CarFire/Game.cs
+++ b/CarFire/CarFire/CarFire/Game.cs
@@ -9,191 +9,263 @@ using Microsoft.Xna.Framework.Input;
namespace CarFire
{
- // Everything in objects built from this class represent the critical game state
+ ///
+ /// Container class for the whole state of the game.
+ ///
public class GameState
{
- public long frameNumber;
+ #region Public Properties
- private long checksum;
- public long Checksum { get { return checksum; } }
+ public long FrameNumber { get { return mFrameNumber; } }
- public bool[] isGameOver;
- public bool[] isTerminated;
+ public long Checksum { get { return mChecksum; } }
- // Since this is not a game, I'll just keep track of the user inputs as the game state.
+ public int NumberOfPlayers { get { return mNumberOfPlayers; } }
- public int[] mouseLocationX;
- public int[] mouseLocationY;
- public bool[] mouseButton;
- public List[] keysDown;
- public int[] keypressCount;
+ public Map Map;
+ public List Entities = new List();
+ public List mProjectiles = new List();
+ public Player[] mCharacters = new Player[4];
+ public Display mDisplay;
- public long elapsedTime;
+ #endregion
- /* Constructor */
- public GameState()
- {
- frameNumber = 0;
- checksum = 0;
- isGameOver = new bool[4];
- isTerminated = new bool[4];
+ #region Public Methods
+
+ ///
+ /// Construct a game state container with the number of players.
+ ///
+ /// Number of players.
+ public GameState(int numPlayers)
+ {
+ mNumberOfPlayers = numPlayers;
+ mFrameNumber = 0;
- mouseLocationX = new int[4];
- mouseLocationY = new int[4];
- mouseButton = new bool[4];
- keysDown = new List[4];
- for (int i = 0; i < 4; i++)
- keysDown[i] = new List();
- keypressCount = new int[4];
+ mIsGameOver = new bool[numPlayers];
+ mIsTerminated = new bool[numPlayers];
- elapsedTime = 0;
+ mMouseLocation = new Point[numPlayers];
+ mMouseButton = new bool[numPlayers];
+ mKeysDown = new List[numPlayers];
+ for (int i = 0; i < numPlayers; i++) mKeysDown[i] = new List();
- checksum = 0;
+ mKeypressCount = new int[numPlayers];
+ mElapsedTime = 0;
+ mChecksum = 0;
}
- /* The game engine! */
- public void advanceFrame(NextInputs inputs, long milliseconds)
+
+ ///
+ /// Should be called by the Game class to advance the state
+ /// to the next frame.
+ ///
+ /// The inputs that occurred to be
+ /// applied this coming frame.
+ /// Milliseconds; used for the checksum.
+ public void AdvanceFrame(NextInputs inputs, long milliseconds)
{
- // Advance frame number
- frameNumber++;
-
- // Advance game - for the test harness, just record statistics and input states.
-
- elapsedTime += milliseconds;
+ mFrameNumber++;
+ mElapsedTime += milliseconds;
- for (int player = 0; player < 4; player++)
+ for (int player = 0; player < NumberOfPlayers; player++)
{
+ if (inputs.IsMousePressedChanged[player])
+ {
+ mMouseButton[player] = inputs.MousePressed[player];
+ }
- //if (isGameOver[player])
- // continue;
-
- if (inputs.mousePressedChanged[player])
- mouseButton[player] = inputs.mousePressed[player];
-
- if (inputs.mouseLocationChanged[player])
+ if (inputs.IsMouseLocationChanged[player])
{
- mouseLocationX[player] = inputs.mouseLocationX[player];
- mouseLocationY[player] = inputs.mouseLocationY[player];
+ mMouseLocation[player] = inputs.MouseLocation[player];
}
- foreach (Keys k in inputs.keysPressed[player])
- if (!keysDown[player].Contains(k))
+ foreach (Keys k in inputs.KeysPressed[player])
+ {
+ if (!mKeysDown[player].Contains(k))
{
- keysDown[player].Add(k);
- keypressCount[player]++;
+ mKeysDown[player].Add(k);
+ mKeypressCount[player]++;
}
+ }
- foreach (Keys k in inputs.keysReleased[player])
- keysDown[player].Remove(k);
-
- // If the mouse was pressed for a certain player, activate game over or terminated states as appropriate
+ foreach (Keys k in inputs.KeysReleased[player]) mKeysDown[player].Remove(k);
+ }
- if (inputs.mousePressed[player])
- for (int p = 0; p < 4; p++)
- {
- int x = 200 * p + 10;
- int y = 220;
-
- if (mouseLocationX[player] >= x && mouseLocationY[player] >= y &&
- mouseLocationX[player] < x + 25 && mouseLocationY[player] < y + 25)
- {
- isGameOver[p] = true;
- }
- y += 25;
- if (mouseLocationX[player] >= x && mouseLocationY[player] >= y &&
- mouseLocationX[player] < x + 25 && mouseLocationY[player] < y + 25)
- {
- isGameOver[p] = true;
- isTerminated[p] = true;
- }
- }
-
+ ComputeChecksum();
+ }
- }
- // Advance the checksum.
+ ///
+ /// Get the mouse location for a player.
+ ///
+ /// Player Number.
+ /// Mouse location.
+ public Point GetMouseLocation(int playerNum)
+ {
+ return mMouseLocation[playerNum];
+ }
- computeChecksum();
+ ///
+ /// Get the mouse button state for a player.
+ ///
+ /// Player number.
+ /// Mouse button state..
+ public bool GetMouseButton(int playerNum)
+ {
+ return mMouseButton[playerNum];
+ }
+ ///
+ /// Get the keyboard state for a player.
+ ///
+ /// Player number.
+ /// Keyboard state.
+ public List GetKeysDown(int playerNum)
+ {
+ return mKeysDown[playerNum];
}
- /* Just hash the values */
- private long computeChecksum()
+ #endregion
+
+
+ #region Private Methods
+
+ // Calculates a checksum for debugging network synchronization issues.
+ long ComputeChecksum()
{
- checksum += frameNumber;
- for (int i = 0; i < 4; i++)
+ mChecksum += FrameNumber;
+ for (int i = 0; i < NumberOfPlayers; i++)
{
- checksum = checksum + keypressCount[i];
- checksum = checksum * 3 + (isGameOver[i] ? 1 : 2);
- checksum = checksum * 3 + (isTerminated[i] ? 1 : 2);
- foreach (Keys k in keysDown[i])
- checksum = checksum * 257 + (int)k;
- checksum = checksum * 25789 + mouseLocationX[i] * 259 + mouseLocationY[i] + 375;
- checksum = checksum * 3 + (mouseButton[i] ? 1 : 2);
+ mChecksum = mChecksum + mKeypressCount[i];
+ mChecksum = mChecksum * 3 + (mIsGameOver[i] ? 1 : 2);
+ mChecksum = mChecksum * 3 + (mIsTerminated[i] ? 1 : 2);
+ foreach (Keys k in mKeysDown[i])
+ mChecksum = mChecksum * 257 + (int)k;
+ mChecksum = mChecksum * 25789 + mMouseLocation[i].X * 259 + mMouseLocation[i].Y + 375;
+ mChecksum = mChecksum * 3 + (mMouseButton[i] ? 1 : 2);
}
- checksum += elapsedTime;
+ mChecksum += mElapsedTime;
- return checksum;
+ return mChecksum;
}
+
+ #endregion
+
+
+ #region Private Variables
+
+ int mNumberOfPlayers;
+ public Point[] mMouseLocation;
+ public bool[] mMouseButton;
+ public List[] mKeysDown;
+
+ long mFrameNumber;
+
+ bool[] mIsGameOver;
+ bool[] mIsTerminated;
+
+ int[] mKeypressCount;
+ long mElapsedTime;
+ long mChecksum;
+
+ #endregion
}
- //code from Prof Jensen's TestHarness
- // This class encapsulates inputs from the players.
+
+ ///
+ /// Container class for all the inputs for a single frame.
+ ///
public class NextInputs
{
- public List[] keysPressed;
- public List[] keysReleased;
- public int[] mouseLocationX;
- public int[] mouseLocationY;
- public bool[] mouseLocationChanged;
- public bool[] mousePressed;
- public bool[] mousePressedChanged;
-
- public NextInputs()
+ public List[] KeysPressed;
+ public List[] KeysReleased;
+ public Point[] MouseLocation;
+ public bool[] IsMouseLocationChanged;
+ public bool[] MousePressed;
+ public bool[] IsMousePressedChanged;
+
+ public NextInputs(int numPlayers)
{
- keysPressed = new List[4];
- keysReleased = new List[4];
- mouseLocationX = new int[4];
- mouseLocationY = new int[4];
- mouseLocationChanged = new bool[4];
- mousePressed = new bool[4];
- mousePressedChanged = new bool[4];
- for (int i = 0; i < 4; i++)
- keysPressed[i] = new List();
- for (int i = 0; i < 4; i++)
- keysReleased[i] = new List();
+ KeysPressed = new List[numPlayers];
+ KeysReleased = new List[numPlayers];
+ IsMouseLocationChanged = new bool[numPlayers];
+ MousePressed = new bool[numPlayers];
+ IsMousePressedChanged = new bool[numPlayers];
+ for (int i = 0; i < numPlayers; i++) KeysPressed[i] = new List();
+ for (int i = 0; i < numPlayers; i++) KeysReleased[i] = new List();
}
-
}
+
+ ///
+ /// The big kahuna.
+ ///
public class Game : IDeterministicGame
{
- #region IDeterministicGame Members
- List mPlayers;
- NextInputs inputs;
- Object[] playerIdentifiers;
- Display mDisplay;
- Map mMap;
+ #region Public Properties
+
+ ///
+ /// Get the content manager associated with this game.
+ ///
+ public ContentManager ContentManager { get { return mContentManager; } }
- GameState state;
- int thisPlayerID;
+ ///
+ /// Get the state.
+ ///
+ public GameState State;
+
+ public bool[,] Grid
+ {
+ get
+ {
+ bool[,] grid = State.Map.Grid;
+ foreach (IEntity entity in State.Entities)
+ {
+ Point coordinates = entity.Coordinates;
+ grid[coordinates.X, coordinates.Y] = true;
+ }
+ return grid;
+ }
+ }
+
+ #endregion
+
+
+ #region Public Methods
+ public bool IsCellOpen(Point point)
+ {
+ if (!State.Map.IsCellOpen(point)) return false;
+ foreach (IEntity entity in State.Entities)
+ {
+ if (entity.Coordinates == point) return false;
+ }
+ return true;
+ }
public Game()
{
- mDisplay = new Display();
- mPlayers = new List();
- playerIdentifiers = new Object[4];
+
+ }
+ ///
+ /// This method should be called whenever the players want to move to a new map.
+ /// Not implemented yet. Need some way to get next map.
+ ///
+ public void startNewMap()
+ {
+ //TODO somehow get next map
+ State.Entities.Clear();
+ //State.Map = State.Map.getNextMap();
+ for (int i = 0; i < State.mCharacters.Length; i++)
+ {
+ State.mCharacters[i].Coordinates = State.Map.GetStartingPositionForPlayer(i + 1);
+ }
+ State.Entities = State.Map.GetAllEntities(this);
}
public void LoadContent(ContentManager contentManager)
{
- //Texture2D everything = contentManager.Load("default");
- mDisplay.LoadContent(contentManager);
- int currentCenterX = 5; //Creates a map like the one in Display
- int currentCenterY = 5;
- mMap = contentManager.Load