首页 > 其他分享 >04. 生成地图上的房间

04. 生成地图上的房间

时间:2024-03-01 23:02:06浏览次数:25  
标签:04 column 地图 生成 screenHeight newPosition var screenWidth border

最终目标

每一列上面的关卡之间有间距,并且 x 坐标有左右偏移,最后一个房间的位置是固定的

实现方法

我们现在已经知道屏幕的宽度screenWidth,也知道了屏幕的高度screenHeight,同时还知道一共有多少列mapConfig.roomBlueprints.Count

那么可以算出

每一列的宽度columnWidth = screenWidth / mapConfig.roomBlueprints.Count

每列中,会有amount = Random.Range(min, max + 1)个地点

一列中每行的高度roomGapY = screenHeight / (amount + 1)

那么每一列的上面每个塔的坐标应该是(-screenWidth / 2 + border + columnWidth * colIndex, screenHeight / 2 - roomGapY * (rowIndex + 1))

知道了塔的 X 坐标是-screenWidth / 2 + border + columnWidth * colIndex,那么我可以让它稍微左右移动一点,显得更随机一些newPosition.x = generatePoint.x + Random.Range(-border / 2, border)

最后一列是 Boss 房间,需要固定 X 轴坐标newPosition.x = screenWidth / 2 - border * 2;

最终代码

    
    private List<Room> rooms = new List<Room>();

    private void Awake()
    {
        // 获取屏幕的高度和宽度
        screenHeight = Camera.main.orthographicSize * 2;
        screenWidth = screenHeight * Camera.main.aspect;

        // 获取一列的宽度,为了防止最后一列显示在屏幕外面,所以分母加1,现在看来还行,就不用加了
        columnWidth = screenWidth / mapConfig.roomBlueprints.Count;
    }

    public void CreateMap()
    {
        for (int column = 0; column < mapConfig.roomBlueprints.Count; column++)
        {
            var blueprint = mapConfig.roomBlueprints[column];

            var amount = Random.Range(blueprint.min, blueprint.max + 1);

            var startHeight = screenHeight / 2 - screenHeight / (amount + 1);

            generatePoint = new Vector3(-screenWidth / 2 + border + columnWidth * column, startHeight, 0);

            var newPosition = generatePoint;
            
            
            var roomGapY = screenHeight / (amount + 1);

            // 循环当前列的所有房间数量生成房间
            for (int i = 0; i < amount; i++)
            {
                if (column == mapConfig.roomBlueprints.Count - 1)
                {
                    // 判断为最后一列,Boss 房间
                    newPosition.x = screenWidth / 2 - border * 2;
                }
                else if (column != 0)
                {
                    newPosition.x = generatePoint.x + Random.Range(-border / 2, border);
                }                 

                newPosition.y = startHeight - roomGapY * i;
                var room = Instantiate(roomPrefab, newPosition, Quaternion.identity, transform);
                rooms.Add(room);
            }
        }
    }

使生成更加便利

每次运行才生成地图,效率太低了。我们可以新增一个ReGenerateRoom方法,并给它添加ContextMenu注解

    // 重新生成地图
    [ContextMenu("ReGenerateRoom")]
    public void ReGenerateRoom()
    {
        foreach (var room in rooms)
        {
            Destroy(room.gameObject);
        }

        rooms.Clear();

        CreateMap();
    }

使用的位置是在 MapGenerator 组件上右键,然后单击 ReGenerateRoom

这样就能在不重启的前提下,再次快速生成地图了

项目相关代码

代码仓库:https://gitee.com/nbda1121440/DreamOfTheKingdom.git

标签:20240301_2218

标签:04,column,地图,生成,screenHeight,newPosition,var,screenWidth,border
From: https://www.cnblogs.com/hellozjf/p/18048124

相关文章

  • Ubuntu 22.04 遇到的一些软件安装问题记录
    1.截图工具flameshot不能正常使用,这是因为对wayland支持不好引起的,换成Xorg,编辑/etc/gdm3/custom.conf,打开入下选项,保存重启即可。 2.音乐播放器clementine不能正常播放.wma文件,报错Yourgstreamerinstallationismissingaplugin,如下安装一个库即可,$sudo......
  • 03. 设计地图配置表
    更新Hierarchy从Hierarchy中删除了RoomPrefab,然后增加了MapGenerator,并在MapGenerator上面挂载了MapGenerator脚本MapGenerator脚本这个脚本的作用是配置地图上的房间信息(每一列有min~max个房间,这些房间可以是什么类型),然后在Awake的时候获取当前屏幕的高度......
  • 04应用程序简介1
    应用程序简介1在Windows系统中,应用程序(软件)的本质是文件.最常见的应用程序文件的类型是.exe文件.我们将从软件的安装,绿色软件,单文件应用程序等几个方面进行介绍.软件的安装一般情况下,我们所使用的很多软件都是需要经过安装流程才能使用的.安装软件的应用程序叫做安装包.......
  • (4 核,64 位)处理器LS1043AXN8QQB、LS1043AXN8KQA、LS1043AXN8PQA专为小规格网络、工业
    介绍Layerscape®LS1043A处理器是一款面向嵌入式网络的四核64位Arm®处理器。LS1043A可通过支持无风扇设计的灵活I/O封装,提供超过10Gbps的性能。这款SoC是专为小规格网络、工业和汽车应用而打造的解决方案,针对经济型低端PCB优化了物料成本(BOM),降低了电源成本,采用单时钟设计。......
  • 实战2-__jsl_clearance_s 生成
    目标网站aHR0cHM6Ly96cnp5aGdoai5oZWZlaS5nb3YuY24veHd6eC9ic2R0L2luZGV4Lmh0bWw=1.简单介绍加速乐是创宇推出的一款在线免费网站CDN加速、网站安全防护平台,致力于系统化解决网站访问速度过慢及网站反黑客问题加速乐三步骤a.第一次请求,响应码521,服务器返回的Cookie中携带......
  • vue项目引入高德地图报错:Map container div not exist (火狐浏览器不加载地图)
    问题描述:谷歌浏览器正常显示地图,火狐浏览器不加载,并且报错:  Mapcontainerdivnotexist错误代码如下:  修改后代码如下:  参考大佬:https://blog.csdn.net/white_777/article/details/128286558  ......
  • ems案例第一阶段 验证码生成
    验证码生成步骤:controller代码packagecom.baizhi.controller;importcom.baizhi.utils.VerifyCodeUtils;importorg.springframework.stereotype.Controller;importorg.springframework.web.bind.annotation.RequestMapping;importjavax.servlet.ServletOutputStrea......
  • python生成Excel文件减少使用内存
    1、openpyxl模块生成2、xlsxwriter模块contant_memory=True生成TRANSLATEwithxEnglishArabicHebrewPolishBulgarianHindiPortugueseCatalanHmongDawRomanianChineseSimplifiedHungarianRussianChineseTraditionalIndonesianSlovak......
  • pageoffice6后台生成单个PDF文档
    转载:后台生成单个PDF文档#后台生成单个PDF文档注意本文中展示的代码均为关键代码,复制粘贴到您的项目中,按照实际的情况,例如文档路径,用户名等做适当修改即可使用。在实际项目中经常遇到这样的场景,客户希望后台动态生成PDF文档,目前网上有一些针对此需求的方案,如果您想要了解这些......
  • Python 爬虫自动生成 request heads 网站
    前言全局说明一、获取curl信息网页右键--检查--网络,里找到需要的那个文件。文件上右键选择复制--复制位curl(bash)Chrome效果:Edge效果:然后把复制内容放到下面网站中二、生成requestheadshttps://curlconverter.com免责声明:本号所涉及内容仅供......