Книга: Выразительный JavaScript
Обработчики действий
Обработчики действий
Самое простое действие – рост, его используют растения. Когда возвращается объект action типа {type: "grow"}
, будет вызван следующий метод-обработчик:
actionTypes.grow = function(critter) {
critter.energy += 0.5;
return true;
};
Рост всегда успешен и добавляет половину единицы к энергетическому уровню растения.
Движение получается более сложным.
actionTypes.move = function(critter, vector, action) {
var dest = this.checkDestination(action, vector);
if (dest == null ||
critter.energy <= 1 ||
this.grid.get(dest) != null)
return false;
critter.energy -= 1;
this.grid.set(vector, null);
this.grid.set(dest, critter);
return true;
};
Это действие вначале проверяет, используя метод checkDestination
, объявленный ранее, предоставляет ли действие допустимое направление. Если нет, или же в том направлении не пустой участок, или же у существа недостаёт энергии – move
возвращает false
, показывая, что действие не состоялось. В ином случае он двигает существо и вычитает энергию.
Кроме движения, существа могут есть.
actionTypes.eat = function(critter, vector, action) {
var dest = this.checkDestination(action, vector);
var atDest = dest != null && this.grid.get(dest);
if (!atDest || atDest.energy == null)
return false;
critter.energy += atDest.energy;
this.grid.set(dest, null);
return true;
};
Поедание другого существа также требует предоставления допустимой клетки направления. В этом случае клетка должна содержать что-либо с энергией, например существо (но не стену, их есть нельзя). Если это подтверждается, энергия съеденного переходит к едоку, а жертва удаляется с сетки.
И наконец, мы позволяем существам размножаться.
actionTypes.reproduce = function(critter, vector, action) {
var baby = elementFromChar(this.legend,
critter.originChar);
var dest = this.checkDestination(action, vector);
if (dest == null ||
critter.energy <= 2 * baby.energy ||
this.grid.get(dest) != null)
return false;
critter.energy -= 2 * baby.energy;
this.grid.set(dest, baby);
return true;
};
Размножение отнимает в два раза больше энергии, чем есть у новорожденного. Поэтому мы создаём гипотетического отпрыска, используя elementFromChar
на оригинальном существе. Как только у нас есть отпрыск, мы можем выяснить его энергетический уровень и проверить, есть ли у родителя достаточно энергии, чтобы родить его. Также нам потребуется допустимая клетка направления.
Если всё в порядке, отпрыск помещается на сетку (и перестаёт быть гипотетическим), а энергия тратится.
- Какие обработчики нижних половин необходимо использовать
- Диаграммы последовательности действий
- Исключения и обработчики исключений
- Отмена ошибочных действий
- Диаграммы взаимодействий
- Реализация очередей отложенных действий
- Ограничение действий конкурентов
- Использование очередей отложенных действий
- 6. План действий на месяц
- Инкапсуляция действий со ссылками
- Диаграммы последовательности действий и граничные классы
- Обработчики прерываний