Exemple #1
0
    static int SearchRoad(IntPtr L)
    {
        try
        {
            ToLua.CheckArgsCount(L, 9);
            int[][]       arg0      = ToLua.CheckObjectArray <int[]>(L, 1);
            int           arg1      = (int)LuaDLL.luaL_checknumber(L, 2);
            int           arg2      = (int)LuaDLL.luaL_checknumber(L, 3);
            int           arg3      = (int)LuaDLL.luaL_checknumber(L, 4);
            int           arg4      = (int)LuaDLL.luaL_checknumber(L, 5);
            int           arg5      = (int)LuaDLL.luaL_checknumber(L, 6);
            int           arg6      = (int)LuaDLL.luaL_checknumber(L, 7);
            bool          arg7      = LuaDLL.luaL_checkboolean(L, 8);
            System.Action arg8      = null;
            LuaTypes      funcType9 = LuaDLL.lua_type(L, 9);

            if (funcType9 != LuaTypes.LUA_TFUNCTION)
            {
                arg8 = (System.Action)ToLua.CheckObject(L, 9, typeof(System.Action));
            }
            else
            {
                LuaFunction func = ToLua.ToLuaFunction(L, 9);
                arg8 = DelegateFactory.CreateDelegate(typeof(System.Action), func) as System.Action;
            }

            System.Collections.Generic.IList <Node> o = AStarPathFinding.SearchRoad(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8);
            ToLua.PushObject(L, o);
            return(1);
        }
        catch (Exception e)
        {
            return(LuaDLL.toluaL_exception(L, e));
        }
    }
Exemple #2
0
    /// <summary>
    /// 重巡路径
    /// </summary>
    private void ReFindPath()
    {
        //Debug.Log("重新寻路");
        // 重新寻路设置目标点
        // 清空当前目标点
        clusterData.ClearTarget();
        // 取最近的对方建筑
        var buildingList = DisplayerManager.Single.GetBuildingByType(GetTypeArray(clusterData.AllData.MemberData.ObjID.ObjType));

        // TODO 区分地面与空中

        int[][] mapData = null;
        // 当前地图数据
        switch (clusterData.AllData.MemberData.GeneralType)
        {
        case Utils.GeneralTypeAir:
            mapData = LoadMap.Single.GetAirMapData();
            break;

        case Utils.GeneralTypeSurface:
            mapData = LoadMap.Single.GetSurfaceMapData();
            break;
        }
        // 当前单位位置映射
        var startPos = Utils.PositionToNum(LoadMap.Single.MapPlane.transform.position, clusterData.transform.position, ClusterManager.Single.UnitWidth, ClusterManager.Single.MapWidth, ClusterManager.Single.MapHeight);
        // 当前目标位置映射
        var endPos = Utils.PositionToNum(LoadMap.Single.MapPlane.transform.position, GetClosestBuildingPos(buildingList), ClusterManager.Single.UnitWidth, ClusterManager.Single.MapWidth, ClusterManager.Single.MapHeight);
        // 生成路径
        var path = AStarPathFinding.SearchRoad(mapData, startPos[0], startPos[1], endPos[0], endPos[1], (int)clusterData.Diameter, (int)clusterData.Diameter + 1);

        if (path != null && path.Count > 0)
        {
            // 清空当前目标点
            clusterData.ClearTarget();
            clusterData.PushTargetList(Utils.NumToPostionByList(LoadMap.Single.MapPlane.transform.position, path,
                                                                ClusterManager.Single.UnitWidth, ClusterManager.Single.MapWidth, ClusterManager.Single.MapHeight));
        }
        else
        {
            Debug.Log("xingjin 目标点不可达:start:" + startPos[0] + "," + startPos[1] + " end:" + endPos[0] + "," + endPos[1]);
        }
        //clusterData.PushTargetList(Utils.NumToPostionByList(LoadMap.Single.MapPlane.transform.position, path, ClusterManager.Single.UnitWidth, ClusterManager.Single.MapWidth, ClusterManager.Single.MapHeight));
    }
Exemple #3
0
    /// <summary>
    /// 重巡路径
    /// </summary>
    /// <param name="fsm"></param>
    private void ReFindPath(SoldierFSMSystem fsm)
    {
        //Debug.Log("");
        // 重新寻路设置目标点
        // 当前地图数据
        int[][] mapData = null;
        // 当前地图数据
        switch (clusterData.AllData.MemberData.GeneralType)
        {
        case Utils.GeneralTypeAir:
            mapData = LoadMap.Single.GetAirMapData();
            break;

        case Utils.GeneralTypeSurface:
            mapData = LoadMap.Single.GetSurfaceMapData();
            break;
        }
        // 当前单位位置映射
        var startPos = Utils.PositionToNum(LoadMap.Single.MapPlane.transform.position, clusterData.transform.position, ClusterManager.Single.UnitWidth, ClusterManager.Single.MapWidth, ClusterManager.Single.MapHeight);
        // 当前目标位置映射
        var endPos = Utils.PositionToNum(LoadMap.Single.MapPlane.transform.position, fsm.EnemyTarget.ClusterData.transform.position, ClusterManager.Single.UnitWidth, ClusterManager.Single.MapWidth, ClusterManager.Single.MapHeight);
        // 生成路径
        var path = AStarPathFinding.SearchRoad(mapData, startPos[0], startPos[1], endPos[0], endPos[1], (int)clusterData.Diameter, (int)clusterData.Diameter + 1);

        if (path != null && path.Count > 0)
        {
            // 清空当前目标点
            clusterData.ClearTarget();
            targetPos = fsm.EnemyTarget.ClusterData.transform.position;
            clusterData.PushTargetList(Utils.NumToPostionByList(LoadMap.Single.MapPlane.transform.position, path,
                                                                ClusterManager.Single.UnitWidth, ClusterManager.Single.MapWidth, ClusterManager.Single.MapHeight));
        }
        else
        {
            Debug.Log("zhuiji 目标点不可达:start:" + startPos[0] + "," + startPos[1] + " end:" + endPos[0] + "," + endPos[1]);
        }
    }
Exemple #4
0
    /// <summary>
    /// 控制
    /// </summary>
    private void Control()
    {
        if (Input.GetMouseButtonDown(1))
        {
            // 释放技能
            var        ray = MainCamera.ScreenPointToRay(Input.mousePosition);
            RaycastHit hit;
            Physics.Raycast(ray, out hit);
            if (hit.collider != null && hit.collider.name.Equals(LoadMap.MapPlane.name))
            {
                SkillManager.Single.DoSkillNum(1009, new FormulaParamsPacker()
                {
                    StartPos       = new Vector3(hit.point.x, 0, hit.point.z),
                    TargetPos      = new Vector3(hit.point.x, 0, hit.point.z),
                    ReleaseMember  = new DisplayOwner(scaner.gameObject, scaner),
                    ReceiverMenber = new DisplayOwner(scaner.gameObject, scaner),
                });
            }
        }
        if (Input.GetMouseButtonDown(0))
        {
            var skill = SkillManager.Single.CreateSkillInfo(20001);
            Debug.Log(skill.SkillName);
            // 加载地图数据
            //Debug.Log(PacketManage.Single.GetPacket("mapdatapack").LoadString("mapdata"));
            // 获取地图上的点击点
            var        ray = MainCamera.ScreenPointToRay(Input.mousePosition);
            RaycastHit hit;
            Physics.Raycast(ray, out hit);
            // 点击到底板
            if (hit.collider != null && hit.collider.name.Equals(LoadMap.MapPlane.name))
            {
                var posOnMap = Utils.PositionToNum(LoadMap.MapPlane.transform.position, hit.point, UnitWidth, MapWidth, MapHeight);
                Debug.Log("start:" + lastTimeTargetX + "," + lastTimeTargetY + " end:" + posOnMap[0] + "," + posOnMap[1]);
                // 加载文件内容
                var mapInfoData = InitMapInfo();

                var path = AStarPathFinding.SearchRoad(mapInfoData, lastTimeTargetX, lastTimeTargetY, posOnMap[0], posOnMap[1], DiameterX, DiameterY, IsJumpPoint);
                // 根据path放地标, 使用组队寻路跟随过去
                //StartCoroutine(Step(path));

                var loadMapPos = LoadMap.GetCenter();
                ClusterManager.Single.Init(loadMapPos.x, loadMapPos.z, MapWidth, MapHeight, UnitWidth, mapInfoData);
                //LoadMap.RefreshMap();
                StartMoving(path, mapInfoData, lastTimeTargetX, lastTimeTargetY);

                // 缓存上次目标点
                lastTimeTargetX = posOnMap[0];
                lastTimeTargetY = posOnMap[1];
            }
            //var target = GameObject.Find("item0");
            //if (target != null)
            //{
            //    //var testEffect = EffectsFactory.Single.CreateLinerEffect("linePrfb.prefab", null, target, 3, null, 12);
            //    var testEffect = EffectsFactory.Single.CreateLinerEffect("linePrfb.prefab", null, new Vector3(0,0,0), new Vector3(100, 0, 100), 3, null, 12);
            //    testEffect.Begin();
            //}
            Debug.Log(Profiler.GetMonoUsedSize() + "/" + Profiler.GetTotalAllocatedMemory());
        }

        if (Input.GetMouseButtonDown(2))
        {
            // 获取地图上的点击点
            var        ray = MainCamera.ScreenPointToRay(Input.mousePosition);
            RaycastHit hit;
            Physics.Raycast(ray, out hit);
            // 点击到底板
            if (hit.collider != null && hit.collider.name.Equals(LoadMap.MapPlane.name))
            {
                var posOnMap = Utils.PositionToNum(LoadMap.MapPlane.transform.position, hit.point, UnitWidth, MapWidth, MapHeight);
                // 加载文件内容
                var mapInfoData = InitMapInfo();


                // 根据path放地标, 使用组队寻路跟随过去
                StartCoroutine(AStarPathFinding.ISearchRoad(mapInfoData, lastTimeTargetX, lastTimeTargetY, posOnMap[0], posOnMap[1], DiameterX, DiameterY));

                // 缓存上次目标点
                lastTimeTargetX = posOnMap[0];
                lastTimeTargetY = posOnMap[1];
            }
        }

        if (Input.GetMouseButton(0))
        {
            Utils.DrawGraphics(new RectGraphics(new Vector2(0, 0), 10, 10, 90), Color.white);
        }

        // 上下左右移动
        if (Input.GetKey(KeyCode.UpArrow))
        {
            MainCamera.transform.localPosition = new Vector3(MainCamera.transform.localPosition.x, MainCamera.transform.localPosition.y, MainCamera.transform.localPosition.z + 1);
        }
        if (Input.GetKey(KeyCode.DownArrow))
        {
            MainCamera.transform.localPosition = new Vector3(MainCamera.transform.localPosition.x, MainCamera.transform.localPosition.y, MainCamera.transform.localPosition.z - 1);
        }
        if (Input.GetKey(KeyCode.LeftArrow))
        {
            MainCamera.transform.localPosition = new Vector3(MainCamera.transform.localPosition.x - 1, MainCamera.transform.localPosition.y, MainCamera.transform.localPosition.z);
        }
        if (Input.GetKey(KeyCode.RightArrow))
        {
            MainCamera.transform.localPosition = new Vector3(MainCamera.transform.localPosition.x + 1, MainCamera.transform.localPosition.y, MainCamera.transform.localPosition.z);
        }
        // 升高下降
        if (Input.GetKey(KeyCode.PageUp))
        {
            MainCamera.transform.localPosition = new Vector3(MainCamera.transform.localPosition.x, MainCamera.transform.localPosition.y + 1, MainCamera.transform.localPosition.z);
        }
        if (Input.GetKey(KeyCode.PageDown))
        {
            MainCamera.transform.localPosition = new Vector3(MainCamera.transform.localPosition.x, MainCamera.transform.localPosition.y - 1, MainCamera.transform.localPosition.z);
        }
        if (Input.GetKeyUp(KeyCode.P))
        {
            // 暂停
            ClusterManager.Single.Pause();
        }
        if (Input.GetKeyUp(KeyCode.G))
        {
            // 继续
            ClusterManager.Single.GoOn();
        }
        if (Input.GetKeyUp(KeyCode.R))
        {
            InitMapInfo();
        }
        //if (Input.GetKey(KeyCode.A))
        //{
        //    // 添加统计单位
        //    FightDataStatistical.Single.AddCostData(new ArmyTypeData()
        //    {
        //        ArmyId = 1,
        //        ArmyType = 1,
        //        Camp = 1,
        //        GeneralType = 1,
        //        SingleCost = 10
        //    });
        //}
        //if (Input.GetKey(KeyCode.S))
        //{
        //    // 打印统计数据
        //    Debug.Log("cost:" + FightDataStatistical.Single.GetCostData(1));
        //}

        // 绘制关闭列表
        DrawCloseMap(AStarPathFinding.closePathMap);
    }
        /// <summary>
        /// 执行
        /// </summary>
        /// <param name="frame"></param>
        /// <param name="blackBoard"></param>
        public void OnceFrame(long frame, IBlackBoard blackBoard)
        {
            actionFrame = frame;

            // 检查是否死亡
            if (Hp <= 0)
            {
                MemberManager.Remove(this);
                Debug.Log("单位死亡Id:" + Id);
                return;
            }
            if (IsLocal && IsAI)
            {
                if (pathList != null && pathList.Count > 0)
                {
                    // 继续前进
                    var nextNode = pathList.Pop();
                    Debug.Log("继续前进:" + nextNode.X + "," + nextNode.Y);
                    // 跑出显示命令, 并等待显示部分反馈的帧数
                    SendCmd(new Commend(MemberManager.FrameCount, Id, OptionType.Move)
                    {
                        Param = new Dictionary <string, string>()
                        {
                            { "fromX", "" + X },
                            { "fromY", "" + Y },
                            { "toX", "" + nextNode.X },
                            { "toY", "" + nextNode.Y },
                        }
                    });
                }
                else
                {
                    var width  = blackBoard.MapBase.MapWidth;
                    var height = blackBoard.MapBase.MapHeight;

                    var couldNotPass = true;
                    int targetX      = 0;
                    int targetY      = 0;

                    while (couldNotPass)
                    {
                        // 随机获取目标位置
                        targetX = RandomPacker.Single.GetRangeI(0, width);
                        targetY = RandomPacker.Single.GetRangeI(0, height);


                        var path = AStarPathFinding.SearchRoad(
                            BlackBoard.Single.MapBase.GetMapArray(MapManager.MapObstacleLayer),
                            X, Y,
                            targetX, targetY, 1, 1);

                        if (path != null && path.Count > 0)
                        {
                            couldNotPass = false;
                            pathList     = new Stack <Node>(path.ToArray());
                        }

                        var index = RandomPacker.Single.GetRangeI(0, MemberManager.MemberCount);

                        // 随机攻击一个目标
                        var targetMember = MemberManager.Get(index);
                        if (targetMember != null)
                        {
                            SendCmd(new Commend(MemberManager.FrameCount, targetMember.Id, OptionType.Attack)
                            {
                                Param = new Dictionary <string, string>()
                                {
                                    { "atkId", "" + Id },
                                    { "atkType", "" + 1 },
                                    { "dmg", "" + 10 },
                                }
                            });
                        }
                    }

                    // 向目标寻路, 如果不可达继续寻路
                    var nextNode = pathList.Pop();
                    Debug.Log("重新寻路前进:" + nextNode.X + "," + nextNode.Y);

                    // 跑出显示命令, 并等待显示部分反馈的帧数
                    SendCmd(new Commend(MemberManager.FrameCount, Id, OptionType.Move)
                    {
                        Param = new Dictionary <string, string>()
                        {
                            { "fromX", "" + X },
                            { "fromY", "" + Y },
                            { "toX", "" + nextNode.X },
                            { "toY", "" + nextNode.Y },
                        }
                    });
                }
            }
        }