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

>  var center = player.pos.plus(player.size.times(0.5))

>                 .times(scale);


>  if (center.x < left + margin)

>    this.wrap.scrollLeft = center.x - margin;

>  else if (center.x > right - margin)

>    this.wrap.scrollLeft = center.x + margin - width;

>  if (center.y < top + margin)

>    this.wrap.scrollTop = center.y - margin;

>  else if (center.y > bottom - margin)

>    this.wrap.scrollTop = center.y + margin - height;

>};

Метод нахождения центра игрока показывает, как методы наших типов >Vector позволяют записывать расчёты, производимые с объектами, наглядно. Чтобы найти центр актёра, мы добавляем его позицию (его левый верхний угол) и половину высоты. Это центр в координатах уровня, но нам он нужен в координатах пикселей, поэтому мы умножаем результирующий вектор на наш масштаб.

Затем серия проверок подтверждает, что игрок не находится вне доступного пространства. Иногда в результате будут заданы неправильные координаты прокрутки, ниже нуля или больше, чем размер прокручиваемого элемента. Но это не страшно – DOM автоматически ограничит их допустимыми значениями. Если назначить >scrollLeft значение -10, он будет равен 0.

Было бы немного проще пробовать прокручивать позицию игрока в центр окна просмотра – но это создаёт неприятный дрожащий эффект. Во время прыжков вид будет постоянно двигаться вверх и вниз. Гораздо приятнее иметь «нейтральную» зону в середине экрана, где можно двигаться, не вызывая прокрутки.

Ещё нам необходимо очищать уровень, когда мы переходим на следующий или начинаем заново.

>DOMDisplay.prototype.clear = function() {

>  this.wrap.parentNode.removeChild(this.wrap);

>};

Теперь мы можем показать наш уровень.

>


>

Тэг > при использовании с >rel="stylesheet" позволяет загружать файл с CSS. Файл >game.css содержит необходимые для игры стили.

Движение и столкновение

Теперь нам надо добавить обработку движений – самое интересное в игре. Простой подход, который используют большинство игр – разделить время на небольшие отрезки, и на каждом шаге сдвигать актёров на дистанцию, соответствующую их скорости (расстояние в секунду), умноженное на длительность временного отрезка (в секундах).

Это просто. Сложность в том, что надо обрабатывать взаимодействие предметов. Когда игрок касается пола или стены, он не должен проходить насквозь. Игра должна замечать, когда движение одного объекта приводит к столкновению с другим и реагировать соответственно. Стены останавливают движение, монеты собираются, и так далее.