В этом уроке улучшим графику игры: добавим градиентный фон и сгенерируем начальную поверхность из кубов.
Создание градиентного фона
Функция gradienBG создаёт градиентный фон. Её вызов осуществляется в функции loop:
// ... внутри функции loop ...
gradienBG();
// ...
Функция создаёт полотно с плавным переходом цвета от одного к другому. Для этого настраивается проекция:
- Режим проекции устанавливается с помощью glMatrixMode(GL_PROJECTION).
- Текущее состояние матрицы сохраняется (glPushMatrix()) и сбрасывается к единичной (glLoadIdentity()).
- Устанавливается ортографическая проекция с помощью glOrtho(0, 800, 0, 600, -1, 1), задавая игровую область от (0, 0) до (800, 600).
- Переход в режим моделирования вида осуществляется с помощью glMatrixMode(GL_MODELVIEW).
- Сохраняется текущее состояние и сбрасывается матрица к единичной.
- Включается смешивание цветов (glEnable(GL_BLEND)) с функцией glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) для создания полупрозрачного эффекта.
- Временно отключается запись в буфер глубины (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. Несмотря на функциональность, алгоритм генерации поверхности может быть улучшен.