Пользователь Зепп Бранниган
Зепп Бранниган
40 уровень

Раздел "Игры" на JavaRush: Игровой движок

Статья из группы JavaRush
«Игры» от JavaRush — новый раздел, который содержит большие задачи-проекты по написанию популярных компьютерных игр. Делать их проще, чем кажется: каждый проект разделен на два десятка подзадач. Выполняя задачи шаг за шагом, вы напишете свою игру, а затем сможете добавить в нее уникальные «фичи» и поделиться ею с друзьями.Раздел Игры используют простой игровой движок JavaRush. В этом материале расскажем о его ключевых возможностях и том, как выглядит процесс написания игры.
  1. Введение
  2. Инициализация игры
  3. Создание игрового поля
  4. Примитивная программа
  5. Работа с клетками игрового поля
  6. Работа с цветом
  7. Диалоговые окна
  8. Утилитные методы
  9. Ограничения игрового движка

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) включительно.

9. Ограничения игрового движка

Чтобы запускать игры на сайте, они переводятся на сервере на JavaScript. В связи с этим появляются некоторые ограничения. В частности, при написании игр с использованием движка JavaRush нельзя работать с файлами, а также использовать все методы класса System, кроме currentTimeMillis(), setOut(), setErr(), arrayscopy(). Также можно использовать поля err и out. Нарушая эти ограничения, игру, конечно же, можно будет скомпилировать и запустить, но опубликовать не удастся. Также не удастся опубликовать игру с бесконечными циклами. На этом все! Если вы хотите узнать о разделе "Игры" больше, вот полезная документация, которая может в этом помочь:
Комментарии (46)
Чтобы просмотреть все комментарии или оставить свой,
перейдите в полную версию
illuminati 20 уровень, Санкт-Петербург
27 декабря 2020
Zhanna 20 уровень, Москва
25 августа 2020
😀
Johnnie Jones 3 уровень, Москва
18 августа 2020
я точно на 3 уровень перешел?
Павел 10 уровень, Новосибирск
12 августа 2020
работаю на маке, открывается окно java но в нем не видно ничего графического, просто пусто. Сейчас 3 уровень сапера, так и должно быть?.
Вадим Михайленко 19 уровень, Харьков
30 июля 2020
Люди, помогите! Создал класс, но при проверке высвечивает то что на экране. Посмотрев сообщения, увидел, что нужно установить JavaFX.Я нашел ее в плагине. При выборе папки, куда ее нужно вставить, выбрал Game и получилось вот так. Но по-прежнему в папке lib ее нет. Может есть где для нубов пошаговая подготовка с нуля. Просмотрел статьи про игры - не нашел (или плохо искал.) Вразумите, плиз
Семён 5 уровень, Великий Новгород
2 мая 2020
Страшно, очень страшно...
Dmitry 27 уровень, Минск
16 марта 2020
Подскажите, пожалуйста что делать с момента как открыл IJ. Ну скачал я движок, что дальше то делать. Создавать новый проект, или открывать его указывая ссылку на движок. Что делать с самого начала?
Sasha Smug 0 уровень
28 февраля 2020
Добрый вечер не подскажите, где можно скачать сам движок?😊
Алексей #1201019 13 уровень, Владивосток
30 января 2020
Не понимаю, почему компиляция не проходит "C:\Program Files\Java\jdk-13.0.2\bin\java.exe" C:\Users\alexe\Documents\JRTasks\JavaRushTasks\8.Games\lib\javafx-sdk-11.0.2\lib --11.0.2\lib\javafx.graphics.jar com.javarush.games.minesweeper.MinesweeperGame Error: Could not find or load main class C:\Users\alexe\Documents\JRTasks\JavaRushTasks\8.Games\lib\javafx-sdk-11.0.2\lib Caused by: java.lang.ClassNotFoundException: C:\Users\alexe\Documents\JRTasks\JavaRushTasks\8.Games\lib\javafx-sdk-11.0.2\lib Process finished with exit code 1
Никола 20 уровень, Москва
16 января 2020
боже, все это время думал, что "Игры" - это раздел, где на платформе в какую-нибудь онлайн-залипалку играешь. Начал с "Сапера" и понял, что на практике пробелов больше чем знаний :D.