2
        // Creep has Energy packed
        creep.say('E: ' + creep.carry.energy);
        if (creep.carry.energy > 0) {
            creep.moveTo(creep.room.controller);
            creep.upgradeController(creep.room.controller);
        }
        // Creep has no Energy
        else {
            creep.moveTo(Game.spawns.Spawn1);
            Game.spawns.Spawn1.transferEnergy(creep, creep.carryCapacity);
            creep.moveTo(creep.room.controller);
            creep.upgradeController(creep.room.controller);
        }

上面的代码应该发送一个cree来升级控制器。当它没有能量时,它应该去产卵区并得到一些。但它没有移动到 spawn 处,而是停留在控制器处。

问题:取消哪个命令creep.moveTo(Game.spawns.Spawn1);

我是否必须使用creeMemory并添加一种状态isMoving: true并跟踪它?

4

2 回答 2

4

这正是你命令小兵去做的事情。最后第三行将 moveTo 更改为控制器。删除此行和以下行。

如果你向creep发送多个moveTo,它只会执行最后一个。因为它覆盖了之前的 moveTo 命令。

于 2015-08-14T13:40:14.280 回答
2

不需要取消 a creep.moveTo(),因为它只命令cree 每刻做一次移动。您通过选择不调用moveTo()蠕变上的方法来停止移动。

但是,我明白为什么人们会错误地认为moveTo()蠕变是在沿着一条路径自主行走时开始的——因为moveTo()它会计算蠕变到达目标所需的整个路径。这样做每个滴答都会浪费大量的 CPU 资源,因此moveTo()每次调用只启动一个移动步骤并不完全直观。

理解这确实发生的事情的诀窍是意识到默认情况下会将计算的路径缓存在属性下moveTo()的蠕变中,并且仅在可配置数量的滴答声后重新计算新路径(根据文档,默认为 5 个)。Memory_move

这也意味着moveTo()默认情况下,creep 可能需要多达 5 个滴答声(取决于发生的时间)才能意识到障碍物已经阻挡了更远的缓存路径,因此可能会向障碍物移动一段时间,直到它选择一个新的无障碍小路。

于 2016-11-09T20:41:40.497 回答