是否可以为游戏对象分配函数钩子,例如在init,death等上运行函数?

时间:2014-11-21 15:52:52

标签: javascript screeps

我还没有找到任何方法来为任何东西分配钩子,如果可以的话,它会非常有用。另外,如何检查游戏对象是否仍然存在? (即没有死于年龄,也没有被敌人摧毁。)

4 个答案:

答案 0 :(得分:4)

如果您的意思是通过API - 还不是。但是您可以更改当前状态并将其与记忆的对象先前状态进行比较。例如,如果Memory中的某些蠕变名称仍然存在,但它已在Game.creeps中消失,则会发生一些事情。

for(var i in Game.creeps) {
    var creep = Game.creeps[i];
    creep.memory.lastSeenAt = {x: creep.pos.x, y: creep.pos.y};
}

for(var i in Memory.creeps) {
    if(!Game.creeps[i]) {
        console.log("Oops! Something happened with a creep "+creep.name+" at "+
            Memory.creeps[i].lastSeenAt.x+","+Memory.creeps[i].lastSeenAt.y);
    }
}

答案 1 :(得分:3)

这是我的用例:

  1. 计算当前房间内的敌人数量(N)
  2. 计算活着的守卫人数(C)
  3. 如果C < N然后建立另一个后卫
  4. 过了一会儿,当使用Room.find(Game.MY_CREEPS)时,我也会得到死警卫。必须一直过滤它们真的很痛苦,全局Memory继续列出它们。有没有办法从全局Memory对象中删除死亡小兵?

    [编辑] 发现这一点,希望它会有所帮助。

    for(var i in Memory.creeps) {
        if(!Game.creeps[i]) {
            delete Memory.creeps[i];
        }
    }
    

    我在每次打勾开始时运行它

答案 2 :(得分:1)

我分叉了脚本示例存储库并创建了我自己的事件处理代码 - https://github.com/pineapplemachine/script-samples/tree/master/hooks

使用该脚本,您可以为事件分配初始化,更新和销毁方法,而不必更加迟钝地处理事务。

答案 3 :(得分:0)

我不这么认为。 API似乎专注于为主游戏循环开发代码,比如在while(true)内编写代码。但是,例如,你可以让你的小兵在他们死之前做点什么。

我已经创建了一个防护模块(就像你在教程中创建的收割机模块一样)。下面的代码应该有效:

module.exports = function (creep) {
    if(creep.hits<=100) { Game.spawns.Spawn1.createCreep([Game.ATTACK, Game.ATTACK, Game.TOUGH, Game.TOUGH, Game.MOVE], "guard2", {role:"guard"}); }

    var targets = creep.room.find(Game.HOSTILE_CREEPS);
    if(targets.length) {
        creep.moveTo(targets[0]);
        creep.attack(targets[0]);
    } else{
        creep.moveTo(Game.spawns.Spawn1);
    }
}