using System; using System.Collections.Generic; using System.Linq; using System.Text; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Graphics; using Microsoft.Xna.Framework.Input; using Microsoft.Xna.Framework.Content; namespace CarFire { /// /// A DeterministicGame object is a full XNA game, except that it does not /// extend the Microsoft.Xna.Framework.Game class. It supports content loading /// and unloading, as well as modified Update and Draw functionality. /// /// DeterministicGame objects are intented to be incorporated inside of an /// existing game. By simply calling update and draw at the appropriate times, /// and by supplying user inputs, the game will play just like any other game. /// /// It is intended that a DeterministicGame be a multiplayer game, and support for /// this is listed in the interface below. Each player is identified by a unique object /// reference (of the caller's choice, not a struct). The game supports the notion of a /// current 'frame', or state. The enclosing code supplies the user inputs for the /// next frame by calling methods. The enclosing code then should call the update /// method to advance the game to the next frame. Finally, the enclosing code /// calls the draw method to render the game state. Note that the game state can /// be drawn multiple times without updating the game, thus allowing the game /// to be paused or stalled. /// public interface IDeterministicGame { /// /// Call this method to give the game a chance to load its content. /// /// A valid content manager pointing to the root of the content tree void LoadContent (ContentManager contentManager); /// /// Call this method to give the game a chance to unload its content. /// void UnloadContent(); /// /// Returns the preferred screen size for this game. /// /// Vector2 PreferredScreenSize { get; } /// /// Returns the minimum number of players this game can support. /// /// the minimum player count int MinimumSupportedPlayers { get; } /// /// Returns the maximum number of players this game can support. /// /// the maximum player count int MaximumSupportedPlayers { get; } /// /// Call this method to reset the game state, to set the current frame at 0, and /// to supply identifiers for each player in the game. Player identifiers should /// be unique object references (not structs) that the caller will use later /// to identify each player. (It is important that these not be 'boxed' object /// references or the reference will not be preserved.) /// /// Since, in theory, there will be four copies of the game running, a second /// parameter identifies the player that is running this copy of the game. /// /// An array of objects (references) that will identify each player /// An object identifier for the player whose machine is displaying this game void ResetGame(Object[] playerIdentifiers, Object thisPlayer); /// /// Returns the current frame number. This corresponds to the current state /// of the game world. /// /// the current frame number long CurrentFrameNumber { get; } /// /// Returns a checksum of all of the game world state. This checksum can be used /// to ensure that multiple players at some frame all share the same state. It is /// guaranteed that identical states will produce identical checksums. /// /// the current game state checksum long CurrentChecksum { get; } /// /// Call this method to report changes in keypresses to the game. You should call this method /// to report any changes in keyboard state for a player. The keyboard state will be /// applied to the next game state (not the current state). /// /// An object (reference) that was registered for a player in the game /// A key identifier /// The key state - true means pressed, false means released void ApplyKeyInput (Object playerIdentifier, Keys key, bool isKeyPressed); /// /// Call this method to report changes in mouse locations to the game. You should call this method /// any time the mouse coordinates for a player changes. The mouse information will /// be applied to the next game state (not the current state). /// /// an object (reference) that was registered for a player in the game /// the mouse x location /// the mouse y location void ApplyMouseLocationInput (Object playerIdentifier, int x, int y); /// /// Call this method to report changes in mouse button state to the game. Note that only one /// mouse button is supported in game. You should call this method to report any /// changes in mouse button state for a player. The mouse button state will be /// applied to the next game state (not the current state). /// /// an object (reference) that was registered for a player in the game /// the mouse button state void ApplyMouseButtonInput (Object playerIdentifier, bool isButtonPressed); /// /// Returns true if the specified player's game is over. They can be safely disconnected from the game /// when this flag is true, their inputs do not affect game state. (You can continue to report inputs, /// to allow the player to view a game over screen, but no game state action is taken.) /// /// an object (reference) that was registered for a player in the game /// true if the game is over bool IsGameOver(Object playerIdentifier); /// /// Returns true if the specified player's game is over, and the player has clicked on something indicating /// they wish to leave the game over screen. (This only becomes true if inputs are reported /// even after the game is over.) /// /// an object (reference) that was registered for a player in the game /// true if the player has terminated the game bool IsTerminated(Object playerIdentifier); /// /// Call this method to advance the game state. Previously sent inputs are applied /// to the game state and the frame number is advanced and returned. Caution should be used when /// supplying the seconds parameter - it can affect game state. All players in a game /// should advance their game time by the same amount. /// /// The elapsed game time /// the frame number of the new game state (now the current state) long Update(TimeSpan timespan); /// /// Draws the current game state. This does not affect the game state - it may be called /// repeatedly to redraw the current game state if needed. /// /// a SpriteBatch object that has begun a batch /// the current game state frame number long Draw(SpriteBatch spriteBatch); } }