В этом уроке создадим функционал генерации и расстановки кубов в игре. Сейчас можно создать только один 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. Возможность накладывать кубы друг на друга открывает путь к созданию более сложных структур в игре.