Код игры с помощью ChatGPT
Для верстки сайта потребовалась конвертация CSS в SASS.
После этого, стало понятно, что использование нейросетей для этой задачи неэффективно. Почему?
Дело в том, что они генерируют код на основе заранее загруженных аналогов, что может привести к ошибкам из-за обновления синтаксиса языков программирования. Копирование и вставка кода не подходит.
Несмотря на это, ChatGPT может быть полезен для написания простых программ и создания комментариев к коду. Он универсален и может работать с различными языками программирования, включая Python, Java, C++, JavaScript, Ruby, PHP, Go, Swift и другие.
Кстати, код написания незатейливой игры “змейка” с помощью этой нейронки есть в карусели.
Для того, чтобы ChatGPT мог генерировать коды на разных языках программирования, он проходит через обучение на больших объемах текстовых данных, включая коды программ на различных языках. В процессе обучения, нейросеть выучивает основные законы и правила языков программирования, а также понимает, какие команды и конструкции необходимы для решения различных задач.
После обучения модель может генерировать новые коды программ.
Универсальность делает нейросеть полезным инструментом для разработчиков программного обеспечения, которые могут использовать его для создания прототипов или для генерации базовых структур кода на разных языках.
Пишем свою первую игру. Прохождение для разработчиков
Что вы делаете, когда вы играете в какую-то игру и несколько раз не можете пройти одно и то же место? Можно просто найти уже готовое прохождение. Это, конечно, здорово, но что, если вы застряли в разработке игры? Какой гайд прочитать? Так пусть наша статья станет вашим пошаговым руководством к разработке вашей первой игры, если вы все еще не начали ее писать. Если уже начали, то вам все равно не помешает прочитать наши советы — быть может, увидите что-нибудь новое.
Прежде, чем мы начнем, мы хотим привести вам пример первой игры от автора этой статьи. Это была простая текстовая игра под названием Divine Blood:
Это была самая первая игра, причем запрограммированная для калькулятора TI-83 Plus. Позднее она была переписана автором на Java во время обучения в старших классах. Примечательно, что игра так и не была закончена.
Ко всеобщему сожалению, не доводить игры до логического конца — одна из самых распространенных проблем начинающих разработчиков. Соответственно, возникает вопрос: как повысить свою продуктивность и все-таки закончить начатый проект? Ответ прост: прочтите наше «прохождение» разработки игры.
Основные этапы
Если вы разрабатываете игру сами (а начинающие программисты обычно пишут как раз в одиночку), то процесс написания можно разделить на 4 основных этапа (или уровня, как и в играх):
- планирование;
- прототипирование;
- программирование;
- релиз.
Каждый следующий уровень в видеоигре сложнее, чем предыдущий. Здесь все также: каждый следующий этап имеет свои трудности и проблемы, с которыми вы неизбежно встретитесь. Это пошаговое руководство поможет вам не остановиться ни на одном этапе разработки игры. Мы приведем различные цитаты и мнения профессионалов, целиком прошедшие тот путь, который мы только начинаем.
В играх каждый уровень имеет свои проблемные места, а в конце — еще и босса. Так будет и у нас. Мы остановимся на них более подробно и, как и в любом прохождении, мы покажем, как пройти эти места и двинуться дальше.
Уровень 1: Планирование
Первый и одновременно самый важный уровень разработки — планирование. На этом этапе вы должны спланировать всю свою деятельность и учесть все аспекты вашей игры. Цель этого уровня — обдумать все настолько тщательно, чтобы на остальных этапах вам не пришлось импровизировать.
Как только вы задумали что-то разработать, первым делом достаньте блокнотик, ручку и начинайте писать свои идеи. Максимально подробно останавливайтесь на деталях, это поможет вам в будущем. Пишите все, что вы хотели бы увидеть в вашей игре. Вся соль здесь заключается в том, что поначалу это сделать довольно просто: проект пока не разрос, и все у вас находится на виду. Но чем больше вы разрабатываете игру, тем сложнее будет начать писать свои идеи и в дальнейшем учитывать их.
Как уже говорилось выше — уделяйте внимание деталям. Записали новую фичу для реализации? Отметьте рядом, как она будет работать, как будет влиять на игрока и непосредственно на игровой процесс. И помните, секрет успешной разработки — решать существующие проблемы, пока они не накопились.
Именно поэтому важно спланировать все, иначе на этапе разработки (уровень 3) вы захотите добавить в игру больше возможностей и начнете реализовывать все подряд, что категорически неправильно. Ваш проект рискует быть чрезмерно большим, отчего вам сложнее будет его контролировать, а вскоре вы вовсе бросите его в дальний ящик в надежде, что возьметесь за него позже. Если вы играли в серию игр Halo, представьте себе, как было бы трудно играть в нее, если бы вы столкнулись с парочкой охотников сразу после начала игры. Вы попросту будете умирать снова и снова, пока вам не надоест эта череда смертей. В разработке игры все аналогично.
Основная проблема первого этапа — притупить свое желание кодить и начать планировать. Написать код вы всегда сможете, для этого у вас будет целый этап. Спланируйте как можно больше аспектов вашей игры.
А боссом этого уровня являются вопросы. Просмотрите на все свои заметки и убедитесь в том, что у вас нет каких-либо непонятных пунктов: ни в используемых инструментах, ни в алгоритмах и прочем. Если же у вас действительно все вопросы решены, то вы смело можете считать, что уровень «Планирование» закончен. Но если остались непонятные аспекты — решите их, прежде чем переходить дальше.
Разумеется, у вас могут возникнуть такие вопросы, которые касаются, например, баланса игры. В таких случаях вы также готовы переходить дальше, поскольку эту проблему необходимо будет решить на втором и третьем этапах разработки игры.
Уровень 2: Прототипирование
Вторым уровнем нашей игры-разработки является прототипирование. Здесь вы должны проверить и протестировать основную механику и особенности вашей игры. Выше мы говорили о том, что на предыдущем этапе могут возникнуть вопросы по поводу баланса. Второй уровень как раз и нужен для того, чтобы отшлифовать этот параметр.
На этом этапе вы будете писать код не очень красивый и не совсем правильный. Это в порядке вещей, поскольку вы пишете прототип. Когда вы перейдете дальше, вы уже будете знать, что и где работает не так, как должно.
Несмотря на то, что данный этап мы выделили отдельно, в некоторых случаях его можно пропустить, поскольку он имеет очень много общего с планированием. Вы можете подумать, что мы не постоянны в своих суждениях: совсем недавно призывали вас не переходить на следующий уровень, пока не пройден текущий, а сейчас говорим, что этап прототипирования можно пропустить.
Вы помните секретные телепорты в игре Super Mario Bros? Игрок мог найти хорошо спрятанные трубы, прыгнув в которые можно было пропустить несколько уровней. Так и здесь. Правда, мы не полностью пропускаем прототипирование, а совмещаем его с планированием.
Хотим заметить, что первые два этапа взаимозаменяемы. Быть может, вы хотите проверить основную механику вашей игры, прежде чем потратите кучу времени на детали? А может, вы хотите попробовать какую-то возможность в вашей игре? Это основные причины, почему есть смысл в том, чтобы поменять порядок первых двух этапов.
На этом этапе у вас могут возникнуть две главные сложности. Первая — желание наконец перейти на следующий этап и начать писать код. Как мы уже говорили выше, вы должны быть максимально готовы к переходу на следующий уровень, а потому — не спешите. Второй сложностью является желание создать более точный и законченный прототип. Этого делать уж точно не стоит, поскольку прототип по определению не должен быть законченным продуктом.
А боссом этого уровня является полнота. Вы должны собрать воедино все наработки первого и второго этапа и понять, что же у вас должно получиться в итоге. Если вы будете иметь хорошее представление о вашем конечном проекте, то проблем при написании кода у вас точно не возникнет. А следовательно, повысятся шансы закончить игру.
Уровень 3: Программирование
Третий уровень — наиболее сложный уровень для начинающих программистов. Дойдя до него, многие забрасывают свой проект. Но бояться здесь ничего не надо! Первые два этапа пройдены и вы уже на полпути к окончанию разработки.
Чтобы начать этот этап, вам стоит определиться с целевой платформой вашей игры. Будет эта игра для консолей, а, может быть, мобильная или вовсе браузерная? Определившись с платформой, выберите необходимый инструментарий и язык программирования.
На самом деле эти два шага можно выполнить в обратном порядке. Имея какую-либо среду разработки (или язык программирования), вы можете проанализировать ее возможности и решить, что вы сможете написать.
Вы очень сильно облегчите себе жизнь, если воспользуетесь бесплатными библиотеками и ресурсами. Не пытайтесь изобретать велосипед: используйте то, что находится в свободном доступе. Это поможет вам приберечь немного сил для того, чтобы закончить проект.
Основными неприятными моментами на этом этапе выступают появляющиеся проблемы и разочарование. Вы неоднократно будете натыкаться на моменты, когда не будете знать, как решить текущую задачу. Более того, вполне возможно, что ваша игра на какой-то стадии разработки не оправдает ваших надежд.
Но вы не должны унывать! Лучшее решение этих проблем — отвлечься от проекта на несколько дней. Вы очистите ваш ум и позволите новым идеям посетить его. Также неоднократно замечено, что «утро вечера мудренее». Застряли? Не знаете как решить проблему? Ложитесь спать, а на завтрашнее утро вы, возможно, сразу поймете причину ваших неудач. Не работайте до изнеможения и не изнуряйте себя: работа над проектом должна быть в удовольствие.
Ну а боссом этого уровня является сама игра. Да, игра, которую вы и пишете. Она не должна быть идеальной, но она должна быть полноценной. Такой, в которую бы люди могли и хотели играть.
Уровень 4: Релиз
Наконец-то мы добрались и до релиза. Конечно же, этот уровень не такой сложный, как предыдущий, но и легкомысленно относится к нему не стоит. На этом этапе вы должны убедить людей играть в вашу игру и давать вам обратную связь (вы же хотите улучшить свой проект?). Основываясь на отзывах игроков, внесите в ваше приложение те изменения, которые сделают игру более увлекательной по вашему мнению.
Главная проблема этого этапа — критика. Всегда найдутся те, кому попросту не понравится ваша игра. Это нормально. Не стоить из-за таких людей опускать руки. Ориентируйтесь лучше на тех, кто играет в ваше приложение и предлагает вам добавить в нее новые возможности.
А финальным боссом всего нашего путешествия будет являться ваша гордость. Вы сделали полноценную игру от начала и до конца! На самом деле, не все могут похвастаться этим.
И помните, дорога к успеху вымощена многократными неудачами. Никогда не сдавайтесь!
Вывод
Разработка первой игры — захватывающее занятие, выполняя которое мы получаем бесценный опыт. И все же, многие разработчики не могут довести свой проект до конца, хотя так категорически нельзя поступать. Следуя нашим четырем «уровням» разработки игры, вы увеличите свои шансы довести ваш проект до логического завершения.
А теперь соберитесь и напишите свою игру!
Перевод статьи «Making Your First Game: A Walkthrough for Game Developers»
Как создать видеоигру, не имея опыта программирования
Даже если вам плохо дается программирование, вам все равно доступно множество инструментов для Unity, удобных для художников и дизайнеров, а также ресурсов в Asset Store, нативно интегрирующихся в интерфейс редактора.
На этой странице
- Создавайте в Unity не программируя
- Visual scripting с Bolt
- Visual scripting с PlayMaker
- Визуальный скриптинг с Adventure Creator
- Учитесь основам программирования с Unity
- Unity для художников и дизайнеров
Создавайте в Unity не программируя
Да, большая часть интерактивного контента, созданного в Unity, опирается на текстовые программы. Unity поддерживает язык программирования C#, в котором нужно понимать два аспекта: логика и синтаксис. Логику можно описать словами «что должно произойти», а синтаксис — это язык, позволяющий передать логику.
Но если у вас нет опыта работы в Unity или в программировании, а вы просто хотите понять базовые принципы и понятия, то мы советуем вам загрузить бесплатную версию редактора Unity, выбрав вариант «Новые пользователи» на странице «Начало работы». Во время загрузки вы сможете выбрать готовый шаблон Microgame, который автоматически откроется в редакторе после запуска.
Сразу же после загрузки Microgame вы сможете вносить небольшие изменения, следуя интерактивным руководствам в редакторе, шаг за шагом знакомящим вас с вашими первыми творческими задачами в Unity.
Освоив руководства, вы сможете продолжить работу над Microgame, используя нашу коллекцию пакетов Mod, каждый из которых позволяет развивать вашу игру простыми и приятными способами.
Кроме того, в магазине Asset Store опубликовано множество инструментов, позволяющих с легкостью решить большинство задач, не имея существенного опыта программирования. Взгляните на три лучших ресурса в следующих разделах.

Visual scripting с Bolt
Bolt, бесплатный для всех версий Unity, — это инструмент воплощения ваших идей в творческом, удобном интерфейсе системы визуального программирования, созданной лауреатом престижных премий, разработчиком программ и игр Лазло Бонином. Между Bolt и Unity нет никакого интегрирующего слоя, что упрощает их взаимодействие. Bolt ускоряет ваши навыки прототипирования, позволяет быстрее воплотить идеи в жизнь.
«Я хотел создать графическое средство визуального проектирования для визуалов: тех, кому нравится хороший дизайн и отзывчивость интерфейса, тех, кто хочет с первого взгляда определять точный момент и место, где возникла ошибка или предупреждение» (Лазло Бонин, издатель Bolt).
Bolt в действии
Лазло Бонин приступил к разработке Bolt еще в то время, когда он и его студия все еще работали над сюжетным приложением Ephemera с возможностью исследования окружающего мира. Им нужен был графический интерфейс для машин состояний, чтобы художники и аниматоры могли внести изменения в структуру сцены и игрового процесса, не отвлекая программистов от основной работы над ключевыми системами.
Bolt открывает непосредственный доступ к классам вашего собственного персонажа, к классам предметов и многому другому. Вы просто вызываете функции в интерфейсе и задаете атрибуты.
«Ни мне, ни моим пользователям не требуется никаких дополнительных действий — Bolt подхватывает все автоматически. Он напрямую анализирует и считывает всю кодовую базу и показывает доступные варианты».

Visual scripting с PlayMaker
Если вы — дизайнер или художник, который хочет реализовать свои творческие возможности без программирования, то PlayMaker поможет вам в этом. С этим средством вы сможете быстро создать прототип игрового процесса и алгоритмы поведения ИИ, а также графы анимации и интерактивные объекты. Этот инструмент для визуального программирования также использовался в разработке таких игр, как Hearthstone, INSIDE и Dreamfall Chapters.
«Playmaker — это самый логичный и интуитивно понятный способ реализации различных функций наших игр для всех, кто не связан с программированием!» Андреас Н Грёнтвед, INSIDE
PlayMaker в действии
Playmaker — это инструмент визуального программирования, позволяющий работать с визуальным представлением скриптов, не обращая внимания на текстовое содержание. Логика представлена взаимосвязанными друг с другом графами, а синтаксис строится автоматически, с помощью готовых шаблонов Action, выбираемых пользователем.
Такой инструмент, как PlayMaker, интегрированный в Unity, открывает разработчикам, работающим над сюжетом, взаимодействиями между персонажами и объектами, возможность реализовать нужные алгоритмы, не углубляясь в синтаксис языка программирования.
Хотите увидеть PlayMaker в действии? Посмотрите видеоролики, где рассказывается, как реализовать интерактивность с помощью visual scripting и PlayMaker.
Многие создатели игр часами корпели над синтаксисом кода и потратили кучу времени на устранение ошибок компилятора, но вам это совершенно необязательно. Сосредоточьтесь на том, что важно для вас.

Визуальный скриптинг с Adventure Creator
Adventure Creator будет вам полезен, если вы хотите создать 2D-, 2,5D- или 3D-игру в Unity без программирования. Система визуальных скриптов и интуитивный редактор позволяют новичкам создать всю игру от начала до конца, не тратя время на программирование, а также помогают программистам внедрять и проверять на практике собственные решения.
«Это невероятно! Здесь есть все инструменты для создания игры жанра point-n-click профессионального качества без единой вручную написанной строчки кода. Кроме того, редактор очень полезен, он помог мне устранить множество ошибок и реализовать сложные идеи» (Эш Дентон, Capital).
Adventure Creator в действии
Еще один инструмент, упрощающий жизнь простым пользователям, художникам и дизайнерам в Unity, рассмотрен в истории Эша Дентона.
Он работал над роликами для Inside XBox, а также является одним из авторов серии роликов Thank You for Playing.
Благодаря сообществу Unity он узнал об Adventure Creator, открытом и гибком инструменте, который помог поместить 2D-персонажей в трехмерный мир. Этот инструмент замечателен для художников и простых пользователей тем, что позволяет создавать события и кнопки с помощью графов, а диспетчер сцены выстраивает логику сцены, включая горячие точки, навигацию и триггеры.

Учитесь основам программирования с Unity
Если вы хотите узнать о принципах программирования в Unity, то рекомендуем вам ознакомиться со следующими бесплатными ресурсами на сайте Learn:
- «Набор для творчества: основы программирования» — в этом коротком проекте для начинающих вы познакомитесь с основами программирования на C# для Unity в контексте игры жанра Action-RPG.
- «Творите, программируя» — в рамках данного официального курса от Unity вы познакомитесь с принципом «Творите, программируя», с нуля создавая ваши собственные проекты на C#.
- Руководства по C#: коллекция коротких руководств, объясняющих принципы работы скриптов на C# в Unity, для начинающих и других пользователей. Начните с руководств по C# для начинающих, а затем переходите к руководствам по C# для пользователей среднего уровня.
Кроме того, вы можете подписаться на Learn Premium, где опубликованы как материалы по программированию от нашей команды, так и одобренные Unity курсы партнерских платформ, включая Coursera, Udemy, Pluralsight и Pathstream.
И наконец, наши пользователи готовы поделиться с вами бесплатными обучающими ресурсами по программированию в Unity, включая Brackeys, Code Monkey, и Jabrils.
Unity для художников и дизайнеров
Редактор Unity — это инструмент совместного творчества художников, дизайнеров, разработчиков и других сотрудников студии. Здесь есть инструменты для дизайна 2D- и 3D-сцен, работы с сюжетом и анимационными роликами, освещением, звуковым оформлением, спрайтами и системами частиц, а также невероятно функциональная система анимации. Смотрите обзор функций:
Unity Asset Store предлагает тысячи других ресурсов, дополнительно ускоряющих вашу разработку: персонажи, текстуры, окружения, ассеты для анимации, 3D-модели и звуковое оформление, а также расширения для редактора и готовые проекты.
Создание игры на Java: основы, примеры и пошаговая инструкция


Даниил Шатухин Редактор в «Хабре», тестировщик и любитель веба
На Java разрабатывают практически всё, от банковских приложений до научных программ. Плюс языка в том, что код будет работать везде, где есть виртуальная машина Java. Именно поэтому Java часто выбирают для кроссплатформенных приложений, в том числе для мобильных и десктопных игр. Рассказываем, как это работает, и прикладываем инструкцию, как написать свою первую игру на Java.

Освойте профессию «Java-разработчик»
Java для разработки игр
Долгое время Java был основным языком для разработки мобильных игр под сотовые телефоны, потом язык стал сердцем системы Android. Поэтому множество проектов из начала двухтысячных годов используют под капотом Java. К примеру, культовая игра Gravity Defied, в которой надо помочь мотоциклисту проехаться по холмам и не упасть, разработана на Java.
Пример десктопного проекта игры на Java — Minecraft, основная версия полностью написана на этом языке. Позже Microsoft переписала проект на C++ и выпустила Bedrock Edition, но все равно продолжает поддерживать версию на Java, которая обеспечивает большую совместимость, особенно на старом железе.
Java можно использовать не только для изучения основ геймдева, но и для разработки больших успешных проектов, в которые играют миллионы пользователей.
Профессия / 14 месяцев
Java-разработчик
Освойте востребованный язык
3 575 ₽/мес 7 150 ₽/мес

Игровые движки на Java
- jMonkeyEngine — высокопроизводительный движок для 3D-игр. Полностью поддерживает работу с драйвером для 3D-графики OpenGL и содержит в себе множество готовых реализаций для физических симуляций и визуализаций. Код проекта открыт, а использовать jMonkeyEngine можно бесплатно.
- LibGDX — фреймворк для создания игр, написанный на Java, но некоторые части реализованы на C++. Проект кроссплатформенный, поэтому с его помощью можно создавать игры для Windows, Linux, RaspberryOS, macOS, Android, iOS и браузера. В основном его используют для мобильных 2D-игр.
- LWJGL (Lightweight Java Game Library) — мощный 3D-движок для высокоэффективных проектов. Поддерживает работу с Vulkan, OpenGL и другими открытыми графическими API. Есть все необходимое для сборки готовых проектов под Windows, macOS, Linux и VR-гарнитуры Oculus. Именно на этом движке написали Java-версию Minecraft.
Правила игры
Теперь мы знаем практически всё, что нужно для создания собственной игры на Java. Делать ее будем с помощью графической библиотеки Swing. Она уже входит в Java и помогает создавать интерфейсы для окон и виджетов. Это не профессиональный движок, но он позволяет реализовать простые игры.
Для начала обозначим правила:
- главным игровым объектом будет яркий квадрат, двигающийся по горизонтали в нижней части окна;
- в верхней части появляются объекты другой формы и цвета, опускающиеся вниз с разной скоростью;
- падающие объекты нельзя задевать;
- в левой верхней части расположен счетчик объектов, от которых удалось увернуться;
- если коснуться падающего объекта, то игра завершается.

Разработчик игр на Unity – одна
из самых творческих профессий в IT. Создайте виртуальные миры уже через полгода обучения
Пишем код
Для начала создадим класс, в котором будем хранить все необходимые переменные. Сразу зададим им начальные значения. Некоторые из них будут меняться по ходу игры и возвращаться в исходное значение после завершения. В нашем классе SimpleGame наследуется от JPanel, который помогает выстраивать интерфейс:
public class SimpleGame extends JPanel implements ActionListener, KeyListener < private int playerX = 175; // Начальное положение игрока по горизонтали private int playerY = 480; // Начальное положение игрока по вертикали private int playerSpeed = 15; // Скорость движения игрока private ArrayListenemyX = new ArrayList<>(); // X-координаты врагов private ArrayList enemyY = new ArrayList<>(); // Y-координаты врагов private int enemySpeed = 20; // Скорость движения врагов private Timer timer; // Таймер для обновления экрана private boolean gameOver = false; // Флаг окончания игры private int score = 0; // Счет игрока
Теперь создадим класс игры SimpleGame, в котором обозначим настройки. Вместе с этим создадим таймер с интервалом 100 миллисекунд и запустим его:
public SimpleGame() < addKeyListener(this); setFocusable(true); setFocusTraversalKeysEnabled(false); timer = new Timer(100, this); // Тут создаем таймер timer.start(); // В этой строчке его запускаем >
Код на Java не запустится, если в нем нет главного класса main, поэтому создадим его и обозначим в нем настройки окна. Название укажем в frame, а размеры — в setSize:
public static void main(String[] args)
Все подготовительные этапы выполнены, и можно переходить к отрисовке объектов на экране. Для этого используем возможности Swing. Фон зальем черным цветом, а объект игрока — белым. В качестве обозначения цветов можно использовать их англоязычные названия, но заглавными буквами. К примеру, BLACK, WHITE, RED:
public void paintComponent(Graphics g) < super.paintComponent(g); g.setColor(Color.BLACK); // Заливаем фон черным цветом g.fillRect(0, 0, 400, 600); g.setColor(Color.WHITE); // Белый цвет для фигуры игрока g.fillRect(playerX, playerY, 50, 50); // Рисуем объект игрока

Фон и игрок на экране уже есть, но теперь не хватает врагов. Отрисуем их в верхней части окна и отобразим с помощью красных кругов. Вражеских объектов на игровом поле может быть несколько одновременно, поэтому выводить их будем с помощью цикла for:
for (int i = 0; i < enemyX.size(); i++) < g.setColor(Color.RED); // Используем красный цвет g.fillOval(enemyX.get(i), enemyY.get(i), 20, 20); >

Теперь закончим основной интерфейс надписями на экране. В верхнем левом углу будем выводить актуальный счет, а после проигрыша по центру будем показывать надпись «Конец игры». Их сделаем белым цветом и выберем шрифт Arial. В конце игры будем останавливать игровой таймер:
g.setColor(Color.WHITE); g.setFont(new Font("Arial", Font.PLAIN, 20)); g.drawString("Счет: " + score, 10, 30); // Выводим счет игрока на экран if (gameOver) < g.setFont(new Font("Arial", Font.PLAIN, 40)); g.drawString("Конец игры", 120, 300); // Выводим надпись "Конец игры" при окончании игры timer.stop(); // Останавливаем таймер >

Пришло время оживить врагов. Их объекты должны спускаться вниз и удаляться при пересечении нижней линии окна. В этот же момент счет игрока должен увеличиваться на число, равное количеству вражеских объектов. Все это реализуем в классе actionPerformed. В конце обязательно обновляем экран. Иначе враги будут оставаться на нем и копиться:
@Override public void actionPerformed(ActionEvent e) < if (!gameOver) < for (int i = 0; i < enemyX.size(); i++) < enemyY.set(i, enemyY.get(i) + enemySpeed); // Двигаем врагов вниз по экрану if (enemyY.get(i) >= 600) < enemyX.remove(i); enemyY.remove(i); score++; // Увеличиваем счет при уничтожении врага >> repaint(); // Обновляем экран
Добавим механизм, который будет создавать на экране новых врагов, если на нем никого нет. В конце добавим проверку cтолкновений с объектом игрока:
if (enemyX.isEmpty()) < spawnEnemy(); // Создаем нового врага, если текущих нет на экране >checkCollision(); // Проверяем коллизию игрока с врагами
Мы уже реализовали правила рендеринга врагов и механизм их спуска вниз, но все еще не умеем отслеживать их количество на экране. В классе spawnEnemy сразу обозначим, что одновременно на экране может быть не меньше одного и не больше пяти вражеских объектов. Можно поэкспериментировать с количеством, меняя значение переменной numEnemies:
public void spawnEnemy() < Random rand = new Random(); int numEnemies = rand.nextInt(5) + 1; // Генерируем от 1 до 5 врагов за раз for (int i = 0; i < numEnemies; i++) < int x = rand.nextInt(350); // Генерируем случайную X-координату для врага int y = 0; enemyX.add(x); enemyY.add(y); // Добавляем врага в списки координат >>
Если игрок сталкивается с объектом врага, то игра сразу же завершается. В разработке игр столкновения объектов обычно называют коллизиями, а в профессиональных движках за их отслеживание отвечают специальные механизмы. В нашем проекте мы сами реализуем такой.
Для отслеживания столкновений важно знать границы двух объектов. Если они соприкасаются, то запускается определенное действие. К примеру, если границы двух объектов-автомобилей в игре сходятся, то начинает воспроизводиться анимация столкновения и разрушений. В нашем случае игра будет завершаться, а на экран выводится надпись «Конец игры»:
public void checkCollision() < Rectangle playerBounds = new Rectangle(playerX, playerY, 50, 50); // Границы игрока for (int i = 0; i < enemyX.size(); i++) < Rectangle enemyBounds = new Rectangle(enemyX.get(i), enemyY.get(i), 20, 20); // Границы врага if (playerBounds.intersects(enemyBounds)) < gameOver = true; // Если произошло столкновение, игра заканчивается break; >> >
Пришла пора оживить игрока. Главный объект может двигаться только влево и вправо по горизонтали. Это упрощает нам задачу, так как не надо реализовывать дополнительные модели управления. Для перемещения будем использовать клавиши стрелок, которые обозначаются как VK_LEFT и VK_RIGHT. При нажатии просто будем менять координаты объекта игрока по оси x:
@Override public void keyPressed(KeyEvent e) < int key = e.getKeyCode(); if (!gameOver) < if (key == KeyEvent.VK_LEFT && playerX >0) < playerX -= playerSpeed; // Перемещаем игрока влево >if (key == KeyEvent.VK_RIGHT && playerX < 350) < playerX += playerSpeed; // Перемещаем игрока вправо >> >
Весь код игры выглядит так:
import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.util.ArrayList; import java.util.Random; public class SimpleGame extends JPanel implements ActionListener, KeyListener < private int playerX = 175; // Начальное положение игрока по горизонтали private int playerY = 480; // Начальное положение игрока по вертикали private int playerSpeed = 15; // Скорость движения игрока private ArrayListenemyX = new ArrayList<>(); // X-координаты врагов private ArrayList enemyY = new ArrayList<>(); // Y-координаты врагов private int enemySpeed = 20; // Скорость движения врагов private Timer timer; // Таймер для обновления экрана private boolean gameOver = false; // Флаг окончания игры private int score = 0; // Счет игрока public SimpleGame() < addKeyListener(this); setFocusable(true); setFocusTraversalKeysEnabled(false); timer = new Timer(100, this); // Тут создаем таймер timer.start(); // В этой строчке его запускаем >public static void main(String[] args) < JFrame frame = new JFrame("Simple Game"); SimpleGame game = new SimpleGame(); frame.add(game); frame.setSize(400, 600); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); >public void paintComponent(Graphics g) < super.paintComponent(g); g.setColor(Color.BLACK); // Заливаем фон черным цветом g.fillRect(0, 0, 400, 600); g.setColor(Color.WHITE); // Белый цвет для фигуры игрока g.fillRect(playerX, playerY, 50, 50); // Рисуем объект игрока for (int i = 0; i < enemyX.size(); i++) < g.setColor(Color.RED); // Используем красный цвет g.fillOval(enemyX.get(i), enemyY.get(i), 20, 20); >g.setColor(Color.WHITE); g.setFont(new Font("Arial", Font.PLAIN, 20)); g.drawString("Счет: " + score, 10, 30); // Выводим счет игрока на экран if (gameOver) < g.setFont(new Font("Arial", Font.PLAIN, 40)); g.drawString("Конец игры", 120, 300); // Выводим надпись "Конец игры" при окончании игры timer.stop(); // Останавливаем таймер >> @Override public void actionPerformed(ActionEvent e) < if (!gameOver) < for (int i = 0; i < enemyX.size(); i++) < enemyY.set(i, enemyY.get(i) + enemySpeed); // Двигаем врагов вниз по экрану if (enemyY.get(i) >= 600) < enemyX.remove(i); enemyY.remove(i); score++; // Увеличиваем счет при уничтожении врага >> repaint(); // Перерисовываем экран if (enemyX.isEmpty()) < spawnEnemy(); // Создаем нового врага, если текущих нет на экране >checkCollision(); // Проверяем коллизию игрока с врагами > > public void spawnEnemy() < Random rand = new Random(); int numEnemies = rand.nextInt(5) + 1; // Генерируем от 1 до 5 врагов за раз for (int i = 0; i < numEnemies; i++) < int x = rand.nextInt(350); // Генерируем случайную X-координату для врага int y = 0; enemyX.add(x); enemyY.add(y); // Добавляем врага в списки координат >> public void checkCollision() < Rectangle playerBounds = new Rectangle(playerX, playerY, 50, 50); // Границы игрока for (int i = 0; i < enemyX.size(); i++) < Rectangle enemyBounds = new Rectangle(enemyX.get(i), enemyY.get(i), 20, 20); // Границы врага if (playerBounds.intersects(enemyBounds)) < gameOver = true; // Если произошло столкновение, игра заканчивается break; >> > @Override public void keyTyped(KeyEvent e) <> @Override public void keyPressed(KeyEvent e) < int key = e.getKeyCode(); if (!gameOver) < if (key == KeyEvent.VK_LEFT && playerX >0) < playerX -= playerSpeed; // Перемещаем игрока влево >if (key == KeyEvent.VK_RIGHT && playerX < 350) < playerX += playerSpeed; // Перемещаем игрока вправо >> > @Override public void keyReleased(KeyEvent e) <> >
Что дальше
У нас есть готовая игра, которую можно модифицировать, вот пара идей для вдохновения:
- в проект можно добавить фоновую музыку и звуки, которые будут воспроизводиться при движении игрока и проигрыше. Так игра получится увлекательнее и живее;
- уворачиваться от вражеских объектов со временем надоедает, поэтому для разнообразия игрового процесса можно добавить возможность уничтожать врагов с помощью стрельбы. Для этого надо реализовать класс пуль, их внешний вид и физику движения. При столкновении с врагом с экрана должны пропадать сам враг и пуля;
- вместе с врагами случайно могут спускаться различные бонусы, к примеру, дополнительная жизнь или щит от врагов на какое-то время;
- можно добавить возможность обменивать накопленные очки на дополнительные способности, облегчающие игру. К примеру, позиции спуска следующих игроков могут подсвечиваться, чтобы у игрока была возможность подготовиться.
Java-разработчик
Java уже 20 лет в мировом топе языков программирования. На нем создают сложные финансовые сервисы, стриминги и маркетплейсы. Освойте технологии, которые нужны для backend-разработки, за 14 месяцев.
