【问题标题】:Is Creep.moveTo() a non-blocking method?Creep.moveTo() 是非阻塞方法吗?
【发布时间】:2015-11-06 22:56:01
【问题描述】:
        // 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);

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

【问题讨论】:

    标签: screeps


    【解决方案1】:

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

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

    【讨论】:

    • 一时间,对脚本的执行方式感到困惑。当然,你是对的,每跳一次。
    【解决方案2】:

    没有必要取消creep.moveTo(),因为它只命令cree每刻做一次移动。您可以通过选择不在creep 上调用moveTo() 方法来停止移动。

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

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

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

    【讨论】:

      猜你喜欢
      • 2018-02-09
      • 1970-01-01
      • 1970-01-01
      • 2012-11-13
      • 2014-10-19
      • 1970-01-01
      • 2023-03-19
      • 1970-01-01
      • 2019-09-20
      相关资源
      最近更新 更多