Создание игры про Теннис с помощью React.js + CSS keyframes

Cover Image for Создание игры про Теннис с помощью React.js + CSS keyframes

История создание игры для конкурса "Winter React Jam". В игре используются только ReactJS и CSS-анимации. Все анимации созданы с использованием keyframes. Нет requestAnimationFrame с изменением позиций для каждого кадра и нет HTML-canvas. Только перемещение html-блоков.

Данная игра была создана в кафе за чашкой кофе, и ее уровень сложности разработки делает ее доступной даже для начинающих разработчиков. Это означает, что любой, кто только начинает свой путь в программировании, может создать что-то подобное с небольшими усилиями и опытом.

Начало:

Как-то нашел в интернете конкурсе от reactjam. Не знаю, кто эти ребята, но конкурс заключался в том, чтобы сделать игру на React.js. Мое участие началось с того, что я начал искать бесплатные изображения (image assets). На данный момент у меня не было идей, какую игру я буду делать. Но наткнувшись на sport pack от kennynl, я принял решение сделать игру про теннис.

Sport pack preview

Игровое поле:

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

Ground gravel

У меня было 2 варианта:

  1. Нарисовать из тайлов поле и подгружать уже готовое поле цельной картинкой.
  2. Динамически собирать из тайлов поле в коде, задав каждому отдельному div в html background с картинкой этого тайла.

Я выбрал динамическое создания поле в коде. Это давало больше гибкости. Можно заменить один набор тайлов на другой и получить новое оформление поля. Также процесс управления контентом стал более удобным.

Собрав матрицу из номеров тайлов, я смог легко проходиться по ней с помощью метода forEach в React-компоненте. Это позволило мне динамически отображать каждый тайл, задавая им общие размеры 64 на 64 пикселей и добавляя обработчик события click.

Floor code

Сам код компонент тайла для поля - это html элемент div. У которого задан размер и background-position.

Floor tile code

Игровые персонажи:

Для игровых персонажей в image assets содержит отдельные изображения рук, ног и туловища персонажа.

Characters assets

Чтобы реализовать анимацию, я поместил каждую часть тела в контейнер со свойством position: relative. Затем я спозиционировал эти части тела так, чтобы в спокойном состоянии, кроме рук и туловища, ничего не было видно.

Hero animation

При нажатии на любой тайл поля, я добавляю className моему контейнеру, который является триггером для начала CSS-анимации. @keyframes для этой анимации содержит код, который двигает ноги и создает эффект ходьбы для персонажей игры. Код персонажа игры доступен по этой ссылке.

Полет мяча:

Логика полета мяча в игре довольно простая: он направляется в случайный тайл на стороне противника. Чтобы отбить мяч, ваш персонаж должен находиться в том же тайле, где приземлится мяч. В коде игры происходит проверка, если номер тайла, где приземлится мяч и номер тайла, где находится игрок совпадают. То процесс повторяется.

Next turn

Однако, в игре в теннис перед тем, как мяч будет отбит, он должен сначала удариться о вашу половину поля. Реализация отскока мяча также осуществлена при помощи @keyframes и transform: scale.

Ball scale

Итог:

Превью итогового геймплея.

Game preview

Кстати, игру добавили на страницу конкурса.

reactjam

Поиграть в игру вы можете по этой ссылке на сайте progosling. Посмотреть код игры вы можете в репозитории этой игры на GitHub.