>};
Свойство >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") {