Промальовування у HUD
Ми вже коротко торкалися рендера речей у HUD на сторінці основних концепцій рендера і використання малювання в GUI, тому на цій сторінці ми будемо дотримуватись API Hud і параметра DeltaTracker.
HudElementRegistry
Fabric надає API Hud для рендера та накладення елементів на HUD.
Для початку нам потрібно зареєструвати слухача HudLayerRegistrationCallback, який реєструє ваші елементи. Кожен елемент є HudElement. Екземпляр HudElement — це зазвичай лямбда, яка приймає екземпляри GuiGraphicsExtractor і DeltaTracker як параметри. Перегляньте HudElementRegistry та пов’язані Javadocs, щоб дізнатися більше про те, як використовувати API.
Графіку GUI можна використовувати для доступу до різноманітних утиліт рендера, які надає гра, і доступу до стека необроблених матриць. Щоб дізнатися більше про них, перегляньте сторінку малювання в GUI.
Дельта-трекер
Клас 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::extract);
}
private static void extract(GuiGraphicsExtractor 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

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


