Java 3D игра: Генерация и расстановка блоков

В этом уроке создадим функционал генерации и расстановки кубов в игре. Сейчас можно создать только один 3D-куб, вращать и перемещать его, но создание дополнительных кубов невозможно. Реализуем возможность создавать новые кубы, перемещать их и устанавливать в нужной точке с помощью клавиши Enter.

Создание класса Cube

Для удобной работы с множеством кубов создадим отдельный класс Cube. В нём будут храниться следующие поля:

  • float x: координата X позиции куба.
  • float y: координата Y позиции куба.
  • float z: координата Z позиции куба.
  • float angle: угол вращения куба.

Создадим конструктор для быстрого задания значений:

public Cube(float x, float y, float z, float angle) {
    this.x = x;
    this.y = y;
    this.z = z;
    this.angle = angle;
}

Класс принимает значения координат и угла вращения, устанавливая их в соответствующие поля.

Модификация основного класса

В основном классе удалим поля, отвечающие за позицию и вращение куба, так как теперь эта информация будет храниться в объектах класса Cube. Добавим следующие поля:

  • private ArrayList<Cube> cubes;: список кубов. Инициализируем его как new ArrayList<>().
  • private Cube currentCube;: текущий куб, с которым взаимодействуем.

Инициализация и обработка ввода

Функция run() остаётся без изменений. В обработке нажатий клавиш будем обращаться к currentCube для изменения его координат. Функция init() инициализирует currentCube:

currentCube = new Cube(0, -5, 0, 0);

При нажатии клавиши Enter будем добавлять currentCube в список cubes и создавать новый currentCube с новыми координатами:

cubes.add(currentCube);
currentCube = new Cube(0, -5, 0, 0); //или другие координаты

Отрисовка кубов

Для отрисовки всех кубов, включая текущий, добавим цикл, перебирающий список cubes, и функцию drawCube(), которая будет принимать объект Cube в качестве параметра и отрисовывать его:

for (Cube cube : cubes) {
    drawCube(cube);
}
drawCube(currentCube);

Функция drawCube() будет содержать код отрисовки, использующий координаты и угол вращения из переданного объекта Cube.

Управление вращением

Добавим поле boolean rotating = false; в основной класс. При нажатии на клавишу ‘R’ будем изменять значение rotating на противоположное. В функции loop() будем вращать currentCube только если rotating == true:

if (rotating) {
    // Код вращения currentCube
}

Теперь можно создавать и расставлять неограниченное количество кубов, управлять их вращением с помощью клавиши ‘R’ и устанавливать их в нужных позициях с помощью клавиши Enter. Возможность накладывать кубы друг на друга открывает путь к созданию более сложных структур в игре.

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