Ми вже коротко торкалися рендера речей у HUD на сторінці основних концепцій рендера і використання контексту малювання, тому на цій сторінці ми будемо дотримуватись API Hud і параметра DeltaTracker.
HudRenderCallback
WARNING
Раніше Fabric надавав HudRenderCallback для рендера в HUD. Через зміни у рендері HUD ця подія стала надзвичайно обмеженою та не підтримується після Fabric API 0.116. Використання настійно не рекомендується.
HudElementRegistry
Fabric надає API Hud для рендера та накладення елементів на HUD.
Для початку нам потрібно зареєструвати слухача HudLayerRegistrationCallback, який реєструє ваші елементи. Кожен елемент є HudElement. Екземпляр HudElement — це зазвичай лямбда, яка приймає екземпляри GuiGraphics і DeltaTracker як параметри. Перегляньте HudElementRegistry та пов’язані Javadocs, щоб дізнатися більше про те, як використовувати API.
Контекст малювання можна використовувати для доступу до різноманітних утиліт рендера, які надає гра, і доступу до стека сирих матриць. Перегляньте сторінку контексту малювання, щоб дізнатися більше про контекст малювання.
Дельта-трекер
Клас DeltaTracker дозволяє отримати поточне значення gameTimeDeltaPartialTick. gameTimeDeltaPartialTick — це «прогрес» між останнім і наступним ігровими тактами.
Наприклад, якщо ми припустимо сценарій 200 к/с, гра запускає новий такт приблизно кожні 10 кадрів. Кожен кадр, gameTimeDeltaPartialTick, представляє, наскільки ми знаходимося між останнім і наступним тактами. Понад 11 кадрів ви можете побачити:
| Кадр | gameTimeDeltaPartialTick |
|---|---|
1 | 1: Новий такт |
2 | 1/10 = 0.1 |
3 | 2/10 = 0.2 |
4 | 3/10 = 0.3 |
5 | 4/10 = 0.4 |
6 | 5/10 = 0.5 |
7 | 6/10 = 0.6 |
8 | 7/10 = 0.7 |
9 | 8/10 = 0.8 |
10 | 9/10 = 0.9 |
11 | 1: Новий такт |
Ви можете отримати gameTimeDeltaPartialTick, викликавши deltaTracker.getGameTimeDeltaPartialTick(false), де логічним параметром є ignoreFreeze, що, по суті, дозволяє просто ігнорувати, коли гравці використовують команду /tick freeze.
На практиці ви повинні використовувати gameTimeDeltaPartialTick лише тоді, коли ваші анімації залежать від тактів Minecraft. Для анімації на основі часу використовуйте Util.getMillis(), який вимірює реальний час.
У цьому прикладі ми використаємо Util.getMillis() для лінійної інтерполяції кольору квадрата, який рендериться на HUD.
java
public class HudRenderingEntrypoint implements ClientModInitializer {
@Override
public void onInitializeClient() {
// Attach our rendering code to before the chat hud layer. Our layer will render right before the chat. The API will take care of z spacing.
HudElementRegistry.attachElementBefore(VanillaHudElements.CHAT, Identifier.fromNamespaceAndPath(ExampleMod.MOD_ID, "before_chat"), HudRenderingEntrypoint::render);
}
private static void render(GuiGraphics graphics, DeltaTracker tickCounter) {
int color = 0xFFFF0000; // Red
int targetColor = 0xFF00FF00; // Green
// You can use the Util.getMillis() function to get the current time in milliseconds.
// Divide by 1000 to get seconds.
double currentTime = Util.getMillis() / 1000.0;
// "lerp" simply means "linear interpolation", which is a fancy way of saying "blend".
float lerpedAmount = Mth.abs(Mth.sin((float) currentTime));
int lerpedColor = ARGB.linearLerp(lerpedAmount, color, targetColor);
// Draw a square with the lerped color.
// x1, x2, y1, y2, color
graphics.fill(0, 0, 10, 10, lerpedColor);
}
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

Чому б вам не спробувати використати gameTimeDeltaPartialTick і подивитися, що відбувається з анімацією, коли ви виконуєте команду /tick freeze? Ви повинні побачити зависання анімації, коли gameTimeDeltaPartialTick стане постійним (припустимо, що ви передали false як параметр для DeltaTracker#getGameTimeDeltaPartialTick)


