系列教程:

  1. 地图编辑器开发(一)加载地图
  2. 地图编辑器开发(二)编辑地图
  3. 地图编辑器开发(三)测试阻挡
  4. 地图编辑器开发(四)导出阻挡信息
  5. 地图编辑器开发(五)导出地图资源

上一节已经把地图加载到游戏中了,这一节主要实现地图的编辑能功能,也是地图编辑器最主要的功能,可以拆分为如下几个功能:

  1. 地图滚动
  2. 地图缩放
  3. 画网格
  4. 编辑格子信息

地图滚动

上一节中加载进来的地图,只显示了地图的一部分,要能编辑整个地图,需要地图能够滚动。因此需要将地图 sprite 放入到一个 ScrollView 中,设置水平和竖直方向都能滚动,删除滚动条,防止挡住地图,如图:


运行结果如下图:

这样地图就滚动了,按住鼠标就能拖动地图。但是还有问题,窗口显示的范围并没有变大,希望能通过缩放,在窗口中显示更多的内容。

地图缩放

在工具栏上,放一个滑块,用于控制地图的缩放比例。监听滑块值变化,在响应函数中,调整地图的宽高。
实现效果如上图所示,核心代码如下:

onScaleChange(slider) {this.mapScale = slider.progress;// 显示地图宽高this.mapW = this.oriW * this.mapScale;this.mapH = this.oriH * this.mapScale;this.ndSvContent.width = this.mapW;this.ndSvContent.height = this.mapH;
},

画网格

A星寻路都是以格子为单位,因此需要将地图划分成很多小格子,然后才能编辑每个格子的数据。Cocos Creator 提供了一个 画图组件,就用这个组件来画网格。在编辑器中,创建一个 Graphic组件,作为地图spMap的子节点,这样格子才会随着地图一起缩放和移动。

为了方便查看,让格子和地图都可以隐藏和显示,在界面上加上复选框。另外,在设置界面中,可以设置格子的大小。做好之后如图:


ui都编辑好之后,就可以写代码实现画格子了。

drawGrid() {this.gphPath.strokeColor = this.colorGrid;this.gphPath.lineWidth = 1;let cnt_w = Math.floor(this.mapW / this.cellW);for (let i = 1; i < cnt_w; i++) {let x = this.cellW * i;this.gphPath.moveTo (x, 0)this.gphPath.lineTo (x, this.mapH);}let cnt_h = Math.floor(this.mapH / this.cellH);for (let i = 0; i < cnt_h; i++) {let y = this.cellH * i;this.gphPath.moveTo (0, y)this.gphPath.lineTo (this.mapW, y);}this.gphPath.stroke();
},

运行可以看到地图已经被划分成了很多小格子,如图:

编辑格子

格子划分好之后,以格子为单位编辑,可以将格子设置阻挡状态,遮罩状态,或者删除已设置的状态,除此之外,鼠标还要完成拖动操作。根据前面的分析,将鼠标分为4种状态,这4种状态是不可以叠加的,可以使用单选框来实现,当修改单选框的值时,更新鼠标的状态。如图:

  1. 当鼠标状态处于拖动状态时,将 ScrollView 设置为可以滚动,其他状态禁止滚动,避免编辑格子时,地图跟着滚动。
  2. 当鼠标处理其他阻挡状态时,获取鼠标所在的格子,然后其状态改为阻挡状态,用红色表示;
  3. 当鼠标处理其他遮罩状态时,获取鼠标所在的格子,然后其状态改为遮罩状态,用蓝色表示;
  4. 当鼠标处理其他清除状态时,获取鼠标所在的格子,然后其状态改为默认状态;
  5. 最后根据格子的状态信息,绘制阻挡和遮罩。

用代码实现上述过程:

onLoad(){this.ndSvContent.on(cc.Node.EventType.TOUCH_START, (event) => {this.udpatePosSt(event);}, this);
}udpatePosSt(event) {let pos = this.getCellPosByEvent(event);if (pos[0] < 0 || pos[0] >= this.blockInfoList.length ||pos[1] < 0 || pos[1] >= this.blockInfoList[0].length) {return;}switch(this.mouseOp) {case 0:break;case 1:this.blockInfoList[pos[0]][pos[1]] = 1;break;case 2:this.blockInfoList[pos[0]][pos[1]] = 2;break;case 3:this.blockInfoList[pos[0]][pos[1]] = 0;break;default:break;}
},drawBlockMask() {for (let x = 0; x < this.blockInfoList.length; x++) {let xList = this.blockInfoList[x];for (let y = 0; y < xList.length; y++) {let st = xList[y];if (st) {this.gphPath.rect(x * this.cellW, y * this.cellH, this.cellW, this.cellH);this.gphPath.fillColor = st == 1 ? this.colorBlock : this.colorMask;this.gphPath.fill();}}}
},

运行结果:

这样编辑器基本上就可以使用了,下一节基于当前编辑的信息,实现一个A星寻路算法,测试当前的地图阻挡信息。

地图编辑器开发(二)相关推荐

  1. 地图编辑器开发(五)

    系列教程: 地图编辑器开发(一)加载地图 地图编辑器开发(二)编辑地图 地图编辑器开发(三)测试阻挡 地图编辑器开发(四)导出阻挡信息 地图编辑器开发(五)导出地图资源 上一节篇尾提到,地图要切成小图 ...

  2. 地图编辑器开发(三)

    系列教程: 地图编辑器开发(一)加载地图 地图编辑器开发(二)编辑地图 地图编辑器开发(三)测试阻挡 地图编辑器开发(四)导出阻挡信息 地图编辑器开发(五)导出地图资源 上一节已经把地图信息编辑做好了 ...

  3. Unity3d开发——保卫萝卜学习笔记一地图编辑器开发

    一直在学习,几乎边学边忘,再也不想打王者农药了,现在打卡学习持续写博客,现在在开发学习保卫萝卜,这篇文章关于地图编辑器的开发,在项目中不能是无限个场景,用读取xml文件的方法可以说是能实现无限关卡,同 ...

  4. 梦幻之旅--地图编辑器开发

    首先,我的地图编辑器是十分简单的,但是网上一个像样的例子也没有,很是无奈,或许是我没有找到吧,不喜欢的勿拍.接下来进入正题.我的地图就比较简单,就是简单的1和0.1表示可走,0表示不可走.接下来先看看 ...

  5. 高德地图js 开发二:添加标记点

    初始化并添加点 var map;//地图对象InitMap(11, [114.312151, 30.58454]);//默认武汉中心坐标//地图初始化function InitMap(zoom, ar ...

  6. 开发地图编辑器_使用地图编辑器开发地图

    存在XML映射以将源XML文档转换为目标XML文档. 映射编辑器获取在"映射编辑器"中创建的映射,并生成XSL文件以在运行时执行实际的XML转换. 在WebSphere Integ ...

  7. 高德地图API开发二三事(一)如何判断点是否在折线上及引申思考

    最近使用高德地图 JavaScript API 开发地图应用,提炼了不少心得,故写点博文,做个系列总结一下,希望能帮助到LBS开发同胞们. 项目客户端使用高德地图 JavaScript API,主要业 ...

  8. 游戏开发:Html5版宝可梦 Pokémon 游戏制作与设计思路分享(二)地图编辑器

    经过不懈的努力,终于迎来了更新,还会继续更新后续内容. 可能会加一些魔改的功能和玩法--^ ^ 大家可以一起讨论有趣思路 更新已完成的功能: 1.地图编辑器 2.角色移动碰撞检测 . 新实现的功能和大 ...

  9. Tiled有java版本吗_【Cocos2d-X开发学习笔记】开发工具之Tiled地图编辑器的使用

    Cocos2D-X支持Tiled地图编辑器生成的地图数据文件.Tiled地图编辑器是一个以广泛使用为目标的地图编辑html 器,它使用简单而且能够轻松地在不一样的引擎中使用.目前最新版本使用Qt框架进 ...

  10. 腾讯地图api修改信息窗口样式_DOTA2 地图编辑器指南(二):总览

    做什么地图 作为一个打算把流程讲得详细一点的教程,是不太好做什么庞大的项目的.我们的目的还是学会制作工具和熟悉制作流程,只要学会了工具,就有能力实现自己心目中的项目了.到时候更加要求的其实是创意. 所 ...

最新文章

  1. qt调用linux 进程,Linux 下qt 程序打包发布(使用linuxdelpoyqt ,shell 脚本)
  2. python 保存本地乱码_请教大神,如何解决保存后的文件的乱码问题
  3. SQl---基础整理5
  4. graph slam tutorial : 从推导到应用1
  5. ioctl(), ioctl_socket()
  6. C++自学26:联合体(union/17)
  7. 关于微信wx.getUserInfo使用不了的问题
  8. SQL注入漏洞与参数化查询
  9. .net4.0切换2.0时,SplitContainer”的对象强制转换为类型
  10. Red Bend与阿朗推LTE移动设备管理 使4G设备兼容OMA DM
  11. oracle 中符号%3e,Oracle 数据类型
  12. 贪心 :PIPI渡江
  13. MySQL面试常问大全
  14. UDF函数和UDTF函数的图解举例,追加UDAF函数
  15. 支付宝微信个人免签支付
  16. GAMES101 作业0 环境配置 PC下简单配置i
  17. Web scraper使用教程-进阶用法(二)-爬取二级页面内容
  18. mysql修改重复数据You can‘t specify target table ‘‘ for update in FROM clause
  19. 【Python windows11修改器 】——制作一个简易的修改器,修改windwos11右键和一些小功能
  20. 热电偶技术及热电偶仿真原理

热门文章

  1. 2021毓英中学高考成绩查询,泉州知名中学2020高考成绩喜报大集合(7.26更新)
  2. 【python学习笔记】初见
  3. 入门OJ:郭嘉的消息传递
  4. 国内某厂商摄像头敏感信息泄露漏洞事件分析
  5. 盗贼之海服务器维护时间,盗贼之海常见问题解决方法
  6. 减法公式运算法则_六年级数学各种运算法则与学习方法
  7. 钢琴网页制作教程_钢琴
  8. WEB/HTTP服务器搭建
  9. 【线性代数笔记】幂等矩阵的性质
  10. 美国弗吉尼亚大学计算机科学,弗吉尼亚大学计算机科学专业