Creep.moveTo()是一种非阻塞方法吗?

时间:2015-08-13 19:56:12

标签: screeps

        // 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);
        }

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

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

我是否必须使用creep Memory并添加一种类似isMoving: true的状态并跟踪它?

2 个答案:

答案 0 :(得分:4)

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

如果您将多个moveTo发送到creep,它只执行最后一个。因为它之前会覆盖moveTo命令。

答案 1 :(得分:2)

没有必要取消creep.moveTo(),因为它只命令creep每次打勾进行一次移动。通过选择不在蠕变上调用moveTo()方法来停止移动。

然而,我明白为什么人们会错误地相信moveTo()开始沿路径自主行走的蠕变 - 因为moveTo()计算了蠕变需要前往目标的整个路径。这样做每个滴答都会浪费大量的CPU资源,因此moveTo()只能启动每次呼叫的一步移动,这并不完全直观。

了解这真正发生的事情的诀窍是意识到moveTo()每个默认值在Memory下的蠕变_move中缓存计算出的路径属性并且仅在可配置的滴答数量后重新计算新路径(根据文档,默认值为5)。

这也意味着蠕变的moveTo()可能需要最多5个滴答(取决于发生的时间),默认情况下会发现障碍物已经阻止了进一步下行的缓存路径,因此可能会出行朝着障碍物倾斜,直到它选择一条新的无阻碍路径。