Во всех хитрых уроках до этого момента вы использовали квадратные или прямоугольные прямоугольники для понимания различных концепций, таких как анимация и клавиатура или сенсорные события. Хотя это отличный способ быстро узнать больше о библиотеке, вам, скорее всего, понравится использовать изображения в реальных играх.
В этом уроке вы узнаете, как загружать спрайт- листы для использования различных изображений в вашей игре. После этого вы научитесь анимировать разных персонажей с помощью спрайтовой анимации.
Загрузка листа спрайта
Для тех, кто незнаком с листами спрайтов, это файлы изображений, которые содержат несколько небольших графических изображений, расположенных вместе в сетке. Каждое из этих меньших графических изображений или спрайтов может использоваться отдельно или вместе с другими изображениями для анимации различных объектов.
Вы не можете просто загрузить спрайт-лист в Crafty и начать его использовать. Вам также нужно будет указать ширину и высоту различных плиток или спрайтов в вашем листе спрайтов. Вы также можете дать конкретные имена для отдельных изображений. Например, спрайт с небольшим камнем в нем может быть назван «small_stone» для удобства. Запоминание названия плитки намного проще, чем запоминание фактических координат различных изображений.
Мы собираемся использовать следующий лист спрайтов от Tokka в различных демонстрационных материалах этого урока.
В нем много изображений, которые можно использовать, когда игрок идет, прыгает, бездействует или получает выстрел. В этом случае ширина и высота большинства плиток составляют 80 пикселей и 94 пикселя соответственно. Некоторые спрайт-листы могут также иметь дополнительные отступы вокруг отдельных плиток или спрайт-листа в целом. Они могут быть указаны при загрузке листа спрайта с использованием paddingX
, paddingY
и paddingAroundBorder
.
Вот код, который нам нужен для загрузки вышеуказанного спрайт-листа в нашей игре:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
|
var game_assets = {
«sprites»: {
«hero_spritesheet.png»: {
tile: 80,
tileh: 94,
map: {
hero_idle: [0, 0],
hero_walking: [1, 1],
hero_jumping: [2, 3],
hero_sitting: [0, 4]
}
}
}
};
Crafty.load(game_assets);
|
На плитки ссылаются, используя пару чисел. Первое число определяет столбец нашего спрайта, а второе число определяет его строку. Числа начинаются с нуля. Например, спрайт в первом столбце и первой строке можно получить с помощью [0, 0]
. Аналогичным образом, доступ к спрайту в третьем столбце и четвертом ряду можно получить с помощью [2, 3]
. Как упоминалось ранее, вы можете дать разные имена отдельным спрайтам для простоты использования.
Рендеринг статических спрайтов
После загрузки спрайт-листа вы можете отобразить изображения на экране, используя следующий код:
1
2
|
var idle_hero = Crafty.e(«2D, Canvas, hero_idle»)
.attr({ x: 10, y: 10 });
|
Атрибуты x
и y
определяют местоположение, в котором будут отображаться спрайты. Вы также можете установить ширину и высоту отдельных спрайтов, используя атрибуты w
и h
.
Поскольку спрайт имеет 2D
компонент, вы можете применить все свойства и атрибуты 2D
компонента к этим изображениям. Например, вы можете перевернуть нашего героя горизонтально, чтобы он this.flip("X")
в другом направлении, используя this.flip("X")
. Точно так же вы можете вращать спрайт с помощью атрибута rotation
или сделать его прозрачным с помощью атрибута alpha
.
1
2
3
|
var sitting_hero = Crafty.e(«2D, Canvas, hero_sitting»)
.attr({ x: 440, y: 250 })
.flip(«X»);
|
Допустим, вам нужно визуализировать только часть заданного спрайта на холсте. Это можно сделать с помощью метода .crop(Number x, Number y, Number w, Number h)
. Первые два параметра определяют значения смещения x и y спрайта. Последние два параметра определяют ширину и высоту обрезанного спрайта. Все значения должны быть указаны в пикселях.
Анимация спрайтов
До этого момента вы перемещали различные объекты, изменяя их атрибуты x
и y
. Это не было проблемой, так как большую часть времени вы перемещали только прямоугольные коробки. Однако перемещать нашего главного героя, двигая его так, будет очень неестественно. Добавление анимации к таким объектам, как монеты, которые игрок может собирать, также сделает игру более приятной.
Все анимации, связанные со спрайтами, требуют добавления к SpriteAnimation
компонента SpriteAnimation
. Этот компонент обрабатывает различные изображения в карте спрайта как кадры анимации.
Информация об анимации хранится в объекте reel
. Объект reel имеет пять различных свойств:
-
id
который является названием барабана - массив
frames
, содержащий список кадров для анимации в формате[xpos, ypos]
- свойство
currentFrame
которое возвращает индекс текущего кадра - свойство
easing
которое определяет, как анимация должна двигаться вперед - свойство
duration
которое устанавливает продолжительность анимации в миллисекундах
Существует четыре различных события, которые могут быть вызваны спрайтовой анимацией. Эти:
- StartAnimation : это событие вызывается, когда анимация начинает воспроизводиться или возобновляется из состояния паузы.
- AnimationEnd : это событие вызывается, когда заканчивается анимация.
- FrameChange : это событие срабатывает каждый раз, когда меняется кадр в текущем барабане.
- ReelChange : это событие срабатывает при смене самого барабана.
Все эти события получают объект reel
в качестве параметра.
Помимо объекта reel
, есть также метод .reel()
который используется для определения анимации спрайтов. Вы можете использовать метод .animate()
для воспроизведения любой из определенных анимаций.
Процесс анимации спрайта начинается с создания статического спрайта на холсте.
1
2
3
4
5
|
var walking_hero = Crafty.e(‘2D, Canvas, hero_walking, SpriteAnimation’)
.attr({
x: 40,
y: 20
});
|
Изображение hero_walking
в приведенном выше случае — это первое изображение, которое пользователь видит перед анимацией. Атрибуты используются для указания местоположения текущего объекта. После того, как объект был создан, вы можете использовать метод .reel()
для определения фактической анимации.
1
2
3
4
5
6
7
8
|
walking_hero.reel(«walking», 1000, [
[0, 1],
[1, 1],
[2, 1],
[3, 1],
[4, 1],
[5, 1]
]);
|
Этот метод принимает три параметра. Первый параметр — это Id
создаваемой анимации. Второй параметр используется для установки длины анимации в миллисекундах, а третий параметр представляет собой массив массивов, содержащих позицию столбца (x) и строки (y) последовательных кадров. В этом случае массив содержит позицию всех спрайтов во втором ряду.
Другая версия этого метода требует пять параметров. Первые два параметра — это Id
барабана и длина анимации. Третий и четвертый параметры используются для установки начальной позиции x и y для анимации на карте спрайтов. Последний параметр устанавливает количество последовательных кадров в анимации. Когда установлено отрицательное значение, анимация будет воспроизводиться задом наперед.
Вышеприведенная анимация барабана также может быть создана с использованием следующего кода:
1
|
walking_hero.reel(«walking», 1000, 0, 1, 6);
|
Хотя эта версия краткая, она немного ограничена. Этот метод полезен, только если все спрайты, которые вы хотите включить в анимацию, находятся в одной строке. Кроме того, анимация будет показывать эти изображения в том порядке, в котором они отображаются на листе спрайтов.
После того, как вы определили анимацию, вы можете воспроизвести ее с помощью .animate( reel_Id [, loopCount])
. Первый параметр — это анимация, которую вы хотите воспроизвести, а второй параметр определяет, сколько раз вы хотите воспроизвести эту анимацию. По умолчанию анимация воспроизводится один раз. Установка loopCount
в -1
будет воспроизводить анимацию бесконечно.
В определенных ситуациях вам может потребоваться воспроизвести анимацию только один раз в зависимости от события. Например, анимация прыжка должна воспроизводиться, когда пользователь нажимает кнопку, чтобы сделать прыжок игрока. Вы можете попробовать это в приведенной выше демонстрации. Нажатие клавиши « Стрелка вверх» сделает второй скачок спрайта. Вот код для определения нажатия клавиши:
1
2
3
4
5
|
jumping_hero.bind(‘KeyDown’, function(evt) {
if (evt.key == Crafty.keys.UP_ARROW) {
jumping_hero.animate(«jumping», 1);
}
});
|
Вы также можете приостановить и возобновить анимацию на полпути, используя .pauseAnimation()
и .resumeAnimation()
.
Если к одному спрайту прикреплено несколько анимаций, вы можете определить, воспроизводится ли конкретная анимация в данный момент, с помощью .isPlaying([String reelId])
. Если Id
не Id
, он проверит, воспроизводится ли какая-либо анимация вообще.
Вывод
После завершения этого урока вы сможете загрузить собственные листы спрайтов в Crafty и использовать их для представления различных игровых объектов вместо разных прямоугольников. Теперь вы также можете применять различные анимации к объекту на основе разных событий. Я должен напомнить вам, что я использовал Crafty версии 0.7.1 в этом руководстве, и демоверсии могут не работать с другими версиями библиотеки.
JavaScript стал одним из де-факто языков работы в сети. Это не без кривых обучения, и есть множество фреймворков и библиотек, которые также могут вас занять. Если вы ищете дополнительные ресурсы для обучения или использования в своей работе, посмотрите, что у нас есть на рынке Envato .
В следующем уроке вы узнаете, как добавлять звуки в вашу игру.