public override void CalculateDirection() { if ((mode == GhostMode.Chase || mode == GhostMode.Scatter) && mode != Game.ghostMode) { nextDirection = DirectionHelper.Opposite(direction); mode = Game.ghostMode; } else { double d = 0; if (nodeFrom.neighbors[direction] != null) { d = Helper.CalculateDistance(nodeFrom.x, nodeFrom.y, nodeFrom.neighbors[direction].node.x, nodeFrom.neighbors[direction].node.y); } if (Math.Abs(distance - d) < speed) { CalculateTarget(); double minDistance = -1; Node baseNode = nodeFrom; if (baseNode.neighbors[direction] != null) { baseNode = baseNode.neighbors[direction].node; } foreach (Direction key in baseNode.neighbors.Keys) { if (baseNode.neighbors[key] != null) { double distanceBetween = Helper.CalculateDistance(baseNode.neighbors[key].node.x, baseNode.neighbors[key].node.y, targetX, targetY); if ((distanceBetween < minDistance || minDistance == -1) && !DirectionHelper.IsOpposite(direction, key)) { minDistance = distanceBetween; nextDirection = key; } } } } } }
public void Move() { BeforeMove(); CalculateDirection(); move = false; double d = 0; if (nodeFrom.neighbors[direction] != null) { d = Helper.CalculateDistance(nodeFrom.x, nodeFrom.y, nodeFrom.neighbors[direction].node.x, nodeFrom.neighbors[direction].node.y); } if (DirectionHelper.IsOpposite(direction, nextDirection)) { if (d != 0) { nodeFrom = nodeFrom.neighbors[direction].node; } distance = d - distance; move = true; direction = nextDirection; } else if (Math.Abs(distance - d) < speed) { if (nodeFrom.neighbors[direction] != null) { nodeFrom = nodeFrom.neighbors[direction].node; } if (nodeFrom.neighbors[nextDirection] != null) { if (nodeFrom.neighbors[nextDirection].tp) { nodeFrom = nodeFrom.neighbors[nextDirection].node; } distance -= d; move = true; direction = nextDirection; } else if (nodeFrom.neighbors[direction] != null) { if (nodeFrom.neighbors[direction].tp) { nodeFrom = nodeFrom.neighbors[direction].node; } distance -= d; move = true; } } else { move = true; } if (move) { distance += speed; } else { distance = 0; } AfterMove(); }
public virtual void SetSprite() { CurrentSprite = DirectionHelper.ToString(direction); }