当前位置: 首页 > news >正文

a星学习记录 通过父节点从目的地格子坐标回溯起点

// endnode是终点(目标格子)while(currentNode){// 只要还有父节点,就继续回溯path.unshift({x:currentNode.x,y:currentNode.y});// 从头部插入currentNode=currentNode.parent;// 指向父节点(上一个格子)}

这个过程:
终点 → 父节点 → 父节点的父节点 → … → 起点

例如路径:起点(0,0) → (1,0) → (2,0) → 终点(3,0)
A*算法链接:终点.parent = (2,0), (2,0).parent = (1,0), (1,0).parent = (0,0)

用 unshift() 插入后得到的 path:

JAVASCRIPT[{x:0,y:0},// 起点(因为unshift,最早插入的最后在数组开头){x:1,y:0},{x:2,y:0},{x:3,y:0}// 终点(第一个插入的)]
  1. 路径存储与初始化
TYPESCRIPT this.path=path;// 存储整个路径数组this.currentPathIndex=1;// 从索引1开始移动

为什么要从1而不是0开始?

索引0:角色的当前起点位置
索引1:要移动到的第一个格子
索引2:第二个格子

最后一个索引:终点

例如:path=[(0,0),(1,0),(2,0),(3,0)]JAVASCRIPT// currentPathIndex = 1 意味着:path[0]=(0,0)← 角色就在这里(跳过) path[1]=(1,0)← 这是第一个要移动到的点 ⭐
  1. 发送路径到网格显示
TYPESCRIPT this.sendPathToGrid(path);// 让gezi组件把路径画出来(显示为9)
  1. 延迟启动移动
TYPESCRIPT this.scheduleOnce(()=>{this.startMoving();// 延迟一帧后调用startMoving},0);

为什么要延迟?

确保路径数据已经完全处理
给gezi组件时间绘制路径
Cocos更新机制需要
后续流程(不在这个代码段中)
5. startMoving() 方法

TYPESCRIPTstartMoving(){if(this.path.length<=1){// 检查路径是否有效console.log("没有找到路径或路径太短");return;}console.log(`开始移动,路径共有 ${this.path.length} 个点`);this.moveToNextPoint();// 调用移动方法}
  1. moveToNextPoint() 方法
    TYPESCRIPT
moveToNextPoint(){if(this.currentPathIndex>=this.path.length){console.log("到达目的地!");return;}consttarget=this.path[this.currentPathIndex];// 获取当前目标点console.log(`移动到第 ${this.currentPathIndex} 个点:[${target.x}, ${target.y}]`);// 转换为世界坐标并移动constworldPos=this.gridComponent.gridToWorldPosition(target.x,target.y);this.moveNodeTo(worldPos);}
  1. moveNodeTo() 方法(执行移动动画)
TYPESCRIPTmoveNodeTo(targetPosition:Vec3){tween(this.node)// 播放Tween动画.to(duration,{worldPosition:targetPosition}).call(()=>{// 动画完成后,继续下一个点this.currentPathIndex++;// ⭐ 关键:增加索引if(this.currentPathIndex<this.path.length){this.moveToNextPoint();// 递归调用}}).start();}

完整移动流程图示
TEXT
fujiedian() → 构建路径回溯

存储路径 this.path = […]

currentPathIndex = 1 // 跳过起点

this.startMoving()

this.moveToNextPoint()

获取目标点 this.path[1] → 坐标转换

this.moveNodeTo(坐标) // 移动动画
↓ ↑
完成回调 |
↓ |
this.currentPathIndex++ (→2)

if (索引 < 路径长度)

再次调用 moveToNextPoint() // 处理第2个点

获取目标点 this.path[2] → 坐标转换

继续移动…

http://www.jsqmd.com/news/88477/

相关文章:

  • 2025年回弹仪十大品牌实力盘点,谁主沉浮?裂缝测宽仪/一体式楼板测厚仪/填土密实度检测仪/钢筋位置测定仪/高强回弹仪回弹仪品牌哪家好 - 品牌推荐师
  • JSP如何结合多线程技术提升大文件上传效率?
  • Cursor AI 安装与初始配置:30 分钟快速上手(2025 年 12 月最新版)
  • jd.item_review获取京东商品评论 及tb.item_review获取taobao商品评论
  • 基于Java Swing的打砖块小游戏(1)
  • 如何利用JSP实现100万文件的批量上传?
  • 第十一届中国大学生程序设计竞赛 郑州站(CCPC 2025 Zhengzhou Site)
  • 常见类后续,泛型,文件
  • 蓝桥杯Python-语法基础-2
  • WAN2.2-14B-Rapid-AllInOne实战指南:从零到精通的完整视频生成方案
  • JSP如何整合第三方控件支持大文件上传?
  • OrcaSlicer依赖库实战构建指南:从源码到高性能G代码生成器
  • 8088单板机 NASM汇编实验方法与步骤
  • C++树形数据结构————树状数组、线段树中“逆序对”的问题
  • Flutter工程化实战:从单人开发到团队协作的规范与效率指南
  • yaml-cpp内存优化策略深度解析:从性能瓶颈到高效解决方案
  • Windows11系统文件verifier.dll丢失或损坏问题 下载修复
  • 软件打开出现找不到Vfp6rchs.dll文件 丢失的情况 下载修复
  • 会员管理系统如何成为企业数字化转型的增长核心
  • Comtos Linux 追求的哲学
  • Qwen-Rapid-AIO模型加载异常全面排障:从现象到根治的完整指南
  • Flutter性能优化实战:从卡顿排查到极致体验的落地指南
  • 毕业设计项目 基于机器视觉的目标跟踪算法
  • AI视频创作三步合规法:从风险规避到版权保护实战指南
  • 用了3个月PandaWiki,我终于和知识管理和解了|超省心使用心得
  • 入门C语言学习---从零开始
  • 中高端路由器选购指南:Wi-Fi 7与硬件配置全解析
  • mustache.js实战精通:从入门到高级应用的完整指南
  • Nginx核心架构设计
  • 2025最新数码前置仓/数码外卖仓/数码外卖店品牌合作首选——六米生活,轻创业优选/美团闪购/淘宝闪购/即时零售/小时达加盟领航者值得信赖 - 全局中转站