Ця сторінка передбачає, що ви переглянули сторінку основні концепції промальовування.
Клас 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


