Ejemplo n.º 1
0
        public void BuildMap()
        {
            if (config.width > 2 && config.height > 2)
            {
                this.DestroyAllChild();
                MazeAlgorithm algorithm = (MazeAlgorithm)System.Activator.CreateInstance(System.Type.GetType("TileMazeMaker.Algorithm.Maze." + config.aglorithm.ToString()));
                algorithm.BuildMaze <MazeCell>(config.width, config.height);

                for (int iy = 0; iy < config.height; iy++)
                {
                    for (int ix = 0; ix < config.width; ix++)
                    {
                        CreateMazeCellObject(algorithm.GetAt(ix, iy));
                    }
                }
            }
            else
            {
                Debug.Log("Maze should bigger than 2X2");
            }
        }
Ejemplo n.º 2
0
        /// <summary>
        /// 不是特别完美,和map_data产生了耦合,不过只把他当成内部类,也无妨,只不过,其他类调用的时候,返回的是这个类的成员变量而不是临时变量!
        /// </summary>
        /// <returns></returns>
        public TileMapData GenerateTileMapData()
        {
            //重置
            TileMapData temp_data = new TileMapData();

            config.theme_config.RebuildTileThemeConfig();
            int tile_size_x     = config.tile_size_x;
            int tile_size_y     = config.tile_size_y;
            int total_thickness = config.wall_thickness + config.road_thickness;

            //初始化地图
            for (int iy = 0; iy < tile_size_y; iy++)
            {
                for (int ix = 0; ix < tile_size_x; ix++)
                {
                    int key = SharedUtil.PointHash(ix, iy);
                    temp_data[key] = config.theme_config.GetTilePrefabConfigIndex(config.road_name);
                }
            }

            MazeAlgorithm algorithm =
                (MazeAlgorithm)System.Activator.CreateInstance(System.Type.GetType("TileMazeMaker.Algorithm.Maze." + config.maze_algorithm.ToString()));

            //处理Mask
            algorithm.SetMazeMaskCells(config.maze_mask);

            //设置后期处理
            for (int i = 0; i < config.post_process.Count; i++)
            {
                if (config.post_process[i] != EMazePostProcess.None)
                {
                    algorithm.AddPostProcesser(config.post_process[i].ToString());
                }
            }

            algorithm.BuildMaze <MazeCell>(config.width, config.height);

            dig_list.Add(DigNorth);
            dig_list.Add(DigWest);
            dig_list.Add(DigSouth);
            dig_list.Add(DigEast);

            for (int iy = 0; iy < config.height; iy++)
            {
                for (int ix = 0; ix < config.width; ix++)
                {
                    IMazeCell cell = algorithm.GetAt(ix, iy);
                    if (cell != null)
                    {
                        TileRect out_rect = new TileRect(
                            ix * total_thickness,
                            iy * total_thickness,
                            config.road_thickness + 2 * config.wall_thickness,
                            config.road_thickness + 2 * config.wall_thickness);

                        out_rect.SetMapTileType(temp_data, config.theme_config, config.wall_name);

                        TileRect rect = new TileRect(
                            ix * total_thickness + config.wall_thickness,
                            iy * total_thickness + config.wall_thickness,
                            config.road_thickness,
                            config.road_thickness);

                        rect.SetMapTileType(temp_data, config.theme_config, config.road_name);

                        for (int i = 0; i < (int)EMazeDirection.DirectionCount; i++)
                        {
                            if (cell.IsConnectedTo((EMazeDirection)i))
                            {
                                dig_list[i](temp_data, rect);
                            }
                        }
                    }
                }
            }

            return(temp_data);
        }