На этой странице предполагается, что вы ознакомились со страницей Основные концепции рендеринга.
Класс DrawContext является основным классом, используемым для рендеринга в игре. Он используется для рендеринга фигур, текста и текстур, а так же, как было показано ранее, для управления MatrixStack и использования BufferBuilder.
Рисование фигур
Класс DrawContext можно использовать для простого рисования квадратных фигур. Если вы хотите нарисовать треугольники или любую другую неквадратную фигуру, вам понадобится BufferBuilder.
Рисование прямоугольников
Для рисования закрашенного прямоугольника можно использовать метод DrawContext.fill(...).
java
int rectangleX = 10;
int rectangleY = 10;
int rectangleWidth = 100;
int rectangleHeight = 50;
// x1, y1, x2, y2, color
context.fill(rectangleX, rectangleY, rectangleX + rectangleWidth, rectangleY + rectangleHeight, 0xFF0000FF);1
2
3
4
5
6
2
3
4
5
6

Контуры рисования/границы
Допустим, мы хотим обвести только что нарисованный прямоугольник. Мы можем использовать метод DrawContext.drawBorder(...), чтобы нарисовать контур.
java
// x, y, width, height, color
context.drawBorder(rectangleX, rectangleY, rectangleWidth, rectangleHeight, 0xFFFF0000);1
2
2

Рисование отдельных линий
Для рисования линий мы можем использовать методы DrawContext.drawHorizontalLine(...) и DrawContext.drawVerticalLine(...).
java
// Let's split the rectangle in half using a green line.
// x, y1, y2, color
context.drawVerticalLine(rectangleX + rectangleWidth / 2, rectangleY, rectangleY + rectangleHeight, 0xFF00FF00);1
2
3
2
3

Менеджер ножниц
Класс DrawContext имеет встроенный менеджер ножниц. Это позволяет вам легко привязать визуализацию к определенной области. Это полезно для отображения таких вещей, как всплывающие подсказки или другие элементы, которые не должны отображаться за пределами определенной области.
Использование менеджера ножниц
TIP
Области ножниц могут быть вложенными! Но убедитесь, что вы отключаете менеджер ножниц столько же раз, сколько и включали его.
Чтобы включить менеджер ножниц, просто используйте метод DrawContext.enableScissor(...). Аналогично, чтобы отключить менеджер ножниц, используйте метод DrawContext.disableScissor().
java
// Let's create a scissor region that covers a middle bar section of the screen.
int scissorRegionX = 200;
int scissorRegionY = 20;
int scissorRegionWidth = 100;
// The height of the scissor region is the height of the screen minus the height of the top and bottom bars.
int scissorRegionHeight = this.height - 40;
// x1, y1, x2, y2
context.enableScissor(scissorRegionX, scissorRegionY, scissorRegionX + scissorRegionWidth, scissorRegionY + scissorRegionHeight);
// Let's fill the entire screen with a color gradient, it should only be visible in the scissor region.
// x1, y1, x2, y2, color1, color2
context.fillGradient(0, 0, this.width, this.height, 0xFFFF0000, 0xFF0000FF);
// Disable the scissor region.
context.disableScissor();1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

Как видите, даже несмотря на то, что мы говорим игре отрисовывать градиент по всему экрану, она отрисовывает его только в области ножниц.
Текстуры для рисования
Не существует единственно «правильного» способа отрисовки текстур на экране, поскольку метод drawTexture(...) имеет множество различных перегрузок. В этом разделе будут рассмотрены наиболее распространенные варианты использования.
Рисование всей текстуры
Обычно рекомендуется использовать перегрузку, которая задает параметры textureWidth и textureHeight. Это связано с тем, что класс DrawContext примет эти значения, если вы их не предоставите, что иногда может быть неверным.
Вам также нужно будет указать слой рендеринга, на котором будет нарисована ваша текстура. Для базовых текстур это обычно всегда будет RenderLayer::getGuiTextured.
java
Identifier texture = Identifier.of("minecraft", "textures/block/deepslate.png");
// renderLayer, texture, x, y, u, v, width, height, textureWidth, textureHeight
context.drawTexture(RenderLayer::getGuiTextured, texture, 90, 90, 0, 0, 16, 16, 16, 16);1
2
3
2
3

Рисование части текстуры
Вот тут-то и появляются u и v. Эти параметры определяют верхний левый угол текстуры для рисования, а параметры regionWidth и regionHeight определяют размер части текстуры для рисования.
Давайте возьмем эту текстуру в качестве примера.

Если мы хотим нарисовать только область, содержащую увеличительное стекло, мы можем использовать следующие значения u, v, regionWidth и regionHeight:
java
Identifier texture2 = Identifier.of("fabric-docs-reference", "textures/gui/test-uv-drawing.png");
int u = 10, v = 13, regionWidth = 14, regionHeight = 14;
// renderLayer, texture, x, y, width, height, u, v, regionWidth, regionHeight, textureWidth, textureHeight
context.drawTexture(RenderLayer::getGuiTextured, texture2, 90, 190, 14, 14, u, v, regionWidth, regionHeight, 256, 256);1
2
3
4
2
3
4

Рисунок текста
Класс DrawContext имеет различные интуитивно понятные методы визуализации текста — для краткости они здесь не будут рассматриваться.
Допустим, мы хотим нарисовать на экране «Hello World». Для этого мы можем использовать метод DrawContext.drawText(...).
java
// TextRenderer, text (string, or Text object), x, y, color, shadow
context.drawText(client.textRenderer, "Hello, world!", 10, 200, 0xFFFFFFFF, false);1
2
2


