Файл: Беляев С А - Разработка игр на языке JavaScript - 2016.pdf
Добавлен: 25.10.2018
Просмотров: 7590
Скачиваний: 136
96
Глава 5
Например, в случае объектов Player, Tank или 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. При этом предполагается, что
Реализация логики поведения объектов
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. Какие методы реализованы в менеджере физики объектов?
Какие методы должны быть реализованы в управляемых объ
ектах?
98
Глава 5
УПРАЖНЕНИЯ
1. Создайте незатухающее упругое столкновение, что
бы объект «отскакивал» от всех сторон прямоугольника.
2. Расширьте программу, разработанную в упражне
нии 1: добавьте внутрь прямоугольника — окружность,
от которой объект также будет «отскакивать» с учетом
угла падения.
3. Расширьте программу, разработанную в упражне
нии 2: добавьте еще два объекта, теперь три объекта будут
«отскакивать» от стен и окружности.
Г Л А В А 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() { }
};
100
Глава 6
В приведенном коде многоточием заменены фрагмен
ты кода, которые будут приведены отдельно. Аналогич
ный подход и методы по созданию менеджера игры пред
ставлены в [9], [10].
factory: {}
Поле factory представляет собой фабрику объектов,
которая используется в функции parseEntities менеджера
карты (п. 2.3). Предполагается, что в данном объекте хра
нятся эталонные объекты, которые в дальнейшем исполь
зуются для создания объектов, размещаемых на карте.
entities: []
Поле entities хранит все объекты игры, которые мо
жет увидеть пользователь. Первоначально объекты попа
дают в массив entities в функции parseEntities менеджера
карты (п. 2.3), затем активно используются в других функ
циях, таких как fire объектов Player, Tank (п. 3.1), функ
ции entityAtXY менеджера физики объектов (п. 5.2). Пред
полагается, что в массиве entities хранятся все «не убитые»
объекты, для которых необходимо регулярно вызывать
метод update.
fireNum: 0
Поле fireNum является вспомогательным полем для
создания уникальных идентификаторов при создании но
вых объектов и используется в функции fire объектов
Player и Tank (п. 3.1).
player: null
Поле player предназначено для хранения ссылки на
объект, управляемый игроком. Это уникальный объект,
который в том числе хранится в массиве entities. Отдель
ный указатель на объект игрока необходим для организа
ции управления, изменения параметров объекта в зави
симости от команд пользователя, и в дальнейшем коррект
ной обработки расстояния до событий, создающих звуки
в игре.
laterKill: []