Файл: Беляев С А - Разработка игр на языке JavaScript - 2016.pdf

ВУЗ: Не указан

Категория: Книга

Дисциплина: Программирование

Добавлен: 25.10.2018

Просмотров: 7590

Скачиваний: 136

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
background image

96

Глава 5

Например, в случае объектов PlayerTank или Rocket

функция  update может выглядеть следующим образом:

function update() {

physicManager.update(this);

}

При этом у объекта Bonus такой функции может вооб

ще не быть.

Для корректной работы у объектов должны быть реа

лизованы функции onTouchEntity и onTouchMap, так как
именно они определяют логику взаимодействия.

Предположим, что объекты типа Bonus увеличивают

значение lifetime объекта Player при касании, при этом их
имена начинаются на «star», а заканчиваются числом, обес
печивающим уникальность имени объектов типа Bonus.

function onTouchEntity(obj) {

if(obj.name.match(/star[\d]/)) {

this.lifetime += 50;

obj.kill();

}

}

В качестве параметра функции передается объект (obj).

if(obj.name.match(/star[\d]/))

Условие с помощью функции match проверяет соответ

ствие имени объекта регулярному выражению /star[\d]/
и обозначает, что имя должно содержать текст «star», за
которым следуют цифры. Детальное описание регулярных
выражений выходит за рамки настоящего учебного посо
бия, с ними можно ознакомиться в [18].

this.lifetime += 50;

Увеличение поля lifetime объекта Player.

obj.kill();

Уничтожение объекта, с которым встретился объект

Player.

Рассмотрим вариант реализации функции onTouch

Entity для объекта Rocket. При этом предполагается, что


background image

Реализация логики поведения объектов

97

имя объекта Player равно «player», имена объектов Tank
равно «enemy», за которым следует число, имена объек
тов Rocket равно «rocket», за которым следует число.

function onTouchEntity(obj) { // îáðàáîòêà âñòðå÷è ñ ïðåïÿòñòâèåì

if(obj.name.match(/enemy[\d*]/) || obj.name.match(/player/) ||

obj.name.match(/rocket[\d*]/)) {

obj.kill();

}

this.kill();

}

Параметры функции совпадают для всех реализаций.

if(obj.name.match(/enemy[\d*]/) || obj.name.match(/player/) ||

obj.name.match(/rocket[\d*]/))

Если имя объекта, с которым встретился объект Rocket,

содержит «enemy», «player» или «rocket», то вызывается
функция  obj.kill() объекта. В любом случае вызывается
функция kill объекта Rocket. При этом необходимо, что
бы объекты Rocket уничтожались при попадании в лю
бые препятствия, поэтому следует реализовать функцию
onTouchMap.

function onTouchMap(idx) {

this.kill();

}

Независимо от вида препятствия объект Rocket унич

тожается.

ВОПРОСЫ ДЛЯ САМОПРОВЕРКИ

1. Какие инструменты создания реалистичной физики движения

объектов на JavaScript приведены в данном учебном пособии?

2. Какие виды движения описаны в пособии? В каких случаях

каждый из них применим?

3. Опишите основные принципы реализации реалистичного дви

жения объектов.

4. Каким образом может быть реализовано на JavaScript упругое

падение объектов?

5. Какие методы реализованы в менеджере физики объектов?

Какие методы должны быть реализованы в управляемых объ
ектах?


background image

98

Глава 5

УПРАЖНЕНИЯ

1. Создайте незатухающее упругое столкновение, что

бы объект «отскакивал» от всех сторон прямоугольника.

2. Расширьте программу, разработанную в упражне

нии 1: добавьте внутрь прямоугольника — окружность,
от которой объект также будет «отскакивать» с учетом
угла падения.

3. Расширьте программу, разработанную в упражне

нии 2: добавьте еще два объекта, теперь три объекта будут
«отскакивать» от стен и окружности.


background image

Г Л А В А   6

МЕНЕДЖЕР ИГРЫ

В предыдущих главах разработан программный код

отображения карт, объектов, организовано взаимодей
ствие с пользователем и реализовано реалистичное пере
мещение объектов. На следующем этапе необходимо объе
динить все элементы в единое целое и запустить исполне
ние. В качестве инструмента объединения предлагается
использовать менеджер игры.

Менеджер игры должен обеспечить инициализацию,

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

var gameManager = { // ìåíåäæåð èãðû

factory: {}, // ôàáðèêà îáúåêòîâ íà êàðòå

entities: [], // îáúåêòû íà êàðòå

fireNum: 0, // èäåíòèôèêàòîð âûñòðåëà

player: null, // óêàçàòåëü íà îáúåêò èãðîêà

laterKill: [], // îòëîæåííîå óíè÷òîæåíèå îáúåêòîâ

initPlayer: function(obj) { // èíèöèàëèçàöèÿ èãðîêà

this.player = obj;

},

kill: function(obj) {

this.laterKill.push(obj);

},

update: function () { … },

draw: function(ctx) { … },

loadAll: function () { … },

play: function() { … }

};


background image

100

Глава 6

В приведенном коде многоточием заменены фрагмен

ты кода, которые будут приведены отдельно. Аналогич
ный подход и методы по созданию менеджера игры пред
ставлены в [9], [10].

factory: {}

Поле  factory представляет собой фабрику объектов,

которая используется в функции parseEntities менеджера
карты (п. 2.3). Предполагается, что в данном объекте хра
нятся эталонные объекты, которые в дальнейшем исполь
зуются для создания объектов, размещаемых на карте.

entities: []

Поле  entities хранит все объекты игры, которые мо

жет увидеть пользователь. Первоначально объекты попа
дают в массив entities в функции parseEntities менеджера
карты (п. 2.3), затем активно используются в других функ
циях, таких как fire объектов PlayerTank (п. 3.1), функ
ции entityAtXY менеджера физики объектов (п. 5.2). Пред
полагается, что в массиве entities хранятся все «не убитые»
объекты, для которых необходимо регулярно вызывать
метод update.

fireNum: 0

Поле  fireNum является вспомогательным полем для

создания уникальных идентификаторов при создании но
вых объектов и используется в функции fire объектов
Player и Tank (п. 3.1).

player: null

Поле  player предназначено для хранения ссылки на

объект, управляемый игроком. Это уникальный объект,
который в том числе хранится в массиве entities. Отдель
ный указатель на объект игрока необходим для организа
ции управления, изменения параметров объекта в зави
симости от команд пользователя, и в дальнейшем коррект
ной обработки расстояния до событий, создающих звуки
в игре.

laterKill: []