Пример #1
0
        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;
                            }
                        }
                    }
                }
            }
        }
Пример #2
0
        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();
        }
Пример #3
0
 public virtual void SetSprite()
 {
     CurrentSprite = DirectionHelper.ToString(direction);
 }