Перейти к содержимому

Как написать игру на java для андроид

  • автор:

Страница не найдена

Страница не найдена

Этот вопрос был удалён с сайта Stack Overflow на русском в процессе модерации . Чтобы узнать возможные причины удаления вопроса, обратитесь в справочный центр.

Несколько вопросов, которые могут быть вам полезны:

  • Java библиотека LWJGL: Display cannot be resolved
  • Верстка игры под андроид
  • отображение картинки (текстуры) LWJGL java
  • java обработчик событий клавиатуры lwjgl
  • Redirect с предыдущим url

Если вы думаете, что здесь чего-то не хватает, свяжитесь с нами.

Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.

Cоздание игры в Android Studio. Плюсы и минусы. История и опыт разработки

Если ты вдруг решил создать игру для Android, да еще и свою первую игру, то с чего же ты начнешь? Год назад, я думал, что Android Studio — это лучшая среда разработки для всех андроид приложений, и сейчас, имея полностью готовое приложение в Google Play, готов поделиться опытом.

Когда ты первый раз в GameDev, нужно запастись терпением и изучить как можно больше средств и инструментов для создания своей игры, а также осознать свои возможности и средства. В моем случае средств не было, а возможности. . к слову, Java я изучал вместе с изучением Android Studio. Стоит сказать, что Java — это не первый мой язык. До этого я освоил Си и «плюсы», Python и даже Delphi, сейчас о нем никто и не вспомнит, наверное. В общем, программировать я умею и люблю, а на каком языке строится задача, это уже вопрос посредственный.

Что же предлагает мир для разработки приложений под Android? Да на самом деле очень много предлагает, это и Unity и Unreal Engine и набирающий популярность своей простотой Godot, а так же Cocos2d (правда, он только для 2D приложений).

Конечно, если ты еще новичок, то логично будет начать создание с 2D игр, а потом уже решить для себя, оставаться же на 2D или сделать что-то интересное в объемном 3D пространстве.

Дальше встает выбор, насколько крутой проект делать. Мозг обычно создает идеальные образы, и хочется сделать какой-нибудь Сall of Duty или GTA. Но нужно понимать, что AAA-проекты создаются большой командой разработчиков с огромным опытом за спиной, с многомилионными вложениями в проект, в течение 3-5 лет. А так как ты еще новичок, опыта за спиной ноль, то скорее всего ты сдашься в самом начале пути или заблудишься в этой пучине разработки. Потому проект должен быть максимально простой и давать результат. Тогда я решил, что надо придумать проект, который смогу сделать за месяц. Потом сделать еще проект, и еще, постепенно увеличивая сложность разработки. Так появилась идея создать игру Candy Coloration — раскраску для детей. Но спустя некоторое время идея перескочила на пазлы, которые нужно будет собирать с какой-то целью, а не просто так. Так родилась игра Puzzle of Life. Ссылка на игру ниже, если тебе будет интересно.

Разработка типичной игры

Создание игр — это увлекательное занятие для программиста. Но все игры строятся по общему сценарию. Есть несколько экранов для взаимодействия с пользователем:

Экран-заставка Заставка с изображением логотипа компании, сценки из игры, версии и т.д. Появляется на несколько секунд, а затем исчезает. Может воспроизводиться фоновая музыка Меню Второй экран, на котором пользователь может переходить по пунктам меню, например, Играть, Счёт, Настройки, Справка Основной экран Здесь собственно происходит игровой процесс Настройки Экран настроек параметров игры Счет Окно, на которое можно перейти из меню. Здесь можно отображать статистику достижений, таблицу рекордов Справка Выводится инструкция по игре: описание, управление, советы

Это типичный пример стандартной игры. Естественно, вы можете отказаться от каких-то экранов или, наоборот, добавить еще, но в целом картина ясна. Таким образом нам нужно реализовать шесть активностей:

  • SplashActivity — активность по умолчанию. Выводится на несколько секунд. После нее должна выводиться активность MenuActivity
  • MenuActivity — содержит кнопки, картинки и другие элементы, с помощью которых можно запустить другие активности
  • GameActivity — основной экран игры, где выводится графика, идет подсчет очков и т.д.
  • SettingsActivity — сохраняем различные настройки дли игры
  • ScoresActivity — загружает данные о достижениях игроков и выводит его пользователю для просмотра
  • HelpActivity — выводит справочную информацию. Если текст большой, то нужно также предусмотреть прокрутку

У каждого класса активности должен быть собственный файл разметки со своим набором элементов. Ваша задача научиться управлять состоянием приложения, пользоваться настройками, запускать нужные активности.

Также удобно создать ещё один базовый класс активности с общедоступными компонентами, например, BaseActivity.

Контекст приложения

Контекст приложения — это основа работы любого приложения, в том числе и игры. Он служит для получения доступа к настройкам и ресурсам, используемым несколькими экземплярами активностей.

Получить доступ к контексту приложения текущего процесса можно через метод getApplicationContext():

 Context context = getApplicationContext(); 

Поскольку класс Activity происходит от класса Context, вы можете использовать ключевое слово this вместо явного указания контекста приложения.

Разобравшись с функциональностью будущей игры, можно приступить к её реализации.

Мы знаем, что класс Activity — это основной класс любого приложения на Android. Значит, нам понадобится пять различных классов Activity для нашей цели. В процессе игры пользователь будет переходить из одной активности в другую (кроме первой активности, где будет предусмотрен автоматический переход).

Есть несколько вариантов запуска активностей

  • Через указание в файле манифеста — так запускается активность по умолчанию. В нашем случае это Splash-заставка
  • C помощью контекста приложения при помощи startActivity()
  • Запуск дочерней активности из родительской активности

Заставка-экран

Сама заставка должна появиться на несколько секунд. Обычно на неё помещают картинку, название игры, номер версии, автора и т.д. В некоторых случаях уместно использовать небольшую анимацию.

Меню игры

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

Экран справки

На данном экране пользователь может ознакомиться с правилами игры. Поэтому здесь нужно отобразить текст справки с возможностью прокрутки.

Счет или таблица рекордов

В таблице рекордов пользователь может видеть текущий игровой счёт с перечнем игроков, заработавших наибольшее количество очков. Иными словами, здесь выводится статистика лучших игровых достижений или вывод текущего счета.

Экран настроек

На этом экране пользователь может редактировать и сохранять различные параметры, например, своё имя или аватар.

Основной экран

Здесь происходит основное действие игры. Если игра завершена, то нужно осуществить переход к экрану таблицы рекордов, чтобы посмотреть на результат игры.

Реализация прототипа приложения

Создадим новый проект с активностью SplashActivity, которая будет вызываться первой. Далее нам нужно создать файлы макетов для каждой активности. Так как первой у нас будет вызываться заставка, то переименуйте файл main_activity.xml в splash.xml. Затем можно сделать пять копий splash.xml и дать им новые имена: game.xml, help.xml, menu.xml, scores.xml и settings.xml.

Чтобы не путаться в экранах, рекомендую создать строковые ресурсы с именами экранов и сопоставить их с нужными экранами в TextView. Создаём ресурсы:

 Splash Screen Game Screen Menu Screen Help Screen Scores Screen Settings Screen 

Теперь открываем каждый файл разметки и меняем строчку android:text=»@string/hello» на android:text=»@string/splash» и т.п. После этой операции вы не будете путаться в экранах.

Сразу можно позаботиться о новом значке для игры и добавить его в папку drawable.

Мы уже договорились, что у нас будет основной класс BaseActivity. Создайте файл класса BaseActivity.java и вставьте минимальный код:

 package ru.alexanderklimov.tomorpussy; import android.app.Activity; public class BaseActivity extends Activity

Вернитесь к файлу SplashActivity.java и расширьте его из класса BaseActivity вместо класса Activity.

Скопируйте активность SplashActivity и создайте новые классы MenuActivity, HelpActivity, ScoresActivity, SettingsActivity и GameActivity.

В каждом созданном классе нужно заменить в строчке setContentView(R.layout.splash); ресурс макета на соответствующий, например, для экрана настроек, это будет R.layout.settings.

Далее необходимо прописать все созданные классы в манифесте приложения.

Для проверки можно запустить проект на эмуляторе. Если все сделано правильно, то в окне эмулятора появится экран Заставки, который содержит текст Splash Screen.

Создание экрана-заставки

Наша задача — создать экран, который исчезнет сам после короткой паузы. Для игры можно использовать анимационную заставку, а также выводить информацию о версии, разработчике и т.д. Напоминаю, что для макета заставки у нас используется файл splash.xml в папке layout.

После анимации нужно запустить новый экран с меню и закрыть текущий экран.

 startActivity(new Intent(SplashActivity.this, MenuActivity.class)); SplashActivity.this.finish(); 

Создание игры на Java: основы, примеры и пошаговая инструкция

Создание игры на Java: основы, примеры и пошаговая инструкция

Даниил Шатухин

Даниил Шатухин Редактор в «Хабре», тестировщик и любитель веба

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

Освойте профессию «Java-разработчик»

Java для разработки игр

Долгое время Java был основным языком для разработки мобильных игр под сотовые телефоны, потом язык стал сердцем системы Android. Поэтому множество проектов из начала двухтысячных годов используют под капотом Java. К примеру, культовая игра Gravity Defied, в которой надо помочь мотоциклисту проехаться по холмам и не упасть, разработана на Java. java игра Gravity DefiedПример десктопного проекта игры на Java — Minecraft, основная версия полностью написана на этом языке. Позже Microsoft переписала проект на C++ и выпустила Bedrock Edition, но все равно продолжает поддерживать версию на Java, которая обеспечивает большую совместимость, особенно на старом железе. Джава игра MinecraftJava можно использовать не только для изучения основ геймдева, но и для разработки больших успешных проектов, в которые играют миллионы пользователей.

Профессия / 14 месяцев
Java-разработчик
Освойте востребованный язык
3 933 ₽/мес 7 150 ₽/мес

Group 1321314345 (4)

Игровые движки на 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); // Рисуем объект игрока

Интерфейс игры на java

Фон и игрок на экране уже есть, но теперь не хватает врагов. Отрисуем их в верхней части окна и отобразим с помощью красных кругов. Вражеских объектов на игровом поле может быть несколько одновременно, поэтому выводить их будем с помощью цикла for:

for (int i = 0; i < enemyX.size(); i++) < g.setColor(Color.RED); // Используем красный цвет g.fillOval(enemyX.get(i), enemyY.get(i), 20, 20); >

Интерфейс игры на java со счетом и врагами

Теперь закончим основной интерфейс надписями на экране. В верхнем левом углу будем выводить актуальный счет, а после проигрыша по центру будем показывать надпись «Конец игры». Их сделаем белым цветом и выберем шрифт 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 месяцев.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *