Пример #1
0
        public int GetDirectionRelativeValue(DirectionRelativeParent direction)
        {
            //斜对角√2 * 10 直线 1 * 10
            switch (direction)
            {
            case DirectionRelativeParent.UP:
            case DirectionRelativeParent.DOWN:
            case DirectionRelativeParent.LEFT:
            case DirectionRelativeParent.RIGHT:
                return(10);

            case DirectionRelativeParent.LEFT_UP:
            case DirectionRelativeParent.LEFT_DOWN:
            case DirectionRelativeParent.RIGHT_UP:
            case DirectionRelativeParent.RIGHT_DOWN:
                return(14);

            case DirectionRelativeParent.START:
            case DirectionRelativeParent.END:
                return(0);

            default:
                return(0);
            }
        }
Пример #2
0
        public Point GetOffsetValueByDirection(DirectionRelativeParent direction)
        {
            switch (direction)
            {
            case DirectionRelativeParent.UP:
                return(new Point(0, 1));

            case DirectionRelativeParent.DOWN:
                return(new Point(0, -1));

            case DirectionRelativeParent.LEFT:
                return(new Point(-1, 0));

            case DirectionRelativeParent.RIGHT:
                return(new Point(1, 0));

            case DirectionRelativeParent.LEFT_UP:
                return(new Point(-1, 1));

            case DirectionRelativeParent.LEFT_DOWN:
                return(new Point(-1, -1));

            case DirectionRelativeParent.RIGHT_UP:
                return(new Point(1, 1));

            case DirectionRelativeParent.RIGHT_DOWN:
                return(new Point(1, -1));

            case DirectionRelativeParent.START:
            case DirectionRelativeParent.END:
            case DirectionRelativeParent.UNKNOWN:
            default:
                return(new Point(0, 0));
            }
        }
Пример #3
0
 public float CalculateGValue(DirectionRelativeParent direction, float parentGValue)
 {
     if (direction == DirectionRelativeParent.END)
     {
         return(0);
     }
     return(GetDirectionRelativeValue(direction) + parentGValue);
 }
Пример #4
0
        public void GenerateRoundNode(NodeInfo parentNode)
        {
            //直线
            for (DirectionRelativeParent i = DirectionRelativeParent.UP; i <= DirectionRelativeParent.RIGHT; i++)
            {
                CreateNodeByDirection(i, parentNode);
            }

            //对角线
            if (isCalcDiagonal)
            {
                for (DirectionRelativeParent i = DirectionRelativeParent.LEFT_UP; i <= DirectionRelativeParent.RIGHT_DOWN; i++)
                {
                    CreateNodeByDirection(i, parentNode);
                }
            }
            //排序
            openNodeList.SortOpenList();
        }
Пример #5
0
        public void CreateNodeByDirection(DirectionRelativeParent direction, NodeInfo parentNode)
        {
            Point offset = GetOffsetValueByDirection(direction);
            int   girdX  = parentNode.gridX + offset.x;
            int   gridY  = parentNode.gridY + offset.y;

            //如果是障碍物,则不创建
            if (IsBlock(girdX, gridY))
            {
                return;
            }

            //如果已经在closelist 则不创建
            if (closeNodeList.IsAlreadyInCloseList(girdX, gridY))
            {
                return;
            }

            //创建并加入Open列表
            openNodeList.AddNode(CreateNode(girdX, gridY, parentNode));
        }