«Игры» от JavaRush — новый раздел, который содержит большие задачи-проекты по написанию популярных компьютерных игр. Делать их проще, чем кажется: каждый проект разделен на два десятка подзадач. Выполняя задачи шаг за шагом, вы напишете свою игру, а затем сможете добавить в нее уникальные «фичи» и поделиться ею с друзьями.Игры используют простой игровой движок JavaRush. В этом материале расскажем о его ключевых возможностях и том, как выглядит процесс написания игры.

1. Введение

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

  2. Игровой процесс. К нему относятся движение игровых объектов, действия игрока, учет заработанных очков, а также другие действия, которые необходимо выполнять с определенной периодичностью или по нажатию кнопок.

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

2. Инициализация игры

Инициализация игры состоит всего из двух шагов:

Шаг 1: создаем основной класс игры.

Для разработки своей игры на основе игрового движка JavaRush, вам нужно создать класс и унаследовать его от класса Game (com.javarush.engine.cell.Game). Это даст вашему классу возможность вызывать методы игрового движка, а движку — вызывать ваши методы. Пример:
import com.javarush.engine.cell.Game;

public class MySuperGame extends Game {
    ...
}

Шаг 2: переопределяем метод initialize().

В этом методе будут происходить все действия, необходимые для старта игры: создание игрового поля, создание игровых объектов, и т.д. Вам нужно просто объявить этот метод в классе, унаследованном от класса Game. Пример:
import com.javarush.engine.cell.Game;

public class MySuperGame extends Game {

    @Override
    public void initialize() {
        // Тут выполняем все действия по инициализации игры и ее объектов
    }
}
Метод initialize() — это аналог метода main(): именно с него начинает выполняться весь код, написанный для игры.

3. Создание игрового поля

Создание игрового поля тоже состоит всего из двух шагов.

Шаг 1: делим игровое поле на клетки.

Все игровое поле делится игровым движком на клетки. Минимальный размер — 3x3, максимальный — 100x100. Игровой экран имеет постоянный размер. Его можно разделить на разное количество клеток. Например, ширина 7 и высота 9:
Обратите внимание, что нумерация клеток начинается с верхнего левого угла. Чтобы задать размер игрового поля, используйте метод void setScreenSize(int width, int height). Он задает размер игрового поля. В качестве параметров принимает количество клеток по горизонтали (width) и по вертикали (height). Обычно он вызывается один раз при запуске игры. Пример:
import com.javarush.engine.cell.Game;

public class MySuperGame extends Game {

    @Override
    public void initialize() {
       //задали размер поля 7x9 клеток
       setScreenSize(7, 9);
        ...
    }
}
При написании игры может понадобиться получить текущую ширину и высоту игрового поля. Для этого пригодятся методы int getScreenWidth() и int getScreenHeight().

Шаг 2: включаем или выключаем сетку (необязательно).

Если вам не нравится, что на игровом поле отображается черная сетка, разделяющая ячейки, ее можно выключить. Метод void showGrid(boolean isShow) включает и выключает сетку, разделяющую клетки. По умолчанию сетка отображается. Чтобы ее выключить, вызовите этот метод с параметром false:
showGrid(false);
Результат:
Чтобы снова включить сетку, вызовите:
showGrid(true);

4. Примитивная программа

Пример программы:
public class MySuperGame extends Game
{
    @Override
    public void initialize()
    {
        // Создаем игровое поле 3x3 клетки
        setScreenSize(3, 3);
        // Выключаем отображение сетки
        showGrid(false);
        // Меняем фон центральной клетки на синий, и отображаем в ней “Х”
        setCellValueEx(1, 1, Color.BLUE, "X", Color.ORANGE, 50);
    }
}
В этом примере игровому полю задается размер 3х3, отключается отображение сетки и по центру устанавливается оранжевый символ «Х» размером в половину клетки на синем фоне. Это будет первое, что увидит игрок при запуске игры.

5. Работа с клетками игрового поля

То, что мы можем поделить игровое поле на ячейки — это отлично, а что мы можем делать с самими ячейками? Каждой клетке игрового поля можно задать:
  • цвет клетки (цвет фона ячейки);
  • текст (текст или число);
  • цвет текста;
  • размер текста в процентах относительно размера клетки.
Рассмотрим методы для работы с клетками игрового поля:
  1. void setCellColor(int x, int y, Color color) — устанавливает клетке с координатами (x, y) цвет color:

    setCellColor(0, 0, Color.RED);
    setCellColor(3, 6, Color.BLACK);
    setCellColor(6, 8, Color.NONE);

  2. Color getCellColor(int x, int y) — возвращает цвет клетки с координатами (x, y):

    Color myColor = getCellColor(2, 0);

  3. void setCellValue(int x, int y, String value) — помещает в клетку с координатами (x, y) текст value:

    setCellValue(3, 3, "text");
    setCellValue(0, 8, "W");
    setCellValue(4, 1, "2222");
    setCellValue(6, 6, "");

  4. String getCellValue(int x, int y) — возвращает текст, содержащийся в клетке с координатами (x, y):

    String s = getCellValue(3, 3);
    System.out.println(getCellValue(4, 1));

  5. void setCellTextSize(int x, int y, int size) — устанавливает размер контента в клетке с координатами (x, y). size – высота текста в процентах от высоты клетки:

    setCellTextSize(2 , 0, 70); // 70% высоты клетки

  6. int getCellTextSize(int x, int y) — возвращает размер контента в клетке с координатами (x, y):

    int size = getCellTextSize(2 , 0);

  7. void setCellNumber(int x, int y, int value) — помещает в клетку с координатами (x, y) число value:

    setCellNumber(3, 3, 40);
    setCellNumber(0, 8, -8);
    setCellNumber(4, 1, 2222);
    setCellNumber(6, 6, 0);

  8. int getCellNumber(int x, int y) — возвращает число, содержащееся в клетке с координатами (x, y). Если в клетке содержится не число, возвращает 0:

    int i = getCellNumber(3, 3);
    System.out.println(getCellNumber(4, 1));

  9. void setCellTextColor(int x, int y, Color color) — устанавливает цвет контента(текста) в клетке с координатами (x, y):

    setCellTextColor(2, 1, Color.GREEN);
    setCellTextColor(0, 1, Color.NONE);

  10. Color getCellTextColor(int x, int y) — возвращает цвет контента (текста) в клетке с координатами (x, y):

    Color textColor = getCellTextColor(1, 3);
Для удобства есть несколько методов setCellValueEx() с разным набором параметров:
  1. void setCellValueEx(int x, int y, Color cellColor, String value) — устанавливает клетке с координатами (x, y) цвет фона cellColor и контент value:

    setCellValueEx(0, 2, Color.BLUE, "56");

  2. void setCellValueEx(int x, int y, Color cellColor, String value, Color textColor) — устанавливает клетке с координатами (x, y) цвет фона cellColor, контент value и цвет контента textColor:

    setCellValueEx(0, 2, Color.BLACK, "56", Color.GREEN);

  3. void setCellValueEx(int x, int y, Color cellColor, String value, Color textColor, int textSize); — устанавливает клетке с координатами (x, y) цвет фона cellColor, контент value, цвет контента textColor и размер контента textSize:

    setCellValueEx(0, 2, Color.BLACK, "56", Color.GREEN, 70);

6. Работа с цветом

За цвета в игровом движке отвечает enum Color, который содержит уникальные значения для 148 цветов. А также специальное значение NONE — отсутствие цвета. Пример работы с цветом:
Color myColor = Color.WHITE;  // переменной myColor присваивается белый цвет.
Color redColor = Color.RED;   // переменной redColor присваивается красный цвет.
Color blueColor = Color.BLUE; // переменной blueColor присваивается белый синий.
Иногда может понадобиться получить массив всех существующих цветов. Для этого используйте метод values(). Например:
// переменной colors присваивается массив, содержащий все доступные цвета.
Color[] colors = Color.values();
Получить номер цвета в палитре очень просто:
Color color = Color.RED;
int redIndex = color.ordinal();  //Номер красного цвета

int blueIndex = Color.BLUE.ordinal(); //Номер синего цвета
Также можно получить цвет по его номеру:
// переменной color присваивается цвет с индексом 10 из enum Color.
Color color = Color.values()[10];

7. Диалоговые окна

В конце игры игроку нужно сообщить о победе или поражении. Для этого есть специальный метод, который выводит диалоговое окно на игровой экран:
void showMessageDialog(Color cellColor, String message, Color textColor, int textSize)
Здесь:
  • cellColor — цвет фона диалогового окна;
  • message — текст сообщения;
  • textColor — цвет текста сообщения;
  • textSize — размер текста сообщения.
Диалоговое окно закрывается само по себе, если пользователь нажал пробел.

8. Утилитные методы

При написании игр часто используются случайные числа. Чтобы упростить получение случайных чисел, можно использовать утильные методы движка:
  1. int getRandomNumber(int max) — возвращает случайное целое число от 0 до (max–1) включительно.

  2. int getRandomNumber(int min, int max) — возвращает случайное целое число от min до (max–1) включительно.
На этом все! Если вы хотите узнать о разделе "Игры" больше, вот полезная документация, которая может в этом помочь: