You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

编程新手求助:实现卡车到达目的地后切换路线及循环运输逻辑

嘿,看你的描述,我大概清楚你卡在哪了——卡车跑完第一个站点就“罢工”,还没实现往返搅拌站的循环对吧?我给你拆解下解决方案,一步步来:

第一步:先搞定「到达站点后切换目标」的核心逻辑

首先你得有个靠谱的方法判断卡车确实到达了当前目的地,毕竟直接用坐标完全相等容易因为精度问题卡壳。比如用距离阈值来判断:

// 计算卡车位置和目标的距离,小于5像素就算到达(阈值可以自己调)
function isTruckArrived(truckPos, targetPos) {
  const deltaX = truckPos.x - targetPos.x;
  const deltaY = truckPos.y - targetPos.y;
  return Math.sqrt(deltaX * deltaX + deltaY * deltaY) < 5;
}

接下来,在你每帧更新卡车状态的函数里(比如update()或者draw()循环里),加个判断:如果到达了当前目标,就切换到下一个。

第二步:管理运输路线的循环顺序

你需要两个变量来跟踪状态:

  • currentTargetIndex:记录当前要去的是路线里的第几个目标
  • deliveryRoute:存储完整的运输路径,顺序是「第一个站点 → 第二个站点 → 搅拌站」

比如初始化代码可以这么写:

let currentTargetIndex = 0;
let deliveryRoute = [];
const concretePlantPos = { x: 100, y: 100 }; // 替换成你的搅拌站初始位置

// 当用户添加站点后,更新运输路线(确保至少有2个站点才生效)
function refreshDeliveryRoute() {
  if (sites.length >= 2) {
    // 按顺序组装路线:第一个站点→第二个→回到搅拌站
    deliveryRoute = [sites[0], sites[1], concretePlantPos];
  } else {
    // 站点不够2个,让卡车待在搅拌站
    deliveryRoute = [concretePlantPos];
    currentTargetIndex = 0;
  }
}

// 把这个函数绑定到你的mousePress添加站点的逻辑里,每次加完站点就调用
// 比如在mousePress处理函数末尾加:refreshDeliveryRoute();

然后在更新卡车的循环里,加入到达判断和目标切换:

function updateTruck() {
  if (deliveryRoute.length === 0) return; // 没路线就啥也不干

  const currentTarget = deliveryRoute[currentTargetIndex];
  // 这里放你原来的卡车移动逻辑:朝着currentTarget移动
  moveTruckToTarget(currentTarget);

  // 检查是否到达
  if (isTruckArrived(truck.position, currentTarget)) {
    // 切换到下一个目标
    currentTargetIndex++;
    // 如果已经走完一轮(到了搅拌站),重置索引实现循环
    if (currentTargetIndex >= deliveryRoute.length) {
      currentTargetIndex = 0;
      // 可以加个延迟,比如让卡车在搅拌站停2秒再出发,更真实
      setTimeout(() => {
        currentTargetIndex = 0;
      }, 2000);
    }
  }
}

// 你的卡车移动函数示例(如果还没写的话)
function moveTruckToTarget(target) {
  const speed = 2; // 调整移动速度
  const dx = target.x - truck.position.x;
  const dy = target.y - truck.position.y;
  const distance = Math.sqrt(dx * dx + dy * dy);
  
  if (distance > 0) {
    // 归一化方向,避免斜着走更快
    truck.position.x += (dx / distance) * speed;
    truck.position.y += (dy / distance) * speed;
  }
}

第三步:处理一些边界小问题

  • 如果用户还没加够2个站点,让卡车停在搅拌站,不要乱跑
  • 移动逻辑里要做归一化,不然卡车斜着走会比直着走快,显得奇怪
  • 调试的时候可以在控制台打印currentTargetIndex和当前目标的坐标,看切换是否正常

这样调整后,卡车就能按「搅拌站→站点1→站点2→搅拌站」的顺序循环跑起来啦!

内容的提问来源于stack exchange,提问作者Lilly

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:32:49