Мои игры на JavaRush - портале для изучения языка Java
Используя весьма примитивные возможности игрового движка создать более сложно структурированные игры, чем предлагается по курсу обучения.
Во время работы над этими играми я проходил курс и учился применять возможности Java 8, Clean Code и базовых паттернов программирования.
Какие возможности предоставляет JavaRush Games API:
- Создание поля из клеток размером от 3х3 до 100х100
- Закрашивание клеток цветами JavaFX
- Вписывание символов/строк в клетки
- Отображение одиночных сообщений в центре экрана
- Выполнение хода с заданным интервалом
- Управление клавишами UP, DOWN, LEFT, RIGHT, ENTER, SPACE, ESCAPE, PAUSE, ЛКМ, ПКМ
Не поддерживается движком:
- Java выше 8 версии
- Работа с файлами
- Работа с сетью
- Многопоточность
- Reflection API и многое другое
Поэтому все данные, включая матрицы спрайтов, приходится держать непосредственно в классах.
Для запуска игр локально нужно подключать библиотеку JavaFX и JavaRush Game Engine. Поддерживается только Java 8. В принципе, это нужно только на этапе разработки. Точкой входа в игру и слушателем событий является главный класс с названием игры, который находится в корне пакета, и его нельзя перемещать.
Игры публикуются на сайте JavaRush. При публикации игра переводится на
JS и каждая клеточка становится тегом div
в HTML, из-за чего на слабых устройствах могут наблюдаться тормоза с
постоянным обновлением большого поля из div-ов.
Сапёр (Minesweeper)
Авторами курса представлена как самая простая для написания игра. По этой причине решил превратить её в самую продвинутую.
- Техническая реализация:
В отличие от предлагаемой базовой версии я отказался от использования текста и ограничился перекрашиванием клеток на поле 100х100. В итоге поверх движка получился собственный движок с "живым" GUI - можно создавать окна, анимированные кнопки, рычажки (которые без явного указания координат понимают, что по ним кликнули). Можно переключать виды, тему оформления, вставлять картинки, двигать, отражать, перекрашивать, и т. п. Можно писать текст из пикселей в любом месте экрана (сделаны шрифты и возможность выравнивать текст по краям, по центру, делать обводку). Обновления экрана оптимизированы с помощью класса Display, где все элементы сначала слоями рисуются на виртуальном кадре, и только потом уже итоговый "плоский" кадр отображается на экране - сделано исключительно, чтобы браузеру было легче.
Для распределения ответственностей классов я создал структуру, приближенную к MVC, где игровая логика отделена от управления и от представления. Позже по той же аналогии сделал рефакторинг остальных игр.
- Игровой процесс:
С точки зрения игрового процесса это классический сапёр с дополнением в виде магазина инструментов. Во время игры откопанные цифры превращаются в золотые монеты, на которые можно купить вещи, облегчающие разгадывание. Также присутствуют мелкие удобства: например, первый клик всегда приходится на просеку, а правый клик по цифре при расставленных флажках откроет прилегающие клетки автоматически. Есть таблица рекордов и режим игры на время.
Змейка Алхимика (Snake)
С этой игры я начал знакомство с движком JavaRush Games.
В качестве оригинальной идеи для змейки мне пришло в голову дополнить её элементами головоломки, заключающимися в подборе и использовании различных стихий: воды, огня, земли, ветра. Графика в двух вариантах - с японскими символами, означающими материалы и стихии, или с эмодзи.
Бильярдная 2048 (2048)
Вариант классической 2048, где вместо плиточек выступают бильярдные шары. Правила тоже немного изменены: по краям стола есть 6 луз, в которые можно забивать шары. Правый клик устанавливает биток в пустую клетку, при помощи которого шары и забиваются. Правым кликом по лузе шары можно доставать обратно на поле.
Цель игры - создать шар с номером 8, который в последствии должен быть загнан в последнюю незакрытую лузу. Чем больше очков будет в лузах к концу игры, и чем меньше было сделано шагов, тем лучше итоговый результат, поэтому в бездумном перемешивании шаров в надежде на автоматическое прохождение смысла мало.
JavaRush Games Sprite Maker (вместо MoonLander)
Единственная "игра", которая не игра.
Это небольшой графический редактор, при помощи которого можно рисовать спрайты к другим играм на JavaRush.
Рисунок экспортируется в массив элементов int[][]
с кодами цветов, который в последствии можно вставить в любую
игру на движке JavaRush. В первую очередь сделал это для того, чтобы рисовать графику к своим же играм, но в последствии
доработал интерфейс, чтобы им могли с удобством пользоваться и другие ученики.
Я остановил разработку MoonLander из-за проблем с тормозами после публикации на сайте. Браузер не может быстро обновлять сразу 1000 div-ов на динамично меняющейся картинке. Осталось короткое видео с момента разработки.
Назад в будущее России (Racer)
Заезд на километровую дистанцию в ДеЛореане по мотивам фильма "Назад в будущее".
Марти и Док оказались на российском шоссе 21 века, и у них осталось всего 2 литра бензина. Нужно собрать 1.21 ГВт энергии (зелёные канистры), разогнать машину до 88 миль в час и прыгнуть во временной портал. Лужи и ямы на дорогах выступают в качестве препятствий и будут затормаживать автомобиль.
Техническая заметка:
Во время переработки этой игры я извлёк из "сапёра" алгоритм отображения текста, убрал лишние функции и оформил его в отдельном пакете, в изоляции от другой логики. Теперь при желании пакет printer можно легко подцепить к другой игре и переиспользовать код.
Mario World Invaders (Space Invaders)
Сюрреалистичный мэшап по мотивам игр на NES: Марио (Super Mario Brothers), танчиков (Battle City) и Space Invaders, в котором враги стреляют фигурками из тетриса :) Танки в стиле космических захватчиков приближаются к миру Марио. Марио ударами по кирпичам выбивает монеты, уничтожающие танки. Иногда из кирпичей со знаком вопроса вылезают бонусы: гриб или звёздочка. При столкновении со вражескими пулями гриб поглотит удар, а звёздочка отразит пулю обратно во врагов. После подбора гриба Марио сможет метнуть огненный шар, а после подбора звёздочки - уничтожить все пули на экране (клавиша SPACE).
При расчёте движений Марио я решил учесть инерцию, что немного усложнило игру, но сделало управление более мягким и реалистичным - разогнавшись, нельзя резко затормозить, тем более в воздухе.
Реверси (Отелло) (вместо Tic-Tac-Toe)
Классическая игра в реверси против компьютера.