Ejemplo n.º 1
0
    /// <summary>
    /// 判断斜角是通路
    /// </summary>
    /// <returns></returns>
    private static bool CheckDiagonalDirCross(IntVector2 Pos, JumpDirections dir)
    {
        MapTile t1 = null;
        MapTile t2 = null;

        if (dir == JumpDirections.RightTop)
        {
            t1 = g_map.GetMapTile(Pos + IntVector2.top);
            t2 = g_map.GetMapTile(Pos + IntVector2.right);
        }
        else if (dir == JumpDirections.RightDown)
        {
            t1 = g_map.GetMapTile(Pos + IntVector2.down);
            t2 = g_map.GetMapTile(Pos + IntVector2.right);
        }
        else if (dir == JumpDirections.LeftTop)
        {
            t1 = g_map.GetMapTile(Pos + IntVector2.top);
            t2 = g_map.GetMapTile(Pos + IntVector2.left);
        }
        else if (dir == JumpDirections.LeftDown)
        {
            t1 = g_map.GetMapTile(Pos + IntVector2.left);
            t2 = g_map.GetMapTile(Pos + IntVector2.down);
        }
        if (t1 != null && t1.blocked == true && t2 != null && t2.blocked == true)
        {
            return(false);
        }
        else
        {
            return(true);
        }
    }
Ejemplo n.º 2
0
    /// <summary>
    /// 判断对角方向是否有强制邻居
    /// </summary>
    /// <returns></returns>
    private static bool CheckHaveForceNeighborsDiagonalDir(IntVector2 startPos, ushort sectorIndex, JumpDirections dir)
    {
        bool ret = false;

        g_StraightDirNum = 0;
        g_DiagonalDirNum = 0;
        JumpDirections AddDir = dir;

        if (dir == JumpDirections.RightTop)
        {
            if (CheckForceNeighbors(startPos, sectorIndex, IntVector2.rightTop, IntVector2.left) == true)
            {
                AddDir = JumpDirections.LeftTop;
                ret    = true;
            }
            else if (CheckForceNeighbors(startPos, sectorIndex, IntVector2.rightTop, IntVector2.down) == true)
            {
                AddDir = JumpDirections.RightDown;
                ret    = true;
            }
            if (ret == true)
            {
                g_DiagonalDirArray[g_DiagonalDirNum++] = JumpDirections.RightTop;
                g_DiagonalDirArray[g_DiagonalDirNum++] = AddDir;
                g_StraightDirArray[g_StraightDirNum++] = JumpDirections.Top;
                g_StraightDirArray[g_StraightDirNum++] = JumpDirections.Right;
            }
        }
        else if (dir == JumpDirections.RightDown)
        {
            if (CheckForceNeighbors(startPos, sectorIndex, IntVector2.rightDown, IntVector2.left) == true)
            {
                AddDir = JumpDirections.LeftDown;
                ret    = true;
            }
            else if (CheckForceNeighbors(startPos, sectorIndex, IntVector2.rightDown, IntVector2.top) == true)
            {
                AddDir = JumpDirections.RightTop;
                ret    = true;
            }
            if (ret == true)
            {
                g_DiagonalDirArray[g_DiagonalDirNum++] = JumpDirections.RightDown;
                g_DiagonalDirArray[g_DiagonalDirNum++] = AddDir;
                g_StraightDirArray[g_StraightDirNum++] = JumpDirections.Down;
                g_StraightDirArray[g_StraightDirNum++] = JumpDirections.Right;
            }
        }
        else if (dir == JumpDirections.LeftTop)
        {
            if (CheckForceNeighbors(startPos, sectorIndex, IntVector2.leftTop, IntVector2.right) == true)
            {
                AddDir = JumpDirections.RightTop;
                ret    = true;
            }
            else if (CheckForceNeighbors(startPos, sectorIndex, IntVector2.leftTop, IntVector2.down) == true)
            {
                AddDir = JumpDirections.LeftDown;
                ret    = true;
            }
            if (ret == true)
            {
                g_DiagonalDirArray[g_DiagonalDirNum++] = JumpDirections.LeftTop;
                g_DiagonalDirArray[g_DiagonalDirNum++] = AddDir;
                g_StraightDirArray[g_StraightDirNum++] = JumpDirections.Top;
                g_StraightDirArray[g_StraightDirNum++] = JumpDirections.Left;
            }
        }
        else if (dir == JumpDirections.LeftDown)
        {
            if (CheckForceNeighbors(startPos, sectorIndex, IntVector2.leftDown, IntVector2.right) == true)
            {
                AddDir = JumpDirections.RightDown;
                ret    = true;
            }
            else if (CheckForceNeighbors(startPos, sectorIndex, IntVector2.leftDown, IntVector2.top) == true)
            {
                AddDir = JumpDirections.LeftTop;
                ret    = true;
            }
            if (ret == true)
            {
                g_DiagonalDirArray[g_DiagonalDirNum++] = JumpDirections.LeftDown;
                g_DiagonalDirArray[g_DiagonalDirNum++] = AddDir;
                g_StraightDirArray[g_StraightDirNum++] = JumpDirections.Down;
                g_StraightDirArray[g_StraightDirNum++] = JumpDirections.Left;
            }
        }
        return(ret);
    }
Ejemplo n.º 3
0
    /// <summary>
    /// 对角方向jump
    /// </summary>
    private static void DoDiagonalDirJump(PathNode start, JumpPathNode jStart, IntVector2 startPos, ushort sectorIndex, JumpDirections dir, JumpPathNode parent)
    {
        IntVector2 Dir = g_DirArray[(int)dir];
        MapTile    Cur = g_map.GetMapTile(startPos + Dir);

        while (Cur != null && Cur.blocked == false && Cur.sectorIndex == sectorIndex)
        {
            if (Cur.hasPathNodeConnection)
            {
                SetPathResult(jStart, parent, start, g_map.GetWayPointPathNode(0, Cur));
                if (g_MaxSearchRoad <= 0)
                {
                    break;
                }
            }
            // 先判断是否为强制邻居
            if (CheckHaveForceNeighborsDiagonalDir(Cur.Pos, sectorIndex, dir) == true)
            {
                JumpPathNode j = new JumpPathNode(Cur.Pos, parent, g_StraightDirArray, g_StraightDirNum, g_DiagonalDirArray, g_DiagonalDirNum);
                g_openSet.Add(j);
                g_openSet.UpdateItem(j);
                break;
            }
            if (dir == JumpDirections.LeftDown)
            {
                DoStraightDirJump(start, jStart, Cur.Pos, sectorIndex, JumpDirections.Left, parent);
                DoStraightDirJump(start, jStart, Cur.Pos, sectorIndex, JumpDirections.Down, parent);
            }
            else if (dir == JumpDirections.LeftTop)
            {
                DoStraightDirJump(start, jStart, Cur.Pos, sectorIndex, JumpDirections.Left, parent);
                DoStraightDirJump(start, jStart, Cur.Pos, sectorIndex, JumpDirections.Top, parent);
            }
            else if (dir == JumpDirections.RightDown)
            {
                DoStraightDirJump(start, jStart, Cur.Pos, sectorIndex, JumpDirections.Right, parent);
                DoStraightDirJump(start, jStart, Cur.Pos, sectorIndex, JumpDirections.Down, parent);
            }
            else if (dir == JumpDirections.RightTop)
            {
                DoStraightDirJump(start, jStart, Cur.Pos, sectorIndex, JumpDirections.Right, parent);
                DoStraightDirJump(start, jStart, Cur.Pos, sectorIndex, JumpDirections.Top, parent);
            }
            // 对角通路问题
            if (CheckDiagonalDirCross(Cur.Pos, dir) == false)
            {
                break;
            }
            Cur = g_map.GetMapTile(Cur.Pos + Dir);
        }
    }
Ejemplo n.º 4
0
    /// <summary>
    /// 直线方向jump
    /// </summary>
    private static void DoStraightDirJump(PathNode start, JumpPathNode jStart, IntVector2 startPos, ushort sectorIndex, JumpDirections dir, JumpPathNode parent)
    {
        IntVector2 Dir = g_DirArray[(int)dir];
        MapTile    Cur = g_map.GetMapTile(startPos + Dir);

        while (Cur != null && Cur.blocked == false && Cur.sectorIndex == sectorIndex)
        {
            MapTile next = g_map.GetMapTile(Cur.Pos + Dir);
            // 判断出界或阻断。
            if (next == null || next.blocked == true || next.sectorIndex != sectorIndex)
            {
                break;
            }
            if (next.hasPathNodeConnection)
            {
                SetPathResult(jStart, parent, start, g_map.GetWayPointPathNode(0, next));
                g_MaxSearchRoad--;
                if (g_MaxSearchRoad <= 0)
                {
                    break;
                }
            }

            // 判断是否有强迫邻居
            if (CheckHaveForceNeighborsStraightDir(Cur.Pos, sectorIndex, dir) == true)
            {
                JumpPathNode j = new JumpPathNode(Cur.Pos, parent, g_StraightDirArray, g_StraightDirNum, g_DiagonalDirArray, g_DiagonalDirNum);
                g_openSet.Add(j);
                g_openSet.UpdateItem(j);
                break;
            }
            else
            {
                Cur = next;
            }
        }
    }