/// Get the grid coordinates where the object is at or\r
/// is moving to.\r
/// </summary>\r
- public Point Coordinates { get { return mCoordinates; } }\r
+ public Point Coordinates { get { return mCoordinates; } set { mCoordinates = value; } }\r
\r
/// <summary>\r
/// Get and set the speed of movement in grid cells / second.\r
Update(timeSpan, false, false, false, false);\r
}\r
\r
+ /// <summary>\r
+ /// Update the movement manager with the timeslice and a direction.\r
+ /// </summary>\r
+ /// <param name="timeSpan">The timeslice.</param>\r
+ /// <param name="direction">Direction you want to move.</param>\r
+ public void Update(TimeSpan timeSpan, Direction direction)\r
+ {\r
+ if (direction == Direction.Left) Update(timeSpan, true, false, false, false);\r
+ else if (direction == Direction.UpperLeft) Update(timeSpan, true, false, true, false);\r
+ else if (direction == Direction.Up) Update(timeSpan, false, false, true, false);\r
+ else if (direction == Direction.UpperRight) Update(timeSpan, false, true, true, false);\r
+ else if (direction == Direction.Right) Update(timeSpan, false, true, false, false);\r
+ else if (direction == Direction.LowerRight) Update(timeSpan, false, true, false, true);\r
+ else if (direction == Direction.Down) Update(timeSpan, false, false, false, true);\r
+ else if (direction == Direction.LowerLeft) Update(timeSpan, true, false, false, true);\r
+ else Update(timeSpan);\r
+ }\r
+\r
/// <summary>\r
/// Update the movement manager with the timeslice and the directions\r
/// the object is supposed to go. The directions will be ignored if the\r
RecalculatePosition(alpha);\r
}\r
}\r
+ public void LockUpdate(TimeSpan timeSpan, bool moveLeft, bool moveRight, bool moveUp, bool moveDown)\r
+ {\r
+ float passedTime = (float)timeSpan.TotalSeconds;\r
+ if (moveLeft == true || moveRight == true || moveUp == true || moveDown == true)\r
+ {\r
+ mDirection = GetDirection(moveLeft, moveRight, moveUp, moveDown);\r
+ }\r
+ if (mIsMoving)\r
+ {\r
+ mTimeAccumulator += passedTime;\r
+\r
+ float alpha = mTimeAccumulator / mInverseSpeed;\r
+ if (alpha >= 1.0f)\r
+ {\r
+ mIsMoving = false;\r
+ alpha = 1.0f;\r
+ }\r
+\r
+ RecalculatePosition(alpha);\r
+ }\r
+ }\r
\r
\r
/// <summary>\r
- /// Helper method to get neighbor cells from a point and directions.\r
+ /// Helper method to get a neighbor cell from a point and directions.\r
/// </summary>\r
/// <param name="point">The point.</param>\r
/// <param name="left">To the left.</param>\r
/// <param name="up">Above.</param>\r
/// <param name="down">Below.</param>\r
/// <returns>The neighbor cell coordinates.</returns>\r
- public static Point GetNeighborCell(Point point, bool left, bool right, bool up, bool down)\r
+ public static Point GetNeighbor(Point point, bool left, bool right, bool up, bool down)\r
{\r
if (left) point.X--;\r
if (right) point.X++;\r
return point;\r
}\r
\r
+ /// <summary>\r
+ /// Helper method to get a neighbor cell from a point and a direction.\r
+ /// </summary>\r
+ /// <param name="point">The point.</param>\r
+ /// <param name="direction">The direction.</param>\r
+ /// <returns>The neighbor cell coordinates.</returns>\r
+ public static Point GetNeighbor(Point point, Direction direction)\r
+ {\r
+ switch (direction)\r
+ {\r
+ case Direction.Left: return new Point(point.X - 1, point.Y);\r
+ case Direction.UpperLeft: return new Point(point.X - 1, point.Y - 1);\r
+ case Direction.Up: return new Point(point.X, point.Y - 1);\r
+ case Direction.UpperRight: return new Point(point.X + 1, point.Y - 1);\r
+ case Direction.Right: return new Point(point.X + 1, point.Y);\r
+ case Direction.LowerRight: return new Point(point.X + 1, point.Y + 1);\r
+ case Direction.Down: return new Point(point.X, point.Y + 1);\r
+ case Direction.LowerLeft: return new Point(point.X - 1, point.Y + 1);\r
+ }\r
+ return point;\r
+ }\r
+\r
+ /// <summary>\r
+ /// Helper method to get the two neighbor cells of two nearby cells.\r
+ /// </summary>\r
+ /// <param name="a">A point.</param>\r
+ /// <param name="b">Another point.</param>\r
+ /// <returns>An array of two points representing the neighbor cells.</returns>\r
+ public static Point[] GetNeighbors(Point a, Point b)\r
+ {\r
+ Point[] neighbors = new Point[2];\r
+ neighbors[0] = new Point(a.X, b.Y);\r
+ neighbors[1] = new Point(b.X, a.Y);\r
+ return neighbors;\r
+ }\r
+\r
+\r
/// <summary>\r
/// Helper method to get a Direction type from directions.\r
/// </summary>\r
else return Direction.None;\r
}\r
\r
+ /// <summary>\r
+ /// Helper method to get the general Direction type if you want to move\r
+ /// from one cell to another.\r
+ /// <param name="a">Starting point.</param>\r
+ /// <param name="b">Destination point.</param>\r
+ /// <returns>The direction toward the cell.</returns>\r
+ public static Direction GetDirection(Point a, Point b)\r
+ {\r
+ int dx = b.X - a.X;\r
+ int dy = b.Y - a.Y;\r
+\r
+ if (dx < 0)\r
+ {\r
+ if (dy < 0) return Direction.UpperLeft;\r
+ else if (dy > 0) return Direction.LowerLeft;\r
+ else return Direction.Left;\r
+ }\r
+ else if (dx > 0)\r
+ {\r
+ if (dy < 0) return Direction.UpperRight;\r
+ else if (dy > 0) return Direction.LowerRight;\r
+ else return Direction.Right;\r
+ }\r
+ else if (dy < 0) return Direction.Up;\r
+ else if (dy > 0) return Direction.Down;\r
+ else return Direction.None;\r
+ }\r
+\r
#endregion\r
\r
\r
void UpdateCoordinates(bool moveLeft, bool moveRight, bool moveUp, bool moveDown)\r
{\r
mLastCoordinates = mCoordinates;\r
- mCoordinates = GetNeighborCell(mCoordinates, moveLeft, moveRight, moveUp, moveDown);\r
+ mCoordinates = GetNeighbor(mCoordinates, moveLeft, moveRight, moveUp, moveDown);\r
\r
if ((moveLeft && moveUp) || (moveUp && moveRight) || (moveRight && moveDown) || (moveDown && moveLeft))\r
{\r