2014-11-21 2 views
3

Я не нашел способа назначить крючки на что угодно, и если бы я мог, это было бы очень полезно. Кроме того, как я могу проверить, существует ли игровой объект? (т. е. не умер от возраста и не был уничтожен врагом).Можно ли назначить функциональные крючки игровым объектам, например. запустить функцию по init, death и т. д.?

ответ

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

Не могли бы вы привести пример кода? Благодаря! – Pineapple

+1

Я отредактировал свой ответ. – artch

+0

Спасибо! Есть ли в настоящее время какой-либо способ проверить смерть без худшего случая, повторяя все крипы в игре? – Pineapple

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); 
    } 
} 
+1

В этой ситуации условный «if (creep.hits <= 0)» является допустимым способом проверить, умерла ли ползучесть? – Pineapple

+0

Хороший вопрос, я проверю это и ответ скоро –

+0

Я создал модуль защиты (обновил ответ) и по какой-то причине «if (creep.hits <= hit_threshold)» не работает. –

3

Вот мой случай использования:

  1. Подсчитайте количество враждебных (N) в текущей комнате
  2. Подсчитайте количество живых охранников (C)
  3. Если с < Н затем построить еще один охранник

Через некоторое время, при использовании Room.find(Game.MY_CREEPS), Я тоже получу мертвых охранников. Отфильтровывать их все время очень больно, а глобальный Memory продолжает их перечислять. Есть ли способ удалить мертвые крипы из глобального объекта Memory?

[EDIT] Нашли это, надеюсь, это поможет.

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

я запускаю его в начале каждого клеща

1

Я раздвоенный на шрифтовиках образцов репозитория и сделал свои собственное событие код обработки - https://github.com/pineapplemachine/script-samples/tree/master/hooks

С помощью этого сценария можно назначить инициализации, обновление, и методы уничтожения событий, а не необходимость обрабатывать вещи более тупо.