Ця сторінка передбачає, що ви переглянули сторінку основні концепції рендера.
Клас GuiGraphics є основним класом, який використовується для рендера в грі. Він використовується для рендера форм, тексту та текстур, і, як бачили раніше, використовується для маніпулювання PoseStack і використання BufferBuilder.
Малювання фігур
Клас GuiGraphics можна використовувати для легкого малювання квадратних фігур. Якщо ви хочете намалювати трикутники або будь-яку неквадратну форму, вам потрібно буде використовувати BufferBuilder.
Малювання прямокутників
Щоб намалювати прямокутник із заливкою, можна використати метод GuiGraphics.fill(...).
java
int rectangleX = 10;
int rectangleY = 10;
int rectangleWidth = 100;
int rectangleHeight = 50;
// x1, y1, x2, y2, color
graphics.fill(rectangleX, rectangleY, rectangleX + rectangleWidth, rectangleY + rectangleHeight, 0xFF0000FF);1
2
3
4
5
6
2
3
4
5
6

Малювання контурів/меж
Скажімо, ми хочемо окреслити прямокутник, який ми щойно намалювали. Ми можемо використати метод GuiGraphics.renderOutline(...), щоб намалювати контур.
java
// x, y, width, height, color
graphics.renderOutline(rectangleX, rectangleY, rectangleWidth, rectangleHeight, 0xFFFF0000);1
2
2

Малювання окремих ліній
Ми можемо використовувати методи GuiGraphics.hLine(...) і DrawContext.vLine(...) для малювання ліній.
java
// Let's split the rectangle in half using a green line.
// x, y1, y2, color
graphics.vLine(rectangleX + rectangleWidth / 2, rectangleY, rectangleY + rectangleHeight, 0xFF00FF00);1
2
3
2
3

Менеджер ножиць
Клас GuiGraphics має вбудований менеджер ножиць. Це дає змогу легко прикріпити рендер до певної області. Це корисно для рендера таких речей, як підказки або інші елементи, які не повинні рендеритися за межами певної області.
Використання менеджера ножиць
TIP
Області ножиць можуть бути вкладеними! Але переконайтеся, що ви вимикаєте менеджер ножиць стільки ж разів, скільки вмикали його.
Щоб увімкнути менеджер ножиць, просто скористайтеся методом GuiGraphics.enableScissor(…). Так само, щоб вимкнути менеджер ножиць, скористайтеся методом GuiGraphics.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
graphics.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
graphics.fillGradient(0, 0, this.width, this.height, 0xFFFF0000, 0xFF0000FF);
// Disable the scissor region.
graphics.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

Як бачите, хоча ми наказуємо грі рендерити градієнт на весь екран, він відтворює лише область ножиць.
Малювання текстур
Не існує єдиного «правильного» способу намалювати текстури на екрані, оскільки метод blit(…) має багато різних перевантажень. У цьому розділі розглядаються найпоширеніші випадки використання.
Малювання всієї текстури
Загалом, рекомендується використовувати перевантаження, яке визначає параметри textureWidth і textureHeight. Це тому, що клас GuiGraphics прийматиме ці значення, якщо ви їх не надасте, що іноді може бути неправильним.
Вам також потрібно буде вказати, який конвеєр рендера використовуватиме ваша текстура. Для базових текстур зазвичай завжди буде RenderPipelines.GUI_TEXTURED.
java
Identifier texture = Identifier.fromNamespaceAndPath("minecraft", "textures/block/deepslate.png");
// renderLayer, texture, x, y, u, v, width, height, textureWidth, textureHeight
graphics.blit(RenderPipelines.GUI_TEXTURED, 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.fromNamespaceAndPath(ExampleMod.MOD_ID, "textures/gui/test-uv-drawing.png");
int u = 10, v = 13, regionWidth = 14, regionHeight = 14;
// renderLayer, texture, x, y, u, v, width, height, regionWidth, regionHeight, textureWidth, textureHeight
graphics.blit(RenderPipelines.GUI_TEXTURED, texture2, 90, 190, u, v, 14, 14, regionWidth, regionHeight, 256, 256);1
2
3
4
2
3
4

Малювання тексту
Клас GuiGraphics має різні зрозумілі методи рендера тексту — задля стислості вони не розглядатимуться тут.
Скажімо, ми хочемо намалювати на екрані «Hello World». Для цього ми можемо використати метод GuiGraphics.drawString(…).
INFO
Minecraft 1.21.6 і вище змінює колір тексту на ARGB замість RGB. Передача значень RGB призведе до того, що ваш текст стане прозорим. Допоміжні методи, такі як ARGB.opaque(...), можна використовувати для зміни RGB на ARGB під час портування.
java
// TextRenderer, text (string, or Text object), x, y, color, shadow
graphics.drawString(minecraft.font, "Hello, world!", 10, 200, 0xFFFFFFFF, false);1
2
2


