Выразительный JavaScript (Хавербеке) - страница 163

>    var other = this.actors[i];

>    if (other != actor &&

>        actor.pos.x + actor.size.x > other.pos.x &&

>        actor.pos.x < other.pos.x + other.size.x &&

>        actor.pos.y + actor.size.y > other.pos.y &&

>        actor.pos.y < other.pos.y + other.size.y)

>      return other;

>  }

>};

Актёры и действия

Метод >animate типа >Level даёт возможность всем актёрам уровня сдвинуться. Аргумент >step задаёт временной промежуток. Объект >keys содержит информацию про стрелки клавиатуры, нажатые игроком.

>var maxStep = 0.05;


>Level.prototype.animate = function(step, keys) {

>  if (this.status != null)

>    this.finishDelay -= step;


>  while (step > 0) {

>    var thisStep = Math.min(step, maxStep);

>    this.actors.forEach(function(actor) {

>      actor.act(thisStep, this, keys);

>    }, this);

>    step -= thisStep;

>  }

>};

Когда у свойства уровня >status есть значение, отличное от >null (а это бывает, когда игрок выиграл или проиграл), мы уменьшить до нуля счётчик >finishDelay, считающий время между моментом, когда произошёл выигрыш или проигрыш и моментом, когда надо заканчивать показ уровня.

Цикл >while делит временной интервал на удобные мелкие куски. Он следит, чтобы промежутки были не больше >maxStep. К примеру, шаг в 0,12 секунды будет нарезан на два шага по 0,05 и остаток в 0,02

У объектов актёров есть метод >act, который принимает временной шаг, объект >level и объект >keys. Вот он для типа >Lava, который игнорирует объект key:

>Lava.prototype.act = function(step, level) {

>  var newPos = this.pos.plus(this.speed.times(step));

>  if (!level.obstacleAt(newPos, this.size))

>    this.pos = newPos;

>  else if (this.repeatPos)

>    this.pos = this.repeatPos;

>  else

>    this.speed = this.speed.times(-1);

>};

Он считает новую позицию, добавляя результат умножения временного промежутка и текущей скорости к старой позиции. Если новую позицию не занимает препятствие, происходит перемещение. Если препятствие существует, поведение зависит от типа блока лавы. У капающей лавы есть свойство >repeatPos, и она при встрече с препятствием отражается в обратную сторону. Прыгающая лава просто инвертирует скорость (умножает на -1), чтобы продолжить движение в обратном направлении.

Монеты используют метод >act, чтобы дрожать. Столкновения они игнорируют, поскольку они просто подрагивают внутри своего квадрата, а столкновения с игроком будут обрабатываться методом >act игрока.

>var wobbleSpeed = 8, wobbleDist = 0.07;


>Coin.prototype.act = function(step) {

>  this.wobble += step * wobbleSpeed;

>  var wobblePos = Math.sin(this.wobble) * wobbleDist;

>  this.pos = this.basePos.plus(new Vector(0, wobblePos));