Creep.moveTo() 是非阻塞方法吗?
Is Creep.moveTo() a non-blocking method?
// 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 来升级控制器。当它没有能量时,它应该去出生点取一些。但是它没有移动到重生点,而是停留在控制器上。
问题: 哪个命令正在取消 creep.moveTo(Game.spawns.Spawn1);
?
我是否必须使用 creep 的 Memory
并添加一种类似于 isMoving: true
的状态并跟踪它?
这正是您命令 creep 执行的操作。倒数第三行将 moveTo 更改为控制器。删除这一行和下一行。
如果您向 creep 发送多个 moveTo,它只会执行最后一个。因为它覆盖了之前的 moveTo 命令。
不需要取消 creep.moveTo()
因为它只命令 creep 每刻做一个动作。您可以通过选择不调用 creep 的 moveTo()
方法来停止移动。
但是,我明白了为什么人们会误以为 moveTo()
开始沿着一条路径自主行走 - 因为 moveTo()
计算了 creep 需要到达的整个路径目标。每次 tick 都这样做会浪费大量 CPU 资源,因此 moveTo()
每次调用仅启动一步移动并不完全直观。
理解这就是真正发生的事情的诀窍是认识到 moveTo()
默认情况下将计算的路径缓存在 _move
属性 下的 creep 的 Memory
中,并且仅在可配置的刻度数后重新计算新路径(根据文档,默认为 5 个)。
这也意味着 creep 的 moveTo()
可能需要最多 5 个刻度(取决于何时发生)默认情况下才能意识到障碍物已经阻挡了缓存路径的更下方,因此可能会朝着障碍一点,直到它选择一条新的畅通无阻的路径。
// 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 来升级控制器。当它没有能量时,它应该去出生点取一些。但是它没有移动到重生点,而是停留在控制器上。
问题: 哪个命令正在取消 creep.moveTo(Game.spawns.Spawn1);
?
我是否必须使用 creep 的 Memory
并添加一种类似于 isMoving: true
的状态并跟踪它?
这正是您命令 creep 执行的操作。倒数第三行将 moveTo 更改为控制器。删除这一行和下一行。
如果您向 creep 发送多个 moveTo,它只会执行最后一个。因为它覆盖了之前的 moveTo 命令。
不需要取消 creep.moveTo()
因为它只命令 creep 每刻做一个动作。您可以通过选择不调用 creep 的 moveTo()
方法来停止移动。
但是,我明白了为什么人们会误以为 moveTo()
开始沿着一条路径自主行走 - 因为 moveTo()
计算了 creep 需要到达的整个路径目标。每次 tick 都这样做会浪费大量 CPU 资源,因此 moveTo()
每次调用仅启动一步移动并不完全直观。
理解这就是真正发生的事情的诀窍是认识到 moveTo()
默认情况下将计算的路径缓存在 _move
属性 下的 creep 的 Memory
中,并且仅在可配置的刻度数后重新计算新路径(根据文档,默认为 5 个)。
这也意味着 creep 的 moveTo()
可能需要最多 5 个刻度(取决于何时发生)默认情况下才能意识到障碍物已经阻挡了缓存路径的更下方,因此可能会朝着障碍一点,直到它选择一条新的畅通无阻的路径。