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

>};

Свойство >wobble обновляется, чтобы следить за временем, и потом используется как аргумент >Math.sin для создания волны, которая используется для подсчёта новой позиции.

Остаётся игрок. Движение игрока обрабатывается по разным осям отдельно, потому что встреча с полом не должна мешать горизонтальному перемещению, а встреча со стеной – падению или прыжку. Этот метод работает с горизонтальным перемещением.

>var playerXSpeed = 7;


>Player.prototype.moveX = function(step, level, keys) {

>  this.speed.x = 0;

>  if (keys.left) this.speed.x -= playerXSpeed;

>  if (keys.right) this.speed.x += playerXSpeed;


>  var motion = new Vector(this.speed.x * step, 0);

>  var newPos = this.pos.plus(motion);

>  var obstacle = level.obstacleAt(newPos, this.size);

>  if (obstacle)

>    level.playerTouched(obstacle);

>  else

>    this.pos = newPos;

>};

Перемещение подсчитывается на основе состояния клавиш «направо» и «налево». Когда перемещение приводит к встрече с препятствием, вызывается метод уровня >playerTouched, который обрабатывает гибель в лаве и сбор монеток. В ином случае объект обновляет свою позицию.

Движение по вертикали работает сходным образом, но симулирует прыжки и гравитацию.

>var gravity = 30;

>var jumpSpeed = 17;


>Player.prototype.moveY = function(step, level, keys) {

>  this.speed.y += step * gravity;

>  var motion = new Vector(0, this.speed.y * step);

>  var newPos = this.pos.plus(motion);

>  var obstacle = level.obstacleAt(newPos, this.size);

>  if (obstacle) {

>    level.playerTouched(obstacle);

>    if (keys.up && this.speed.y > 0)

>      this.speed.y = -jumpSpeed;

>    else

>      this.speed.y = 0;

>  } else {

>    this.pos = newPos;

>  }

>};

В начале метода игрок ускоряется по вертикали, чтобы обеспечить гравитацию. Гравитация, скорость прыжка и все остальные константы в игре были подобраны методом проб и ошибок. Я проверял разные значения, пока меня не удовлетворил результат.

Затем мы снова проверяем препятствия. Если мы его встретили, возможны два варианта. Когда нажата клавиша «вверх», и мы двигаемся вниз (то есть, мы встретились с чем-то, что находится под нами), скорости присваивается довольно большое отрицательное значение. В результате игрок прыгает. В ином случае, мы просто во что-то врезались и скорость обнуляется.

Сам метод >act следующий:

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

>  this.moveX(step, level, keys);

>  this.moveY(step, level, keys);


>  var otherActor = level.actorAt(this);

>  if (otherActor)

>    level.playerTouched(otherActor.type, otherActor);


>  // Losing animation

>  if (level.status == "lost") {