系列教程:

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

上一节已经把地图信息编辑做好了,这一节实现对编辑好的地图信息进行测试。主要实现以下功能:

  1. A星寻路
  2. 显示路径
  3. 角色移动

A星寻路

A星寻路算法的基本概念,参考维基百科,算法核心有以下几个点:

  • 开放列表和关闭列表
  • 按 f 值排序
  • 回溯路径

推荐一个视频教程,概念,算法过程,实现都讲得非常详细。

A星寻路算法最终要实现的是,传入地图信息,起点和终点,得到一个从起点到终点的路径,即从起点到终点所经过的格子列表。核心代码如下:

 // 把起点放入开启列表中this.openList.push(this.fromNode);let cur;while(true) {// 从开启列表中取出消耗最少的节点(已拍下,取最后一个节点)cur = this.openList.pop();// 如果是终点,则返回路径if (cur === this.toNode) {let pathList = [];pathList.push(cur);let end = cur;while(end.last) {pathList.unshift(end.last);end = end.last;}return pathList;} else {// 不是终点,则加入到关闭列表中this.closeList.push(cur);}// 将当前点周围的点,放入开启列表this.searchRound(cur);// 死路判断if (this.openList.length === 0) {return;}// 排序,保证最后一个消耗最少this.openList.sort((a, b) => {return b.f - a.f;});}

显示路径

使用A星寻路找出路径之后,把找出的路径显示出来,便于观察。显示路径的方法是把找出的格子画成绿色。主要代码如下:

drawPath() {let node;for (let i = 0; i < this.pathList.length; i++) {let node = this.pathList[i];this.gphPath.rect(node.x * this.cellW, node.y * this.cellH, this.cellW, this.cellH);this.gphPath.fillColor = this.colorPath;this.gphPath.fill();}
},

运行结果:

角色移动

为了方便设置起点和终点,添加一个图标作为游戏玩家,拖动游戏玩家设置寻路的起点,之后鼠标点击的位置,作为寻路的终点。另外在在工具栏加一个测试按钮,区分测试和正常编辑这两个状态。

还是不够直观,再把角色移动的路径也画出来,代码如下:

void drawTrack() {this.gphPath.strokeColor = this.colorPathLine;this.gphPath.lineWidth = 5;let pre;for (let i = 1; i < this.pathList.length; i++) {pre = this.pathList[i - 1];this.gphPath.moveTo ((pre.x + 0.5) * this.cellW, (pre.y + 0.5) * this.cellH)node = this.pathList[i];this.gphPath.lineTo ((node.x + 0.5) * this.cellW, (node.y + 0.5) * this.cellH);}
}

这样就能直观的看到角色移动时所经过的格子和行动的轨迹。

辅助工具都有了,最后就是让角色移动起来,为了简单直接使用 cocos creator 提供的动画来实现。给角色挂上一个脚本,将寻路算法返回的路径列表传递给该脚本,然后实现一个移动到指点格子的方法,逐个将路径中的点传递给该方法。

runToNext() {this.srcNode = this.pathList[this.toIndex];this.toIndex += 1;this.dstNode = this.pathList[this.toIndex];let node = this.pathList[this.toIndex];if (node) {this.runTo((node.x + 0.5) * this.cellW, (node.y + 0.5) * this.cellH);}
},runTo(x, y){// 移动方向let dir = [this.dstNode.x - this.srcNode.x, this.dstNode.y - this.srcNode.y];let rad = Math.atan2(dir[1], dir[0]);let angle = 180/Math.PI * rad;this.node.angle = angle;// 移动时间tm = 0.2;if (this.srcNode.x !== this.dstNode.x && this.srcNode.y !== this.dstNode.y) {// 斜方向移动距离更长,时间要长一点tm *= 1.4;}cc.tween(this.node).to(tm, {position: cc.v2(x, y)}).call(() => {this.runToNext()}).start()
},

其中两个小点要注意:

  • 斜方向移动时,距离相交竖直和水平移动更长,因此动画时间要放大一点;
  • 角色朝向设置,在角色节点上加了一个小方块表示角色正面,根据移动方向设置角色朝向。

角色移动的过程如下:

测试这一块到这里就差不多了,下一节再看导出地图数据。

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

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

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

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

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

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

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

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

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

  5. SRPG游戏开发(七)第三章 绘制地图 - 四 初步完善地图编辑器(Map Graph)

    返回目录 第三章 绘制地图 四       初步完善地图编辑器(Map Graph) 到目前为止我们可以开心的绘制我们的地图了,但有不少小问题.一直开心忘我的绘制地图,却不知道地图已经绘制了多大,还要 ...

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

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

  7. Android游戏开发之地图编辑器的使用以及绘制地图 (四)

    雨松MOMO带你走进游戏开发的世界之地图编辑器的使用以及绘制地图 雨松MOMO原创文章如转载,请注明:转载至我的独立域名博客雨松MOMO程序研究院,原文地址:http://www.xuanyusong ...

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

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

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

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

最新文章

  1. Winserver2012R2 部署密钥恢复代理
  2. 用费曼技巧自学编程,香不香?
  3. VTK:图片之ImageText
  4. 多个查询语句能否一次把结果导出_mysql表中base64格式数据查询
  5. EF ++属性会更新实体
  6. linux 升级centos7,Linux之从Centos 6.x 升级Centos7
  7. c语言程序设计报告用于医院食品加工等部,南开(本部)《C语言程序设计》14春在线作业答案...
  8. idea在创建类时在File Header中加入昵称和时间等
  9. JSON字符串和对象之间的转换
  10. pdf裁边app_哪款手机PDF阅读APP值得推荐?
  11. UGUI LongText
  12. ATX电源的工作原理
  13. lucas–kanade_Lucas–Kanade光流算法
  14. 为什么计算机关机慢,XP系统为什么电脑关机慢?
  15. 运行时错误‘53’:文件未找到:MathPage.WLL
  16. linux 开源视频剪辑,Linux 上的开源视频剪辑软件Olive
  17. matlab mysql建系统_能环水体治理项目(Mysql数据库,Matlab创建GUI界面)【一】
  18. python数组内运算_Python数组介绍和操作运算详解
  19. openGL结合光照与纹理
  20. HTML(Basic) Chapter4(Pink) 综合案例小米商城产品模块

热门文章

  1. 医院排队叫号分诊管理系统(分诊+排队叫号+大屏)
  2. 用 leangoo进行自我账目管理
  3. 拆解APP北极星指标——DAU
  4. excel怎么启用宏_如何用Excel制作一个高逼格的项目管理模板
  5. 第09期精品旅游网站
  6. python 下列表达式的值为true的是_下列表达式的值为True的是( )。_学小易找答案...
  7. disabled=true
  8. 什么是非对称加密?非对称加密概念
  9. 空心文字HTML,HTML5绘制空心的文本
  10. Thinkpad E440设置U盘启动的问题