X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;ds=sidebyside;f=CarFire%2FCarFire%2FCarFire%2FSaberMonster.cs;h=a3507c87f6006642655594aaa009555cbc283f1c;hb=60d05271b295d2ca94a0028059add525c1bbffb1;hp=06fd1272adbbc58deeaf14908805374b43f98666;hpb=af9deb873b24dadd0d509ce199fc6cac2b3efbc9;p=chaz%2Fcarfire
diff --git a/CarFire/CarFire/CarFire/SaberMonster.cs b/CarFire/CarFire/CarFire/SaberMonster.cs
index 06fd127..a3507c8 100644
--- a/CarFire/CarFire/CarFire/SaberMonster.cs
+++ b/CarFire/CarFire/CarFire/SaberMonster.cs
@@ -8,6 +8,9 @@ using Microsoft.Xna.Framework.Graphics;
namespace CarFire
{
+ ///
+ /// A type for the states of an artificually intelligent entity.
+ ///
public enum AiState
{
Standing,
@@ -19,14 +22,33 @@ namespace CarFire
}
+ ///
+ /// An example monster. This can serve as a starting place for
+ /// creating other monsters. This one just follows a path.
+ ///
public class SaberMonster : IMonster
{
+ //starting health
+ int health = 100;
+ ///
+ /// Construct this type of monster. This constructor is called
+ /// by the map when the game requests entities.
+ ///
+ /// The single character ID.
+ /// The initial position on the map.
+ /// More parameters.
+ /// The game object reference.
public SaberMonster(char identifier, Point position, Dictionary info, Game game)
{
mId = identifier;
mMotion = new MovementManager(position);
+
+ // We need to keep the game reference in order to get the grid when we
+ // need to find paths.
mGame = game;
+ // Get the speed of the monster. If not set in the map, it defaults to
+ // whatever the default of MovementManager is... 1 I think.
string speedString;
if (info.TryGetValue("speed", out speedString))
{
@@ -46,10 +68,16 @@ namespace CarFire
}
}
+ // Start doing something...
StartPacing();
}
+ ///
+ /// Call this to switch the monster AI state to pacing and set up
+ /// the initial paths. The monster will start following the path it
+ /// was defined with in the map file.
+ ///
public void StartPacing()
{
mState = AiState.Pacing;
@@ -57,6 +85,7 @@ namespace CarFire
if (mIdlePath.Count == 0) return;
// Determine the best (closest) waypoint to start at.
+ // We may not be on the path, so we have to walk to get on it.
mIdlePathIndex = 0;
int closest = int.MaxValue;
for (int i = 0; i < mIdlePath.Count; i++)
@@ -69,11 +98,16 @@ namespace CarFire
}
}
+ // Find the path to get to the closest waypoint.
PathFinder pathFinder = new PathFinder(mGame.Grid);
mPath = new List(32);
mPath.Add(Coordinates);
- mPath.AddRange(pathFinder.GetPath(mMotion.Coordinates, mIdlePath[mIdlePathIndex]));
- mPath.Add(mIdlePath[mIdlePathIndex]);
+ List path = pathFinder.GetPath(mMotion.Coordinates, mIdlePath[mIdlePathIndex]);
+ if (path != null)
+ {
+ mPath.AddRange(path);
+ mPath.Add(mIdlePath[mIdlePathIndex]);
+ }
mPathIndex = 0;
}
@@ -81,15 +115,24 @@ namespace CarFire
{
if (mPathIndex >= mPath.Count)
{
+ // We're done with the current path, so find the path to
+ // the next waypoint... forever.
mIdlePathIndex++;
PathFinder pathFinder = new PathFinder(mGame.Grid);
mPath = new List(32);
mPath.Add(Coordinates);
- mPath.AddRange(pathFinder.GetPath(mMotion.Coordinates, mIdlePath[mIdlePathIndex % mIdlePath.Count]));
- mPath.Add(mIdlePath[mIdlePathIndex % mIdlePath.Count]);
+ List path = pathFinder.GetPath(mMotion.Coordinates, mIdlePath[mIdlePathIndex % mIdlePath.Count]);
+ if (path != null)
+ {
+ mPath.AddRange(path);
+ mPath.Add(mIdlePath[mIdlePathIndex % mIdlePath.Count]);
+ }
mPathIndex = 0;
}
+ // We need to make sure out direction is set to the next cell
+ // we want to be. If our current coordinates match that, we need
+ // to change our direction to get to the next cell.
if (mPath[mPathIndex % mPath.Count] == mMotion.Coordinates)
{
mPathIndex++;
@@ -102,6 +145,9 @@ namespace CarFire
#region IMonster Members
+ ///
+ /// I don't know what this is for.
+ ///
public bool visible
{
get { throw new NotImplementedException(); }
@@ -112,11 +158,22 @@ namespace CarFire
#region ICharacter Members
+ ///
+ /// Load the monster's content. This is called by the map when
+ /// the game requests the entities.
+ ///
+ /// The zaphnod.
public void LoadContent(ContentManager contentManager)
{
mTexture = contentManager.Load("menuItem");
}
+ ///
+ /// Update the monster's state. This should be called by the game
+ /// every "frame" (whenever the game is updating its state). In this
+ /// simple monster, all we need to do is update the motion manager.
+ ///
+ ///
public void Update(TimeSpan timeSpan)
{
if (mState == AiState.Pacing)
@@ -125,24 +182,45 @@ namespace CarFire
}
}
+ ///
+ /// Draw the monster. We just ask the map for our screen position,
+ /// passing it the position which the motion manager keeps track of.
+ ///
+ /// The
public void Draw(SpriteBatch spriteBatch)
{
Rectangle position = mGame.State.Map.GetRectangleFromCoordinates(mMotion.Position);
spriteBatch.Draw(mTexture, position, Color.White);
}
+ ///
+ /// A monster should keep track of its health. This one doesn't.
+ ///
public int Health
{
- get { throw new NotImplementedException(); }
+ get { return this.health; }
+
}
+ ///
+ /// This monster is invincible.
+ ///
+ ///
public void causeDamageTo(int amount)
{
- throw new NotImplementedException();
+ this.health -= amount;
}
+ public bool IsCollidable { get { return true; } }
+
+ ///
+ /// Get the smoothed position.
+ ///
public Vector2 Position { get { return mMotion.Position; } }
+ ///
+ /// Get the grid coordinates.
+ ///
public Point Coordinates { get { return mMotion.Coordinates; } }
#endregion
@@ -155,16 +233,17 @@ namespace CarFire
char mId;
MovementManager mMotion;
- List mIdlePath = new List();
- int mIdlePathIndex;
+ List mIdlePath = new List(); // List of waypoints that we got from the map.
+ int mIdlePathIndex; // Index to the waypoint we're heading for.
- List mPath;
- int mPathIndex;
- Direction mPathDirection;
+ List mPath; // List of cells in the path between the position between where
+ // we started and the waypoint we're heading for.
+ int mPathIndex; // Index to the cell we're heading for.
+ Direction mPathDirection; // The direction between our current position and the place we're going.
- AiState mState;
+ AiState mState; // What is the monster doing?
- Texture2D mTexture;
+ Texture2D mTexture; // Obvious.
#endregion
}