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

go 复制代码
// 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:

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

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

索引0:角色的当前起点位置

索引1:要移动到的第一个格子

索引2:第二个格子

...

最后一个索引:终点

go 复制代码
例如:path = [(0,0), (1,0), (2,0), (3,0)]

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

为什么要延迟?

确保路径数据已经完全处理

给gezi组件时间绘制路径

Cocos更新机制需要

后续流程(不在这个代码段中)

  1. startMoving() 方法
go 复制代码
TYPESCRIPT
startMoving() {
    if (this.path.length <= 1) {  // 检查路径是否有效
        console.log("没有找到路径或路径太短");
        return;
    }
    
    console.log(`开始移动,路径共有 ${this.path.length} 个点`);
    this.moveToNextPoint();  // 调用移动方法
}
  1. moveToNextPoint() 方法
    TYPESCRIPT
go 复制代码
moveToNextPoint() {
    if (this.currentPathIndex >= this.path.length) {
        console.log("到达目的地!");
        return;
    }
    
    const target = this.path[this.currentPathIndex];  // 获取当前目标点
    console.log(`移动到第 ${this.currentPathIndex} 个点:[${target.x}, ${target.y}]`);
    
    // 转换为世界坐标并移动
    const worldPos = this.gridComponent.gridToWorldPosition(target.x, target.y);
    this.moveNodeTo(worldPos);
}
  1. moveNodeTo() 方法(执行移动动画)
go 复制代码
TYPESCRIPT
moveNodeTo(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.path1 → 坐标转换

↓

this.moveNodeTo(坐标) // 移动动画

↓ ↑

完成回调 |

↓ |

this.currentPathIndex++ (→2)

↓

if (索引 < 路径长度)

↓

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

↓

获取目标点 this.path2 → 坐标转换

↓

继续移动...

相关推荐
旖旎夜光14 分钟前
【C++ 基础入门】命名空间、输入输出、缺省参数与函数重载
开发语言·c++·笔记·学习
m4Rk_31 分钟前
【论文阅读】Agent 记忆机制(119):EvoLife——让具身 Agent 把主动问到的答案沉淀为可复用的空间经验
论文阅读·人工智能·学习·开源·github
程序猿乐锅1 小时前
万字详解Single-flight(单飞模式)
java·开发语言·分布式·后端·学习·single-flight
赵谨言3 小时前
多语种在线语言学习平台LinguaVerse的设计与实现毕业论文
学习
東隅已逝,桑榆非晚3 小时前
算法3.双指针法-快乐数
c++·笔记·学习·算法
li星野4 小时前
Regular and Irregular Nouns — One-Page A4 Notes
学习
Z21-X5 小时前
云原生运维实战笔记:华为云存储类服务全景解析——EVS、OBS、SFS与CBR深度实践
运维·笔记·学习·云原生·华为云
视觉小萌新17 小时前
AI Class 3 · Chapter 1:变量、字符串、list/dict、if/for(python学习-小白版-有经验可跳过)
python·学习·list
yyyang8820 小时前
蓝牙系统整体架构详解
学习·信息与通信
Linux-lucky21 小时前
46-Linux学习之旅之LVS负载均衡与keepalived高可用
linux·运维·学习·ubuntu·负载均衡·lvs