コード例 #1
0
    /// <summary>
    /// 寻路接口
    /// </summary>
    /// <param name="grid_map">地图格子列表</param>
    /// <param name="startPos">起点</param>
    /// <param name="endPos">终点</param>
    /// <param name="isFindNearstPath">失败时,是否返回最近可移动路径</param>
    /// <returns></returns>
    public eFinderResult search(PathGridMap grid_map, Vector2 startPos, Vector2 endPos, bool isFindNearstPath = false)
    {
        if (grid_map == null)
        {
            return(eFinderResult.FAILED);
        }

        m_array_open.Clear();
        m_array_closed.Clear();
        m_array_search_path.Clear();
        m_array_search_grid.Clear();

        m_start_node = grid_map.getNodeByPostion(startPos.x, startPos.y);
        m_end_node   = grid_map.getNodeByPostion(endPos.x, endPos.y);

        //Log.Debug(string.Format("起点{0},{1};终点{2},{3}", m_start_node.row, m_start_node.col, m_end_node.row, m_end_node.col));
        if (m_start_node == null)
        {
            //Log.Error("AStarPathfinder::findPath - 角色起点在障碍里面");
            return(eFinderResult.FAILED);
        }
        if (m_end_node == null || (!m_end_node.walkable && !isFindNearstPath))
        {
            //Log.Error("AStarPathfinder::findPath - 角色终点在障碍里面");
            return(eFinderResult.FAILED);
        }
        m_start_node.g = 0;
        m_start_node.h = onDiagonal(m_start_node);
        m_start_node.f = m_start_node.g + m_start_node.h;

        //执行寻路
        //float old_time = Time.realtimeSinceStartup;
        eFinderResult result = travel(grid_map, isFindNearstPath);

        //Log.Debug("[AI]AStarPathfinder::search - 寻路总用时:", (Time.realtimeSinceStartup - old_time) + "s");

        return(result);
    }
コード例 #2
0
    /// <summary>
    /// 寻路接口
    /// </summary>
    /// <param name="start_x"></param>
    /// <param name="start_y"></param>
    /// <param name="target_x"></param>
    /// <param name="target_y"></param>
    /// <param name="width"></param>
    /// <param name="height"></param>
    /// <returns></returns>
    public eFinderResult search(PathGridMap grid_map, float start_x, float start_y, float target_x, float target_y, float width, float height)
    {
        if (grid_map == null)
        {
            return(eFinderResult.FAILED);
        }

        eFace8Type walk_dir = eFace8Type.NONE;

        m_cur_grid            = null;
        m_collide_rect.width  = width;
        m_collide_rect.height = height;

        //上一步的位置
        m_last_pos_x = start_x;
        m_last_pos_y = start_y;

        //步长增长方向
        Vector2 pt_step    = Math2DUtils.normalPoint(start_x, start_y, target_x, target_y, STEP_LENGTH);
        float   x_step_inc = pt_step.x;
        float   y_step_inc = pt_step.y;
        //步长个数
        int stepCount = (int)Mathf.Ceil(Math2DUtils.distance(start_x, start_y, target_x, target_y) / STEP_LENGTH);

        //确定移动方向
        float angle = MathUtils.ToDegree(Math2DUtils.LineRadians(start_x, start_y, target_x, target_y));

        walk_dir = (eFace8Type)Math2DUtils.getFace(angle, 8);

        m_cur_grid = grid_map.getNodeByPostion(start_x, start_y);
        if (m_cur_grid == null)
        {
            return(eFinderResult.FAILED);
        }

        //重新调整方向:判断下一步是否可走
        walk_dir = adjustDir(grid_map, walk_dir, start_x + x_step_inc, start_y + y_step_inc);
        switch (walk_dir)
        {
        case eFace8Type.LEFT:
        case eFace8Type.RIGHT:
            y_step_inc = 0;
            break;

        case eFace8Type.UP:
        case eFace8Type.DOWN:
            x_step_inc = 0;
            break;

        case eFace8Type.NONE:
            return(eFinderResult.FAILED);
        }
        //开始寻路,每次移动一个步长
        eFinderResult result = eFinderResult.FAILED;
        int           i      = 1;

        for (i = 1; i <= stepCount; i++)   //从1开始,当前位置不判断
        {
            if (isWalkableRect(grid_map, walk_dir, start_x + x_step_inc * i, start_y + y_step_inc * i))
            {
                m_last_pos_x = start_x + x_step_inc * i;
                m_last_pos_y = start_y + y_step_inc * i;
                result       = eFinderResult.SUCCEEDED;
            }
            else
            {
                //如果第一步都不能走,设置查询失败
                if (i == 1)
                {
                    result = eFinderResult.FAILED;
                }
                else
                {
                    result = eFinderResult.SUCCEEDED_NEAREST;
                }
                break;
            }
        }
        m_target_pos_x = m_last_pos_x;
        m_target_pos_y = m_last_pos_y;

        return(result);
    }