Beispiel #1
0
        void PrepareBattleMap()
        {
            if (currentData == null)
            {
                Debug.Log("prepare battle map failed:no battle data");
                return;
            }
            gridUnits = new GridUnit[currentData.mapWidth, currentData.mapHeight];

            for (int row = 0; row < currentData.mapHeight; row++)
            {
                for (int column = 0; column < currentData.mapWidth; column++)
                {
                    GridUnitData gud = currentData.mapGrids[column, row];
                    gud.col = column;
                    gud.row = row;
                    if (gud != null)
                    {
                        GridUnit gu = CreateGrid();//创建一个用于显示的格子对象
                        if (gu != null)
                        {
                            gridUnits[column, row]     = gu;
                            gu.transform.localPosition = gud.localPosition;
                            gu.name     = string.Format("Grid_{0}_{1}", row, column);
                            gu.gridData = gud;
                            gu.Refresh();
                            gu.gameObject.SetActive(true);
                        }
                    }
                }
            }
        }
Beispiel #2
0
        //计算两格子之间的距离
        public int Distance(GridUnitData target)
        {
            //计算行移动量
            int rowGap = Mathf.Abs(target.gridPosition.x - gridPosition.x);
            //计算列移动量
            int colGap = Mathf.Abs(target.gridPosition.y - gridPosition.y);

            return(rowGap + colGap);
        }
Beispiel #3
0
        //设置格子类型
        private void SetGridType(GridUnitData gud, GridType gt)
        {
            switch (gt)
            {
            case GridType.Normal:
                normalGrids.Add(gud);
                break;

            case GridType.Obstacle:
                obstacleGrids.Add(gud);
                break;

            default:
                break;
            }
            gud.gridType = gt;
        }
Beispiel #4
0
        //战场中铺设格子(信息)
        public void Generate(int width, int height, int obstacle, int gap)
        {
            if (width <= 0 || height <= 0)
            {
                return;
            }

            cam.transform.position = new Vector3((width - 1) / 2, height / 2, -10.0f);

            //地图编号自增
            mapID = mapCount++;
            //记录地图宽高
            mapWidth  = width;
            mapHeight = height;
            //生成格子数组
            mapGrids = new GridUnitData[mapWidth, mapHeight];
            //记录普通格子和障碍格子
            normalGrids   = new List <GridUnitData>();
            obstacleGrids = new List <GridUnitData>();

            //全部生成为普通格子
            for (int r = 0; r < mapHeight; ++r)
            {
                for (int c = 0; c < mapWidth; ++c)
                {
                    GridUnitData gud = new GridUnitData();
                    gud.localPosition = new Vector3(c, r, 0);

                    //设置格子参数
                    gud.gridPosition = new Vector2Int(r, c);     //位置
                    //todo sprite size
                    //float width = GetComponent<SpriteRenderer>().bounds.size.x;
                    //float height = GetComponent<SpriteRenderer>().bounds.size.y;


                    //初始设置为普通格子
                    SetGridType(gud, GridType.Normal);
                    //保存
                    mapGrids[c, r] = gud;
                }
            }

            //随机一些障碍格子
            DisposeGridUnits(obstacle, gap);
        }
Beispiel #5
0
        //放置一些障碍格子
        private void DisposeGridUnits(int obstacle, int gap)
        {
            obstacle = Mathf.Min(mapWidth * mapHeight, obstacle);

            for (int i = 0; i < obstacle; ++i)
            {
                int          randomIdx = -1;
                GridUnitData target    = null;
                int          tryTimes  = 999;
                while (tryTimes > 0 && target == null)
                {
                    randomIdx = Random.Range(0, normalGrids.Count);
                    target    = normalGrids[randomIdx];
                    //判断距离
                    for (int j = 0; j < obstacleGrids.Count; ++j)
                    {
                        var distance = obstacleGrids[j].Distance(target);
                        if (obstacleGrids[j].Distance(target) < gap)
                        {
                            target = null;
                            break;
                        }
                    }
                    --tryTimes;
                }
                if (target != null)
                {
                    SetGridType(target, GridType.Obstacle);
                    normalGrids.RemoveAt(randomIdx);
                }
                else
                {
                    Debug.Log("Dispose grid unit data warning.");
                }
            }
        }