Java 3D Игра: Градиентный фон и генерация поверхности

В этом уроке улучшим графику игры: добавим градиентный фон и сгенерируем начальную поверхность из кубов.

Создание градиентного фона

Функция gradienBG создаёт градиентный фон. Её вызов осуществляется в функции loop:

// ... внутри функции loop ...
gradienBG();
// ...

Функция создаёт полотно с плавным переходом цвета от одного к другому. Для этого настраивается проекция:

  1. Режим проекции устанавливается с помощью glMatrixMode(GL_PROJECTION).
  2. Текущее состояние матрицы сохраняется (glPushMatrix()) и сбрасывается к единичной (glLoadIdentity()).
  3. Устанавливается ортографическая проекция с помощью glOrtho(0, 800, 0, 600, -1, 1), задавая игровую область от (0, 0) до (800, 600).
  4. Переход в режим моделирования вида осуществляется с помощью glMatrixMode(GL_MODELVIEW).
  5. Сохраняется текущее состояние и сбрасывается матрица к единичной.
  6. Включается смешивание цветов (glEnable(GL_BLEND)) с функцией glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) для создания полупрозрачного эффекта.
  7. Временно отключается запись в буфер глубины (glDepthMask(GL_FALSE)) для предотвращения перекрытия градиента другими объектами.

Далее рисуется четырёхугольник с помощью glBegin(GL_QUADS). Задаются цвета для нижней и верхней границ, рисуются соответствующие вершины. glEnd() завершает рисование. Восстанавливается запись в буфер глубины (glDepthMask(GL_TRUE)) и отключается смешивание (glDisable(GL_BLEND)). Состояния матриц проекции и моделирования вида восстанавливаются с помощью glPopMatrix().

Раскрашивание куба

Для раскраски куба используйте собственные цвета. Значения RGB можно получить с помощью онлайн-подборщика цветов. Для использования в функциях типа glColor3f(), разделите каждое значение на 255, чтобы получить значения от 0 до 1.

Генерация начальной поверхности из кубов

Начальная поверхность из кубов генерируется в методе init, одновременно с созданием currentCube. Циклы генерируют 25 кубов в ряд, а затем создают несколько таких рядов, формируя поверхность. Для предотвращения наложения кубов используется переменная для расчёта координаты X с шагом 0.3f:

//Пример кода, отображающий суть алгоритма генерации кубов
for (int row = 0; row < 6; row++) {
    float z = -4.1f - row * 0.3f;
    for (int i = 0; i < 25; i++) {
        float x = -3 + i * 0.3f;
        // ... добавление куба с координатами x, -1.7, z ...
    }
}

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

Что будем искать? Например,программа